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
======================正文=======================
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的更多相关文章
- 适配iOS6与iOS7
适配屏幕其实很简单,但为了保持兼容性以及写的代码的通用性,以及最小的改动代码,本人按照如下的一种方式来适配,可以一劳永逸. 1. 先定义几个宏,分辨表示应用可以使用区域的高度,屏幕可用区域的高度,屏幕 ...
- ios6和ios7禁止屏幕旋转
ios6和ios7禁止屏幕旋转 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOr ...
- IOS6和IOS7的屏幕适配问题
自从IOS7出来以后,以前写在IOS6上或者更低版本的程序,跑在IOS7的模拟器上就会出现一些问题.最大的问题就是,所有的UI空间都会统一向上移动20个点(如果空间的y值为0,就会被StatusBar ...
- iOS6和iOS7代码的适配(3)——坐标适配
由于iOS7里面status bar和视图是重叠在一起了,所以应用的y坐标就没法和以前一致了,需要重新计算设定.基本上,你的应用用Xcode5运行一下就能看见这个问题,这里写了一个最简单的例子,一个V ...
- iOS6和iOS7代码的适配(1)
苹果的iOS7推出后,对于所有的应用来说都提出了一个天然的需求--适配不同版本的SDK.目前来说,用iOS6的SDK生成的应用,可以在iOS7的系统上跑,UI上也保持了原来的风格样式,这是苹果做的向下 ...
- 如何解决iOS6、iOS7 3.5寸和4.0寸屏的适配问题?不要写两个xib文件
如何解决iOS6.iOS7 3.5寸和4.0寸屏的适配问题?不要写两个xib文件
- 解决xib布局方式支持ios6,ios7
xcode5 中的界面布局 根据sdk 分成ios7.0 and Later 和 ios6.1 and Earlier 两种,那如何xib同时支持 ios6 和ios7 的界面呢 方法如下: 在xco ...
- iOS6和iOS7代码的适配(5)——popOver
popOver这个空间本身是iPad only的,所以iPhone上见不到,我记得微信上有个这样的弹出框,有扫一扫等几个菜单项,估计这是腾讯自己实现的,用于菜单的扩展. popOver从iOS6到iO ...
- 如何解决git====push 过程中出现的。error: failed to push some refs
当我们在利用git push 文件到仓库时出现了一下问题: ! [rejected] master -> master (fetch first)error: failed to push s ...
随机推荐
- Android开发进度05
1,今日:目标:完成后台用户的增删改查 2,昨天:完成登录和注册功能 3,收获:熟练了SQLite操作 4,问题:无
- 使用展开操符作替代 .apply() (prefer-spread)
在ES2015以前,你必须使用Function.prototype.apply()来调用可变函数. var args = [1, 2, 3, 4]; Math.max.apply(Math, args ...
- SM32 USART与USB接收不定数据方法,标准库、HAL库都适用
很多时候,我们使用串口或USB接收数据时,往往不知道PC端会发多长的数据下来, 为了解决这个不定数据接收问题,在此各提供一个解决思路. 串口数据不定接收: 由于STM32单片机带IDLE中断,所以利用 ...
- jquery访问ashx文件示例
转自原文jquery访问ashx文件示例 .ashx 文件用于写web handler的..ashx文件与.aspx文件类似,可以通过它来调用HttpHandler类,它免去了普通.aspx页面的控件 ...
- EditText电话号码格式化输入、删除案例
我们在输入电话号码的时候,一般都会切割一个较长的电话号码.这种话效果会好非常多..对EditText的监听能够轻松的实现这个需求.仅仅须要我们给相应的EditText加一个监听就OK了..贴一下我写的 ...
- UI自动化
1.下载安装JDK,配置环境变量 2.下载eclips,并安装 3.下载jskuli截图工具,并安装 4.下载Jspec插件,将其放在eclipse路径下的\plugins文件夹中.(打开eclips ...
- Swift 3.0 (二)
一:函数 1.1无参数无返回值的简单函数 func sendMessage(){ let message = "Hey, Guys!" print(message) } sendM ...
- 安卓 使用Gradle生成正式签名apk文件
1. 进入app中的build.gradle下面进行配置 2.进入Gradle下面选择clean和assembleRelese,双击 3.生成成功,前往查看 4.加密更安全
- caffe中lenet_solver.prototxt配置文件注解
caffe框架自带的例子mnist里有一个lenet_solver.prototxt文件,这个文件是具体的训练网络的引入文件,定义了CNN网络架构之外的一些基础参数,如总的迭代次数.测试间隔.基础学习 ...
- 88.NODE.JS加密模块CRYPTO常用方法介绍
转自:https://www.jb51.net/article/50668.htm 使用require('crypto')调用加密模块. 加密模块需要底层系统提供OpenSSL的支持.它提供了一种安全 ...