iOS-----推送機制(下)

推 送 機 制(下)

  1. 單擊」從證書頒發機構請求證書」後,將會顯示下圖所示的對話框
  2. 輸入電子郵件地址和經常使用名稱,並選中「存儲到磁盤」單選鈕,而後單擊「繼續」按鈕,該程序將會建立一個「Certificate Signing Request」(證書籤名請求)文件,系統彈出下圖所示的保存文件對話框

 

將證書籤名請求文件保存到磁盤上,此處將該文件保存爲「Push。cerSigningRequest」。java

  1. 使用瀏覽器打開 https://developer.apple.com/ios/manage/overview/index.action站點, 頁面上將會提示用戶輸入開發者帳號\密碼. 登陸成功後會看到以下說是的頁面

 

在上圖所示頁面中,能夠看到在「iOS Apps」欄目下包含了Certificates、Identifiers、Device、ProvisioningProfiles-----這些只有登陸帳號已經加入iOS Developer Program(iDP)的緣由。ios

  1. 單擊「iOS Apps」 →「Identifiers」→欄目下的」App IDS」 連接,系統將會顯示以下圖

 

上圖列出了該開發者帳號當前擁有的全部App ID。數據庫

  1. 單擊頁面右上角的「 +」按鈕(添加App ID),系統打開以下圖所示的頁面

 

App ID的描述字符串能夠隨便填,但該App ID的惟一標識必需要記住,一般採用「公司域名+應用名」的格式編程

  1. 單擊剛剛註冊的App ID,能夠看到該App ID支持的各類服務,以下圖所示

 

  1. 從上圖所示頁面能夠看出,該App ID並不支持Push Notification(推送通知)和iCloud服務。單擊「Edit」按鈕,進入編輯該App ID的頁面以下圖所示

 

  1. 勾選Push Notification右邊的複選框-----這會啓用該App ID的Push通知功能。勾選該複選框以後,Push Notifications下面的兩個「Create Certificate…」按鈕將會變成可用狀態,其中第1個按鈕用於建立開發階段的證書,第2個按鈕用於建立產品化階段的證書。此處只須要建立開發階段的證書,當須要正式發佈該iOS應用時,須要建立產品化階段的證書。
  2. 單擊第1個「Create Certificate…」按鈕,系統將會顯示一個提示頁面,告訴用戶去建立一個CSR文件-----也就是前面咱們已經建立的「Certificate Signing Request」文件。因爲咱們已將建立了該文件,所以直接單擊「Continue」按鈕,系統顯示以下圖所示的頁面
 
  1. 單擊「Choose File」按鈕選擇前面建立的Push.certSigningRequest文件,而後單擊」Generate」按鈕,系統將會爲該App ID生成開發證書。成功生成開發證書以後,能夠看到以下圖所示的頁面

 

  1. 成功生成App ID的開發證書以後,便可經過該頁面中的「Download」按鈕下載證書,也可返回系統證書列表頁面去下載證書。此處先將該證書下載並保存到本地磁盤,該證書的文件名爲「app_development.cer」
  2. 雙擊上一步下載獲得的app_development.cer文件,OS X系統將會自動打開「鑰匙串訪問」應用程序,並將該證書添加到系統中。此時將能夠在「鑰匙串訪問」應用程序中看到以下圖所示的一行。

 

  1. 單擊上上圖所示頁面中的「Done」按鈕,系統返回證書列表頁面,以下圖所示

 

經過證書列表頁面也能夠下載指定的證書(只要點擊指定的證書,頁面就會顯示「Revoke」、「Download」兩個按鈕,其中「Revoke」按鈕用於刪除證書,「Download」按鈕用於下載證書)。瀏覽器

通過上面步驟,咱們已經成功爲Push客戶端建立了一個支持Push通知的App ID,並下載、安裝了該App ID的開發證書服務器

如今開始開發Push‘客戶端應用。新建一個Single View Application, 該應用的」Bundle  Identifier」必須與前面註冊的App ID徹底相同.以下圖所示是新建應用對話框.網絡

該對話框的填寫很是關鍵,各位務必保證該用用的「Bundle Identifier」與前面註冊的App ID徹底相同。app

 

接下來經過修改應用程序委託類來註冊遠程Push通知,並重寫對應的方法來處理遠程Push通知.ide

 

 

經過上面介紹不難看出,iOS應用處理遠程通知比較簡單。測試

  1. 在應用程序委託類的application:didFinishLaunchingWithOptions:方法中調用UIApplication的registerForRemoteNotificationTypes:註冊遠程Push通知。
  2. 重寫應用程序委託類的如上3個方法

該示例的應用程序委託類實現部分代碼

