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

來源:互聯網
上載者:User

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

 

將認證簽章要求檔案儲存到磁碟上,此處將該檔案儲存為“Push。cerSigningRequest”。

 

在所示頁面中,可以看到在“iOS Apps”欄目下包含了Certificates、Identifiers、Device、ProvisioningProfiles-----這些只有登入帳號已經加入iOS Developer Program(iDP)的原因。

 

列出了該開發人員帳號當前擁有的所有App ID。

 

App ID的描述字串可以隨便填,但該App ID的唯一標識必須要記住,通常採用“公司網域名稱+應用程式名稱”的格式

 

 

 

 

 

 

通過認證列表頁面也可以下載指定的認證(只要點擊指定的認證,頁面就會顯示“Revoke”、“Download”兩個按鈕,其中“Revoke”按鈕用於刪除認證,“Download”按鈕用於下載認證)。

經過上面步驟,我們已經成功為Push用戶端建立了一個支援Push通知的App ID,並下載、安裝了該App ID的開發認證

現在開始開發Push‘用戶端應用。建立一個Single View Application, 該應用的”Bundle  Identifier”必須與前面註冊的App ID完全相同.如所示是建立應用對話方塊.

該對話方塊的填寫非常關鍵,各位務必保證該用用的“Bundle Identifier”與前面註冊的App ID完全相同。

 

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

 

 

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

該樣本的應用程式委託類實現部分代碼

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個Provisioning Profile是測試其他普通程式的Provisioning Profile,由於其他程式所謂App ID可支援萬用字元, 因此只要一個Provisioning Profile即可。但遠程推播通知應用的App ID不能使用萬用字元,因此此處必須重新建立一個Provisioning Profile。

 

 

 

 

 

 

 

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

 

使用者單擊“好”按鈕,將可以在Xcode的底部看到如所示的輸出

 

此處iOS應用成功註冊了遠程推播通知,APNs返回了該裝置的device token.在實際應用中, iOS應用應該通過網路將該device token發送給Push服務端程式, 此處我們為了簡化編程就不增加網路傳輸的代理代碼了,而是直接將該device token複製到Push服務端程式.

 

開發Push服務端程式

Push服務端程式需要包含SSL串連認證和私密金鑰。因此在開發Push服務端程式之前,需要先將它們準備好。

匯入遠程推播通知應用的私密金鑰

 

 此處之所以列有名為“Push”的公用密鑰和專用密鑰,是因為前面開發iOS用戶端應用時使用認證助理建立了名字為Push的Certificate Signing Request檔案,如果之前沒有建立該Certificate Signing Request檔案,或建立Certificate Signing Request時指定的名稱不同,那麼此處將不會顯示名為“Push”的公用密鑰和專用密鑰。

 

 

此時我們已經得到了Push服務端程式所需要的私密金鑰和SSL串連認證(前面開發推播通知用戶端時已經從Apple網站下載過開發認證,當時儲存的開發認證名為aps_development.ver)。

接下來還需要將兩個檔案合并為一個檔案,請按如下步驟進行:

  • opensel x509 –in aps_development.cer – inform der – out PushCert.pem – outform PEM  // ①

上面命令的作用是將aps_development.cer認證檔案轉換為PEM格式的認證檔案,該命令將會產生一個PushCert.pem檔案.

  • 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”.

  • 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的步驟如下:

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

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

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

        doc:該檔案夾下包含JavaPNS項目的各種文檔。

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

JavaPNS所依賴的JAR包。

        src:該檔案夾下包含JavaPNS項目的原始碼。

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

如下編寫簡單的Java源檔案,即可實現遠程推播通知的服務端程式PushSever.javaimport  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類檔案。

*/

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.