iOS6和iOS7处理push不同之处,解决重复push,-(void) application: didReceiveRemoteNotification: fetchCompletionHandl

最后更新于:2022-04-01 20:00:59

假设读者已经知道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模块支持一个强制不弹框的接口。
';