推 送 機 制(下)單擊”從證書頒發機構請求證書”後,將會顯示下圖所示的對話框輸入電子郵件地址和常用名稱,並選中“存儲到磁碟”單選鈕,然後單擊“繼續”按鈕,該程式將會創建一個“Certificate Signing Request”(證書簽名請求)文件,系統彈出下圖所示的保存文件對話框將證書簽名請求...
推 送 機 制(下)
|
將證書簽名請求文件保存到磁碟上,此處將該文件保存為“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)。 |
接下來還需要將兩個文件合併為一個文件,請按如下步驟進行:
上面命令的作用是將aps_development.cer證書文件轉換為PEM格式的證書文件,該命令將會生成一個PushCert.pem文件.
上面命令的作用是將Push.p12私鑰文件轉換為PEM格式的私鑰文件,該命令將會生成一個PushKey.pem文件。 運行上面命令一共會提示輸入3次密碼:第1次輸入Push.p12私鑰文件的密碼(也就是我們在“為Push輸入密碼”圖片中輸入的密碼),只有輸入該密碼才可讓openssl命令讀取該Push.p12私鑰文件的內容;第2次輸入的密碼將會作為PushKey.pem文件的密碼;第3次輸入的密碼用於確認第2次輸入的密碼-----此處依然輸入”user”.
上面命令的作用是將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.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();
|
上面程式中的第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類文件。 */ |