一步一步實現iOS應用PUSH功能

來源:互聯網
上載者:User

原文來自:http://tanqisen.github.io/blog/2013/02/27/ios-push-apns/

1. push原理

iOS push 工作機制可以用下圖簡要概括

Provider:應用自己的伺服器; APNS:Apple Push Notification Service的簡稱,蘋果的PUSH伺服器;

push的主要工作流程是: iOS裝置串連網路後,會自動與APNS保持類似TCP的長連結,等待APNS推送訊息的到來; 應用啟動時註冊訊息推送,並擷取裝置的在APNS中註冊的唯一裝置標示deviceToken上傳給應用伺服器(即Provider); 在需要給應用推送訊息時,Provider把push內容、接收push訊息的deviceToken按APNS指定的格式打包好,發送給APNS; APNS收到Provider發送的訊息後,尋找deviceToken指定的裝置,如果該裝置已經和APNS建立了串連,則立即將訊息推送給該裝置,如果裝置不線上,則在該裝置下次串連到APNS後將訊息推送到裝置。請注意蘋果並不保證推送一定成功; 裝置收到push訊息後,iOS系統會根據SSL認證判斷這個push訊息是發給那個應用的,進而啟動相應用戶端。

上述過程中,有兩個關鍵步驟需要自己處理的是:1.用戶端擷取deviceToken,並上傳到Provider;2.Provider發送push訊息到APNS。這兩個步驟中都需要蘋果的push認證授權,下面就來介紹如何產生push認證,以及Provisioning Profile。 2. push認證及Provisioning Profile產生

用付費帳號登入到http://developer.apple.com/iphone/index.action

產生push認證前要先產生開發認證

產生開發認證的過程不詳細介紹,可以參考如何聯機調試和發布程式。只是有一點需要注意的,產生開發認證過程中需要通過Keychain產生一個CSR檔案,預設名為CertificateSigningRequest.certSigningRequest,這個檔案將在產生push認證的時候用到。

建立一個App ID 建立過程中Description可以任意填寫,比如叫push_demo; Bundle Identifier一般用com.company.appname這樣的格式,例如com.mycompany.demo;

注意:要用push功能的Bundle Identifier一定不能出現萬用字元,比如com.mycompany.*,這樣的名字是不能使用push的。

產生Push SSL Certificate

產生好App ID後點擊Configure進入配置頁。開啟Enable for Apple Push Notification service選項,該選項下有Development Push SSL Certificate和Production Push SSL Certificate兩個SSL Certificate可以配置,前面一個是用來的開發的push認證,後面一個是用來發布的。我們以開發push認證為例,點擊Development Push SSL Certificate->Configure,後面會要求選擇CSR檔案,這就是產生開發認證時的CertificateSigningRequest.certSigningRequest檔案,選擇好CSR後就產生好相應的SSL Certificate了。下載下來,儲存名為aps_developer.cer。

從Keychain中匯出私密金鑰、設定好密碼,命名為private_key.p12

產生push認證

這時我們一共得到3個檔案: CertificateSigningRequest.certSigningRequest private_key.p12 aps_developer.cer

將aps_developer.cer轉成pem格式

 
openssl x509 -in aps_developer.cer -inform DER -out aps_developer.pem -outform PEM 

將private_key.p12格式的私密金鑰轉換成private_key.pem

openssl pkcs12 -nocerts -out private_key.pem -in private_key.p12

這一步會要求輸入p12私密金鑰的密碼,以及設定新產生的pem的密碼。

建立用於服務端的SSL p12格式認證,命名為aps_developer.p12

openssl pkcs12 -export -in aps_developer.pem -inkey private_key.pem -certfile CertificateSigningRequest.certSigningRequest -name "aps_developer" -out aps_developer.p12

這一步會要求輸入private_key.pem的密碼,注意不是private_key.p12的密碼。如果密碼錯誤,或者CertificateSigningRequest.certSigningRequest檔案不匹配都不能正常產生aps_developer.p12檔案,如果產生的aps_developer.p12檔案大小是0,說明產生過程中出了問題,請檢查pem私密金鑰、密碼、以及CertificateSigningRequest.certSigningRequest是否正確。

