假設讀者已經知道push的基本知識,本文只是解決一些適配,兼容問題。如果對push 不甚了解,參考下面的文章
1.【iOS push全方位解析】(一)?[push的概述](http://blog.csdn.net/hherima/article/details/45583787)
2.【iOS push全方位解析】(二)?[生成push證書,生成Provisioning Profile](http://blog.csdn.net/hherima/article/details/45583865)
3.【iOS push全方位解析】(三)[一個極簡的demo,并測試一下push](http://blog.csdn.net/hherima/article/details/45624075)
4.[給iOS程序添加push代碼](http://blog.csdn.net/hherima/article/details/44854373)
======================正文=======================
客戶端需要處理三中情況:
### 1. 客戶端在前臺。通常是彈窗
● iOS6 的-(void) application: didReceiveRemoteNotification:被調用
● iOS7 的-(void) application: didReceiveRemoteNotification: fetchCompletionHandler:被調用
所以,為了兼容iOS6.通常的做法是,在-(void) application: didReceiveRemoteNotification: fetchCompletionHandler:中調用-(void) application: didReceiveRemoteNotification: 方法。
●?push處理模塊,判斷一下程序是否是活躍 [UIApplication sharedApplication].applicationState == UIApplicationStateActive。
進而判斷是否需要彈出對話框。
### 2. 客戶端在后臺,但是還活著
大致原理同第一條,注意處理是否彈框。
### 3. 客戶端被殺死的狀態,進來push消息;滑動(點擊)push消息調起客戶端。
● iOS 6調用 -(void) application: didFinishLaunchingWithOptions:帶有launchDictionary,里面包含了push消息
需要簡單處理一下,獲取真正的內容[launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]
● iOS 7以后調用兩個方法:
-(void) application: didFinishLaunchingWithOptions:
-(void) application: didReceiveRemoteNotification: fetchCompletionHandler:
**這樣就有一個坑。iOS7以上,可能就重復處理同一個push消息了。**
【解決】:由于只有iOS7以上都會調用-(void) application: didReceiveRemoteNotification: fetchCompletionHandler:方法。
那么,為了兼容iOS6:在-(void) application: didFinishLaunchingWithOptions:中只處理iOS6。
4.現在的APP都有一個啟動圖過程。如果push消息過來,APP正好是被殺死狀態,且假設啟動后有啟動圖。
**這中push拉起APP后是直接處理push的,不彈框。**
【解決】首先想到的方法是:暫存這個push消息,然后等啟動圖完了再展示push內容。注意,等到啟動圖完成,再使用push模塊
[UIApplication sharedApplication].applicationState == UIApplicationStateActive就不好用了,因為此時APP應該是活躍的了,就需要彈框了。所以,需要push模塊支持一個強制不彈框的接口。