使用pushmebaby測試app的遠程推送功能

什麼是遠程消息推送功能

蘋果給iOS和Mac添加了消息推送的功能,使得咱們能夠經過後臺服務器給應用程序(APP)發送消息,無論APP是否正在使用,好比郵箱的來件提示功能。這項服務被稱爲Apple Push Notification service(APNs)。裏面一共涉及到四個角色:APP、設備、APNs和應用後臺服務器(Provider),其中APP、後臺服務器和APNs之間使用deviceToken惟一的標識一個用戶。php

推送服務的工做流程:html

  1. APP向系統註冊推送服務。
  2. 設備從APNs請求deviceToken。
  3. 經過代理方法將deviceToken返回給APP。
  4. APP將deviceToken發送給應用後臺服務器(Provider)。
  5. 應用後臺服務器保存deviceToken,而後在須要推送通知的時候,給APNs發送信息,使用deviceToken標識所要送達的客戶端。
  6. APNs將後臺服務器發過來的數據推送到設備。
  7. 設備將消息分發給應用程序。

在使用推送功能的時候,須要在開發者中心建立支持Push Notification的證書,而且將證書和私鑰用於應用後臺服務器與APNs之間通訊。ios

環境配置

使用推送服務有一些必要條件:git

  1. 開發者帳號。
  2. iOS真機(iPhone、iPad、iPod)。
  3. 後臺服務器。
  4. 網絡。

爲了使應用支持推送服務,須要配置Provisioning Profile使它支持Push,和普通的Provisioning Profile文件同樣分爲Development和Production兩個版本。咱們使用Development版進行測試。github

接下來建立一個用於應用後臺服務器和APNs服務器通訊時使用的SSL證書和私鑰。小程序

1 .在鑰匙串訪問工具中獲取證書請求文件(CSR)。bash

2 .保存請求文件。服務器

3 .從鑰匙串訪問工具中導出私鑰,將它保存爲PushKey.p12,輸入密碼abcde。千萬別把密碼給忘了哈,等下要用的。網絡

4 .登錄iOS Dev Center建立APP ID和*Provisioning Profile*。app

5 .建立新的App ID時,要注意開啓Push Notification

6 .最後App ID看起來是這樣的。

7 .到這一步,雖然已經開啓了推送服務,可是還須要進一步配置,點擊Setting按鈕進行設置。

8 .滾動到最下面,須要建立SSL證書(Create Certificate),測試環境使用Development SSL Certificate

9 .查看證書建立步驟和說明,上傳第1步獲得的證書請求文件。

10 .下載生成好的證書,命名爲aps_development.cer


到了這裏,咱們有多種選擇繼續了。

1 .使用第三方小工具PushMeBaby模擬應用後臺服務器發送推送信息。

2 .搭建應用後臺服務器發送推送信息。


下面先試一試第一種方法,使用PushMeBaby。這是一個開源的Mac小程序,咱們直接去Github下載源碼,用Xcode打開,將ApplicationDelegate.m中天上deviceToken和證書的位置。

- (id)init { self = [super init]; if(self != nil) { //77e231f0 76257e00 eed93ac6 47b52c78 12bae79f 9c9d1c67 4c990589 36c9a235 ---- 保留空格 self.deviceToken = @""; //推送內容,JSON格式 self.payload = @"{\"aps\":{\"alert\":\"長沙戴維營教育iOS開發培訓最好!\",\"badge\":1}}"; //獲取證書路徑 self.certificate = [[NSBundle mainBundle] pathForResource:@"aps_development" ofType:@"cer"]; } return self; } 

deviceToken的獲取在下面的代碼部分。

必定要記得將剛纔的證書文件添加到項目中,固然也能夠直接將證書路徑賦值給self.certificate。


接下來試一試第二種方法,咱們使用PHP來發送通知(其實運行PHP並不須要另外搭建服務器和下載程序,Mac默認支持PHP運行,不信到命令行運行一下php)。

這種方式相對來講麻煩一些,可是也是實際使用的時候會採起的方式。咱們須要進一步處理私鑰和證書文件。

1 .首先將證書文件和私鑰處理成單個方便使用的pem文件,假設CSR、p12和cer文件都放在桌面上。

$ cd ~/Desktop $ls aps_development.cer CertificateSigningRequest.certSigningRequest PushKey.p12 

2 .將aps_development.cer轉換爲pem文件。

$ openssl x509 -in aps_development.cer -inform der -out PushCert.pem $ ls aps_development.cer CertificateSigningRequest.certSigningRequest PushCert.pem PushKey.p12 

3 .將p12私鑰文件轉換爲pem文件。

$ openssl pkcs12 -nocerts -out PushKey.pem -in PushKey.p12 Enter Import Password: MAC verified OK Enter PEM pass phrase: Verifying - Enter PEM pass phrase: 

4 .將兩個文件合成同一個。

$ cat PushCert.pem PushKey.pem > ck.pem $ ls aps_development.cer CertificateSigningRequest.certSigningRequest ck.pem PushCert.pem PushKey.pem PushKey.p12 

5 .測試證書是否有效。

$ openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushCert.pem -key PushKey.pem 

若是有效的話,會輸出一堆信息,而且創建鏈接,不然不會成功創建鏈接。

6 .使用PHP進行測試,下載SimplePush.php,修改文件並填入deviceToken和密碼。在終端運行該代碼。

$ php simplepush.php Connected to APNS Message successfully delivered 

成功發送推送消息。

代碼實現

有了上面的這些準備工做,iOS端的開發很是簡單,UIApplicaton中有好幾個方法都與推送消息有關,包括本地推送。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //判斷是否註冊了遠程通知 if (![application isRegisteredForRemoteNotifications]) { UIUserNotificationSettings *uns = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeAlert|UIUserNotificationTypeBadge|UIUserNotificationTypeSound) categories:nil]; [application registerUserNotificationSettings:uns]; //註冊遠程通知 [application registerForRemoteNotifications]; } return YES; } //註冊成功,返回deviceToken - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSLog(@"%@", deviceToken); } //註冊失敗 - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { NSLog(@"%@", error); } //接收到推送消息 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo { NSLog(@"remote: %@", userInfo); } 

甚至可使用APNs實現一個聊天工具,具體請查看參考資料(4)。

參考資料

  1. https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html#//apple_ref/doc/uid/TP40008194-CH100-SW9
  2. https://github.com/stefanhafeneger/PushMeBaby
  3. http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1
  4. http://www.raywenderlich.com/32963/apple-push-notification-services-in-ios-6-tutorial-part-2

本文檔由長沙戴維營教育整理。

相關文章
相關標籤/搜索