1. 程式人生 > >iOS6和iOS7處理push不同之處,解決反復push,-(void) application: didReceiveRemoteNotification: fetchCompletionHandl

iOS6和iOS7處理push不同之處,解決反復push,-(void) application: didReceiveRemoteNotification: fetchCompletionHandl

前臺 啟動圖 nstat and bsp pro ica 應該 正文

如果讀者已經知道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