浅谈iOS Push 在iOS6/7/8/9中的进化

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

### 简介 在iOS设备安装APP后,通常都会询问是否允许发送通知(下图),同意后,一般情况下用户都会收到某APP的push。比如,用户收到一条微博,他们喜欢的球队赢了比赛,或者他们的晚饭准备好了,既然APP不在运行,所以APP不能检查这些事件。    幸运的是Apple针对这些问题提供了解决方案。开发者可以写一个服务端的组建,替代客户端不停的检测或者在后台工作。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b1398816.jpg) ### Push的原理 push 消息走的APNs服务器,设备和APNs(Apple Push Notification Service)服务器之间建立了一个安全通道。关于push的原理,如下图,[详细看这里](http://blog.csdn.net/hherima/article/details/45583787) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-03-10_56e11b0f6c94e.jpg) 把图片翻译一下就是: 1. 客户端向 APNs注册一下,并获取token 2. APN是将token传给客户端 3. 客户端将token发给自己的Server 4. 在合适的时候,自己的Server给APNs发送push消息。 5. 最终APNs发送给客户端 ### iOS Push 在iOS6/7/8/9中的进化 那么随着iOS版本的进化,Push交互和功能也在变化 iOS6 (待补充) iOS7 支持后台push,静默push。设备不显示,也不响铃,[点击了解更多](http://blog.csdn.net/hherima/article/details/50469519) iOS8 支持push的[更多交互](http://www.cocoachina.com/ios/20150112/10901.html)(比如快速回复、删除单个push等) 开发人员的接口的变化 ~~~ /* 下面几个是iOS6/7/8上的接口,统一在- (void)application:didReceiveRemoteNotification:中处理*/ - (void)application:didReceiveRemoteNotification://iOS6 - (void)application:didReceiveRemoteNotification:fetchCompletionHandler://iOS7,iOS8 - (void)application:handleActionWithIdentifier:forRemoteNotification:completionHandler://iOS8 ~~~ 如果不做处理,iOS7上可以会遇到push重复的问题,解决办法[点这里](http://blog.csdn.net/hherima/article/details/47133171) ### 开发过程中,程序员如何测试push 这里有php开发的一短代码(拷贝到文件以php后缀名)。需要你生成证书和provisionfile。这样可以用本机给iOS APP发送push了。里面用的的ck.pem需要自己生成。 [点击这里下载](http://blog.csdn.net/hherima/article/details/50470409) ### Push需要注意的地方 ● 自己Server发的每一条Push,客户端都会收到么?答案是否定的,Push是不可靠的,push通知是fire-and-forget,比如手机关机,那么自然就收不到,虽然Apple会尝试几次。 ● iOS8发的时间点起,无论那个iOS系统,push消息的body大小调整为2k,注意这里是iOS8的时间点,也就是2014年秋,就目前来说push的限制应该是2k不再是256了 ● 测试Push的时候,区分好Appstore证书和开发证书。两者不能相互发Push
';