AppDelegate.m

- (BOOL)application: (UIApplication*) application 
 didFinishLauchingWithOptions: (NSDictionary*)LaunchingOptions

{

     // 註冊遠程推送通知 
     [[UIApplication  shareApplication]  registerForRemoteNotificationTypes: 
     UIRemoteNotificationTypeBadge |      UIRemoteNotificationTypeSound  
| UIRemoteNotificationTypeAlert ]; 
     return YES;  //

}

- (void)application: (UIApplication *) application 
 didRegisterForRemoteNotificationsWithDeviceToken: (NSData*)pToken 
{

        NSLog(@」註冊成功:  %@」,  pToken);

        // 註冊成功,應該將該device  token發送給Push服務端程序 
        //  Push服務端程序應該將該token保存到數據庫中, 以備之後重複使用

}

- (void)application: (UIApplication*)application  didFailToRegisterForRemoteNotifications 
WithError: (NSError*) error

{

          NSLog(@」註冊失敗:  %@」,  error);

}

- (void)application: (UIApplication*)application didReceiveRemoteNotification: (NSDictionary*) userInfo 
{

     // 處理推送消息

     UIAlertView* alert = [[UIAlertView  alloc]  initWithTitle:@」 通 知 」 
message:@」個人消息」  delegate:self  cancelButtonTitle:@」取消 」 
otherButtontitles: nil]; 
       [alert  show]; 
       NSLog(@」%@」,  userInfo);

}

…

@end

 

  上面程序的第1行代碼註冊了遠程Push通知,接下來程序實現了UIApplicationDelegate協議中與遠程推送通知相關的3個方法-----註冊Push通知成功、失敗時激發的方法,以及收到遠程Push通知時激發的方法

   遠程推送通知的應用必須在真機上測試,並且客戶端應用還須要Provisioning  Profile,這個東西也必須經過Apple網站建立、下載。爲遠程推送通知應用建立、下載Provisioning Profile請按以下步驟進行。

  1. 將真機接入電腦
  2. 再次登陸 https://developer.apple.com/ios/manage/overview/index.action 站點,單擊」Provisioning  Profiles」連接, 此時看到以下圖所示的頁面.

 

其中第1個Provisioning Profile是測試其餘普通程序的Provisioning Profile,因爲其餘程序所謂App ID可支持通配符, 所以只要一個Provisioning Profile便可。但遠程推送通知應用的App ID不能使用通配符,所以此處必須從新建立一個Provisioning Profile。

  1. 單擊頁面右上角的「 +」按鈕,系統將會顯示以下圖所示的頁面。

 

  1. 讓用戶選擇Provisioning Profile的類型,此處支持建立開發階段的Provisioning Profile,所以選中「Development」 分類下的「iOS App Development」單選鈕。而後單擊頁面下方的「Continue」按鈕,系統將會顯示以下圖所示的頁面。

 

  1. 讓用戶選擇須要爲哪一個應用建立Provisioning Profile,此處選擇前面剛剛建立的org.crazyit.PushTest應用。而後單擊頁面下方的」Continue」按鈕,系統將會顯示下圖所示的頁面

 

  1. 爲Provisioning Profile選擇證書,咱們可根據須要選擇相應的證書,此處咱們直接勾選「Selector  All」複選框來選擇兩個證書。而後單擊頁面下方的「Continue」按鈕,系統將會顯示以下圖所示的頁面。
  2. 爲Provisioning Profile 選擇調試手機,咱們可根據須要選擇相應的調試手機,此處咱們勾選「yeeku的iPhone」------這是個人調試手機,而後單擊頁面下方的「Continue」按鈕,系統將會顯示以下圖所示的頁面

 

 

  1. 爲Provisioning Profile輸入名稱,而後單擊頁面下方的「Generate」按鈕,喜用將會爲咱們選中的iOS應用生成Provisioning Profile,將能夠看到以下圖所示的頁面
  2. 單擊「Download」按鈕,系統將會把剛剛建立的Provisioning Profile下載到本地磁盤。僅保存到磁盤上將會獲得一個PushTest.mobileprovision文件(該文件的擴展名是.mobileprovision, 但主文件名就是咱們在上圖中輸入的名稱)。
  3. 單擊本地磁盤上的PushTest.mobileprovision文件,OS X系統將會自動把該Provisioning Profile添加到對應的調試手機上。若是打開Xcode 的Organizer窗口(在Xcode中按「command+shift+2」快捷鍵便可),而後在該窗口的左邊選中對應調試手機下面的Provisioning Profiles項,將能夠看到以下圖所示的界面。

 

  1. 在「查看調試手機」圖片中能夠看到兩個Provisioning Profile,其中第1個Provisioning Profile就是剛剛建立並添加的Provisioning Profile;第2個Provisioning Profile是調試其餘普通程序的Provisioning Profile,該Provisioning Profile對應的App Identifier使用了通配符,所以適用於其餘全部的普通應用。
  2. 通過上面步驟,咱們已經爲該遠程推送應用準備了Provisioning Profile,接下來在Xcode中設置此Provisioning Profile便可。經過Xcode打開以下圖所示界面,並按圖所示的提示設置Provisioning Profile。

 

