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類檔案。 */ |