若是讀者已經知道push的基本知識,本文僅僅是解決一些適配,兼容問題。若是對push 不甚瞭解,參考如下的文章app
1.【iOS push全方位解析】(一) push的概述
2.【iOS push全方位解析】(二) 生成push證書,生成Provisioning Profile
post
3. 【iOS push全方位解析】(三)一個極簡的demo。並測試一下pushfetch
4. 給iOS程序加入push代碼
spa
======================正文=======================.net
client需要處理三中狀況:blog
1. client在前臺。通常是彈窗
● iOS6 的-(void) application: didReceiveRemoteNotification:被調用
● iOS7 的-(void) application: didReceiveRemoteNotification: fetchCompletionHandler:被調用
因此,爲了兼容iOS6.一般的作法是,在-(void) application: didReceiveRemoteNotification: fetchCompletionHandler:中調用-(void) application: didReceiveRemoteNotification: 方法。
● push處理模塊,推斷一下程序是不是活躍 [UIApplication sharedApplication].applicationState == UIApplicationStateActive。接口
進而推斷是否需要彈出對話框。
get
2. client在後臺。但是還活着
大體原理同第一條,注意處理是否彈框。
3. client被殺死的狀態。進來push消息。滑動(點擊)push消息調起client。
● 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正好是被殺死狀態,且若是啓動後有啓動圖。it
這中push拉起APP後是直接處理push的,不彈框。
【解決】首先想到的方法是:暫存這個push消息。而後等啓動圖完了再展現push內容。注意,等到啓動圖完畢,再使用push模塊
[UIApplication sharedApplication].applicationState == UIApplicationStateActive就很差用了。因爲此時APP應該是活躍的了,就需要彈框了。io
因此。需要push模塊支持一個強制不彈框的接口。