aps_developer.p12就是Provider向APNS發送push訊息需要的SSL認證。把這個認證和密碼提供給服務端,服務端就可以發送push訊息給APNS了。這時服務端已經可以工作了,但用戶端還必須配置相應的Provisioning Profile才能啟動應用的push功能。

伺服器配置需注意的是,由於我們產生的是開發環境的push認證,所以伺服器應該串連APNS的sandbox環境地址:gateway.sandbox.push.apple.com:2195,如果應用正式發布,就要串連正式環境,必鬚生成相應的發布認證,並串連APNS正式環境地址:gateway.push.apple.com:2195。

產生Provisioning Profile 建立Profile,命名為push_dev; 選擇相應認證; App ID選擇push_demo; 選擇裝置; 下載並安裝該Profile供開發使用; 3. Xcode認證設定、Info.plist設定 用Xcode開啟用戶端工程,設定Info.plist的Bundle identifier為com.mycompany.demo。 開啟工程設定,必須將認證設定為與push_dev關聯的認證。 4. 用戶端擷取deviceToken

服務端要發送push訊息給某一裝置還必須知道該裝置的deviceToken。應用運行後擷取到deviceToken,然後上傳給伺服器,下面介紹應用如何擷取deviceToken。應用必須先註冊使用push功能。

  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {      [[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeBadge)];      // do something      // ...  }
在AppDelegate中添加下面方法來擷取deviceToken:

  - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {      NSString *token = [NSString stringWithFormat:@"%@", deviceToken];      NSLog(@"%@", token);  }  - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {      NSLog(@"%@", error);  }

應用擷取到deviceToken後,上傳給Provider,Provider就可以用這個deviceToken給這個裝置push訊息了。 5. Payload格式及自訂資料

伺服器配置好認證並拿到deviceToken後就可以向APNS發送訊息了。發送訊息的格式如下圖所示:

Payload就是push的訊息負載,這就是應用需要關心的資料。 Payload是一個JSON字典,最大值是 256 位元組,超過這個限制,APNS將拒絕轉寄。基本格式如下:

  {    "aps": {      "alert":"Hello Push!",      "badge":1,      "sound":"default"    }  }

必須包含aps索引值。badge表示應用程式圖示顯示的數字,sound表示收到push的提示音。 Payload的具體結構參考Apple Push Notification Service

要在這個結構中新增自訂資料,請加在aps空間之外。比如後台推送訊息給應用同時要求應用開啟某個頁面:

  {    "aps": {      "alert":"Hello Push!",      "badge":1,      "sound":"default"    },    "page":"home"  }

後台告訴用戶端收到這個push後開啟應用的首頁,這裡的page、home都是自己定義的。必須注意的是,Payload大小不能超過限制,所以可以把自訂資料更簡化點,比如可以把home與編號1對應,page簡寫為p,這樣"p":1表示開啟首頁,可以縮小Payload的大小。 6. 用戶端接收push訊息

iOS系統收到push訊息後,如果使用者點擊查看,系統將根據認證啟動相應應用。如果應用已經啟動,將調用AppDelegate的方法:

1234
  - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {      // userInfo 就是push訊息的Payload  }

如果應用還沒有啟動,通過push冷啟動後,仍然能在啟動後擷取Payload:

12345
  - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {      NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];      NSLog(@"Payload: %@", userInfo);  }

目前為止,push功能基本就完成了,可以開始push功能測試了,如果伺服器還沒開發完成,或者想快速測試是否能正常push,可以使用下面的代碼實現後台push測試。發送push前要配置好SSL認證,以及deviceToken和Payload結構。

object c 版本
c 版本
java 版本
php 版本

還有個小問題,當Payload設定了badge,應用表徵圖上將一直顯示一個數字提示,如果要清除數字提示,或者設定成其他數字,調用下面函數就可以完成。

12
  [[UIApplication sharedApplication] setApplicationIconBadgeNumber:number];

number為0就會清除數字提示。


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.