|
將證書籤名請求文件保存到磁盤上,此處將該文件保存爲「Push。cerSigningRequest」。java
在上圖所示頁面中,能夠看到在「iOS Apps」欄目下包含了Certificates、Identifiers、Device、ProvisioningProfiles-----這些只有登陸帳號已經加入iOS Developer Program(iDP)的緣由。ios |
上圖列出了該開發者帳號當前擁有的全部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徹底相同。app
|
接下來經過修改應用程序委託類來註冊遠程Push通知,並重寫對應的方法來處理遠程Push通知.ide
|
|
經過上面介紹不難看出,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服務端程序須要包含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類文件。 */ |