編譯運行該應用(在真機上運行該應用),將能夠看到以下圖所示的提示框。

 

用戶單擊「好」按鈕,將能夠在Xcode的底部看到以下圖所示的輸出

 

此處iOS應用成功註冊了遠程推送通知,APNs返回了該設備的device token.在實際應用中, iOS應用應該經過網絡將該device token發送給Push服務端程序, 此處咱們爲了簡化編程就不增長網絡傳輸的代理代碼了,而是直接將該device token複製到Push服務端程序.

 

開發Push服務端程序

Push服務端程序須要包含SSL鏈接證書和私鑰。所以在開發Push服務端程序以前,須要先將它們準備好。

導入遠程推送通知應用的私鑰

  1. 打開OS X系統上的「鑰匙串訪問」應用,在該應用中找到名爲「Push」的專用密鑰----這就是私鑰。而後右擊該項,在彈出的快捷菜單單擊「導出Push」菜單項,以下圖所示

 

 此處之因此列有名爲「Push」的公用密鑰和專用密鑰,是由於前面開發iOS客戶端應用時使用證書助理建立了名字爲Push的Certificate Signing Request文件,若是以前沒有建立該Certificate Signing Request文件,或建立Certificate Signing Request時指定的名稱不一樣,那麼此處將不會顯示名爲「Push」的公用密鑰和專用密鑰。

  1. 單擊「導出Push」菜單項後,將會開始導出Push私鑰,系統顯示以下圖所示的對話框。

 

  1. 爲導出的Push私鑰指定文件名(一般無須修改,直接就命名爲Push.p12便可),並將該導出文件保存在本地磁盤的指定路徑下。而後單擊「存儲」按鈕,系統將會顯示以下圖所示的密碼輸入框----此處輸入的密碼就是該私鑰文件的密碼。

 

  1. 爲Push私鑰輸入密碼(此處輸入user)後,單擊「好」按鈕,便可成功導出Push私鑰。

此時咱們已經獲得了Push服務端程序所須要的私鑰和SSL鏈接證書(前面開發推送通知客戶端時已經從Apple網站下載過開發證書,當時保存的開發證書名爲aps_development.ver)。

接下來還須要將兩個文件合併爲一個文件,請按以下步驟進行:

  1. 進入app_development.cer文件所在的路徑,執行以下命令:
  • opensel x509 –in aps_development.cer – inform der – out PushCert.pem – outform PEM  // ①

上面命令的做用是將aps_development.cer證書文件轉換爲PEM格式的證書文件,該命令將會生成一個PushCert.pem文件.

  1. 進入Push.p12文件所在的路徑,執行以下命令:
  • opensel pkcs12 –nocerts – in Push.p12 – out PushKey.pem  // ②

上面命令的做用是將Push.p12私鑰文件轉換爲PEM格式的私鑰文件,該命令將會生成一個PushKey.pem文件。

運行上面命令一共會提示輸入3次密碼:第1次輸入Push.p12私鑰文件的密碼(也就是咱們在「爲Push輸入密碼」圖片中輸入的密碼),只有輸入該密碼纔可以讓openssl命令讀取該Push.p12私鑰文件的內容;第2次輸入的密碼將會做爲PushKey.pem文件的密碼;第3次輸入的密碼用於確認第2次輸入的密碼-----此處依然輸入」user」.

  1. 進入PushCert.pem、PushKey.pem文件所在的路徑,執行以下命令:
  • openssl pkcs12 –export –in PushCert.pem –inkey PushKey.pem –out aps_developer_identity.p12 // ③

