簡介
在iOS裝置安裝APP後,通常都會詢問是否允許發送通知(下圖),同意後,一般情況下使用者都會收到某APP的push。比如,使用者收到一條微博,他們喜歡的球隊贏了比賽,或者他們的晚飯準備好了,既然APP不在運行,所以APP不能檢查這些事件。 幸運的是Apple針對這些問題提供瞭解決方案。開發人員可以寫一個服務端的組建,替代用戶端不停的檢測或者在後台工作。
Push的原理
push 訊息走的APNs伺服器,裝置和APNs(Apple Push Notification Service)伺服器之間建立了一個安全通道。關於push的原理,如下圖,詳細看這裡
把圖片翻譯一下就是:
1. 用戶端向 APNs註冊一下,並擷取token
2. APN是將token傳給用戶端
3. 用戶端將token發給自己的Server
4. 在合適的時候,自己的Server給APNs發送push訊息。
5. 最終APNs發送給用戶端 iOS Push 在iOS6/7/8/9中的進化
那麼隨著iOS版本的進化,Push互動和功能也在變化
iOS6 (待補充)
iOS7 支援後台push,靜默push。裝置不顯示,也不響鈴,點擊瞭解更多
★ iOS7 app內擷取系統->通知 具體函數是 [[UIApplication sharedApplication] enabledRemoteNotificationTypes]
iOS8 支援push的更多互動(比如快速回複、刪除單個push等)
★ iOS8 發布的時候(從那個時間點起),push的body體可以支援到2k了,以前是256B
★ iOS8 app內擷取系統->通知。具體函數是 [[UIApplication sharedApplication] currentUserNotificationSettings];
開發人員的介面的變化
/* 下面幾個是iOS6/7/8上的介面,統一在- (void)application:didReceiveRemoteNotification:中處理*/ 方法1:- (void)application:didReceiveRemoteNotification://iOS6 方法2: - (void)application:didReceiveRemoteNotification:fetchCompletionHandler://iOS7,iOS8 方法3: - (void)application:handleActionWithIdentifier:forRemoteNotification:completionHandler://iOS8,9
一般應用有三種狀態:
a)應用未啟動;
b)應用已啟動,但處於後台;
c)應用處於前台。
對於以上三種狀態,iOS7,8,9 在收到訊息通知後都會調用方法 2,這也符合官方文檔的描述。
bug 然而對於 iOS 10.0.2,當應用處於 a 或 b 狀態時,調用方法 1,當應用處於 c 狀態時,調用方法 2。
另外:如果不做處理,iOS7上可以會遇到push重複的問題,解決辦法點這裡 開發過程中,程式員如何測試push 這裡有php開發的一短代碼(拷貝到檔案以php尾碼名)。需要你產生認證和provisionfile。這樣可以用本機給iOS APP發送push了。裡面用的的ck.pem需要自己產生。 點擊這裡下載
Push需要注意的地方 ● 自己Server發的每一條Push,用戶端都會收到麼。答案是否定的,
Push是不可靠的,push通知是fire-and-forget,比如手機關機,那麼自然就收不到,雖然Apple會嘗試幾次。 ● iOS8發的時間點起,無論那個iOS系統,push訊息的body大小調整為2k,注意這裡是iOS8的時間點,也就是2014年秋,
就目前來說push的限制應該是2k不再是256了 ● 測試Push的時候,區分好Appstore認證和開發認證。兩者不能相互發Push