iOS6和iOS7處理push不同之處,解決反復push,-(void) application: didReceiveRemoteNotification: fetchCompletionHandl
如果讀者已經知道push的基本知識,本文僅僅是解決一些適配,兼容問題。如果對push 不甚了解,參考以下的文章
1.【iOS push全方位解析】(一) push的概述
2.【iOS push全方位解析】(二) 生成push證書,生成Provisioning Profile
3. 【iOS push全方位解析】(三)一個極簡的demo。並測試一下push
4.
給iOS程序加入push代碼
======================正文=======================
client須要處理三中情況:
1. client在前臺。一般是彈窗
● iOS6 的-(void) application: didReceiveRemoteNotification:被調用● iOS7 的-(void) application: didReceiveRemoteNotification: fetchCompletionHandler:被調用
所以,為了兼容iOS6.通常的做法是,在-(void) application: didReceiveRemoteNotification: fetchCompletionHandler:中調用-(void) application: didReceiveRemoteNotification: 方法。
● push處理模塊,推斷一下程序是否是活躍 [UIApplication sharedApplication].applicationState == UIApplicationStateActive。
進而推斷是否須要彈出對話框。
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正好是被殺死狀態,且如果啟動後有啟動圖。
這中push拉起APP後是直接處理push的,不彈框。
【解決】首先想到的方法是:暫存這個push消息。然後等啟動圖完了再展示push內容。註意,等到啟動圖完畢,再使用push模塊
[UIApplication sharedApplication].applicationState == UIApplicationStateActive就不好用了。由於此時APP應該是活躍的了,就須要彈框了。
所以。須要push模塊支持一個強制不彈框的接口。
iOS6和iOS7處理push不同之處,解決反復push,-(void) application: didReceiveRemoteNotification: fetchCompletionHandl