上面命令的做用是將PushCert.pem、PushKey.pem 合併爲一個aps_developer_identity.p12

     運行上面命令一共會提示輸入3次密碼:第1次輸入PushKey.pem文件的密碼(也就是咱們在第2 步中爲PushKey.pem文件輸入的密碼),只有輸入該密碼纔可以讓openssl命令讀取該PushKey.pem文件的內容;第2次輸入的密碼將會做爲aps_developer_identity.p12文件的密碼;第3次輸入的密碼用於確認第 2次輸入的密碼-----此處依然輸入「user」。

 整個運行過程以下圖所示

 

 Java領域有一個JavaPNS開源項目用於開發Apple Push Notification Service Provider,藉助於該項目便可很是方便地開發遠程推送通知的服務端程序。下載和安裝JavaPNS的步驟以下:

  1. 登陸該項目的官網:http://code.google.com/p/javapns/,選擇頁面上的「Downloads」標籤頁。此標籤頁中包含3個下載項。

        JavaPNS_2.2.jar:  該選項只是下載JavaPNS項目的核心JAR包.

        JavaPNS_2.2_javadoc.zip: 該選項只是下載JavaPNS項目的API文檔

        JavaPNS_2.2_complete.zip: 該選項下載JavaPNS的完整壓縮包,包括JavaPNS的核心JAR包、API文檔和示例。

  1. 下載JavaPNS_2.2_complete.zip壓縮包,解壓該壓縮包便可獲得以下文件結構。

        doc:該文件夾下包含JavaPNS項目的各類文檔。

        lib:該文件下包含bcprov-jdk15-146.jar、log4j-1.2.15.jar兩個JAR包。這兩個JAR包是

JavaPNS所依賴的JAR包。

        src:該文件夾下包含JavaPNS項目的源代碼。

        JavaPNS_2.2.jar:這是JavaPNS項目的核心JAR包。

  1. 將JavaPNS解壓路徑下的JavaPNS_2.2.jar、bcprov-jdk15-146.jar、log4j-1.2.15.jar這3個JAR包添加到系統的類加載路徑中便可完成JavaPNS的安裝。
以下編寫簡單的Java源文件,便可實現遠程推送通知的服務端程序

PushSever.java

import  javapns.Push;

import  javapns.notification.PushNotificationPayload;

public  class  PushServer

{
     public static  void  main (String[]  args)
     {

         // 向執行設備發送Push通知的device token

           // 不一樣設備的device token應該由iOS應用經過網絡發送給服務端程序

         //  服務端程序應該將這些device  token保存在服務器中

         //  而後經過循環向每一個device  token發送Push通知

         String deviceToken = 「60c70bb185cd50edfaa430」; //

         try

         {

             // 建立PushNotificationPayload 
                   PushNotificationPayload  payload = new PushNotificationPayload(); 

// 設置推送消息體 payload.addCustomAlertBody(「推送通知\n happy new year。\n」 + 「2016年順順利利,平平安安」); // 設置應用程序圖標的小紅圈中的數值 payload.addBadg(2); // 設置推送通知的提示聲音 payload.addSound(「default」); // 發送推送通知 Push.payload(payload, 「../aps_developer_identity.p12」, // 指定包含證書和私鑰的文件 「user」, // 設置aps_developer_identity.p12文件的導出密碼 false, // 是否爲產品化階段 deviceToken ); // } catch(Exception e) { e.printStackTrace(); } } }

 

上面程序中的第1行紅色字代碼就是指定iOS設備的device token----在實際應用中, 該device token應該由iOS客戶端經過網絡發送給服務端程序,此處爲了簡單起見,咱們直接將iOS設備的device token複製、粘貼到此處。

上面程序中的第2段紅色字代碼使用了Push類的payload()類方法來發送遠程推送通知,發送推送通知指定了包含證書和私鑰的文件、aps_developer_identity.p12文件的導出密碼。

將JavaPNS解壓路徑中包含的JavaPNS_2.2.jar、bcprov-jdk15-146.jar、log4j-1.2.15.jar複製到該Java源文件的同一路徑下,而後使用以下命令來編譯該Java源文件:

java –encoding utf-8 –cp JavaPNS_2.2.jar PushServer.java  // ①

上面命令用於編譯PushServer.java文件,該命令使用了-cp選項將JavaPNS_2.2.jar臨時添加到類加載路徑中.

使用以下命令運行PushServer:

java –cp .: JavaPNS_2.2.jar:bcprov-jdk15-146.jar:log4j-1.2.15.jar PushServer  // ②

上面命令用於運行PushServer,並使用了-cp選項將JavaPNS_2.2.jar、bcprov-jdk15-146.jar和log4j-1.2.15.jar臨時添加到類加載路徑中

/*

注意:

   若在UNIX、Linux、OS X系統上執行上面的java命令,-cp選項值中的各JAR包的分隔符爲英文冒號;若是在Windows系統中執行上面的java命令,則應將-cp選項值中的各JAR包的分隔符改成英文分號。並且,不要忘記了-cp選項值開始的一點(.),這個點(.)表明了當前路徑,用於告訴系統在當前路徑下搜索PushServer類文件。

*/

相關文章
相關標籤/搜索