### 簡介
在iOS設備安裝APP后,通常都會詢問是否允許發送通知(下圖),同意后,一般情況下用戶都會收到某APP的push。比如,用戶收到一條微博,他們喜歡的球隊贏了比賽,或者他們的晚飯準備好了,既然APP不在運行,所以APP不能檢查這些事件。? ? 幸運的是Apple針對這些問題提供了解決方案。開發者可以寫一個服務端的組建,替代客戶端不停的檢測或者在后臺工作。

### Push的原理
push 消息走的APNs服務器,設備和APNs(Apple Push Notification Service)服務器之間建立了一個安全通道。關于push的原理,如下圖,[詳細看這里](http://blog.csdn.net/hherima/article/details/45583787)

把圖片翻譯一下就是:
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。設備不顯示,也不響鈴,[點擊了解更多](http://blog.csdn.net/hherima/article/details/50469519)
iOS8 支持push的[更多交互](http://www.cocoachina.com/ios/20150112/10901.html)(比如快速回復、刪除單個push等)
開發人員的接口的變化
~~~
/* 下面幾個是iOS6/7/8上的接口,統一在- (void)application:didReceiveRemoteNotification:中處理*/
- (void)application:didReceiveRemoteNotification://iOS6
- (void)application:didReceiveRemoteNotification:fetchCompletionHandler://iOS7,iOS8
- (void)application:handleActionWithIdentifier:forRemoteNotification:completionHandler://iOS8
~~~
如果不做處理,iOS7上可以會遇到push重復的問題,解決辦法[點這里](http://blog.csdn.net/hherima/article/details/47133171)
### 開發過程中,程序員如何測試push
這里有php開發的一短代碼(拷貝到文件以php后綴名)。需要你生成證書和provisionfile。這樣可以用本機給iOS APP發送push了。里面用的的ck.pem需要自己生成。
[點擊這里下載](http://blog.csdn.net/hherima/article/details/50470409)
### Push需要注意的地方
● 自己Server發的每一條Push,客戶端都會收到么?答案是否定的,Push是不可靠的,push通知是fire-and-forget,比如手機關機,那么自然就收不到,雖然Apple會嘗試幾次。
●?iOS8發的時間點起,無論那個iOS系統,push消息的body大小調整為2k,注意這里是iOS8的時間點,也就是2014年秋,就目前來說push的限制應該是2k不再是256了
● 測試Push的時候,區分好Appstore證書和開發證書。兩者不能相互發Push