iOS 静默推送实现(推送背景为个推)

总所周知,苹果在iOS7.0后在后台任务上增加了如下新特性:

后台获取(Background Fetch)

推送唤醒(静默推送,Silent Remote Notifications)

后台传输(Background Transfer Service)

由于最近项目需求上的变更,需要应用在退至后台时在某一个时间点唤醒设备更新一下UI,在用户下次点击应用图标进入应用的时候就能看到已经更新好的UI了。所以,研究了一下静默推送,下面我给小伙伴们一一呈现我所实现的整个过程。

首先,在官方文档中找到下面一段关于静默推送的描述:

Configuring a Silent Notification

The aps dictionary can also contain the content-available property. The content-available property with a value of 1 lets the remote notification act as a silent notification. When a silent notification arrives, iOS wakes up your app in the background so that you can get new data from your server or do background information processing. Users aren’t told about the new or changed information that results from a silent notification, but they can find out about it the next time they open your app.

For a silent notification, take care to ensure there is no alert, sound, or badge payload in the aps dictionary. If you don’t follow this guidance, the incorrectly-configured notification might be throttled and not delivered to the app in the background, and instead of being silent is displayed to the user.

说的很明白,要想实现静默推送,首先要在aps这个字典里增加content-available这个属性,并且这个属性的值要设置成1。之前在网上也查了一些资料,都千篇一律的贴着下面这张图:


大部分关于设置静默推送后台推送格式的贴图

可是,参照这张图的意思是,alert里面也是可以有内容的,可是事实上官方文档里的第二段话被好多人忽略了:take care to ensure there is no alert, sound, or badge payload in the aps dictionary。好吧,看来alert里面必须为空才行。本人亲测,alert里面有内容的话就是普通推送,是不能在当应用在后台挂起时唤醒应用的。OK,alert字段确认了,是必须为空的,那么sound呢?由于项目的推送SDK用的是个推,本人跟个推的技术支持交流了一下让服务端在设置sound的时候设成空串:


服务端推送格式

结果,静默推送虽然收到了,但是它是有声音的静默推送,后来个推的技术支持更正了传入的字段:


服务端推送格式

好了,静默推送收到了,整个世界也都清净了。

OK,到这儿,我们可以基本确认静默推送在后台的格式:(a) 增加content-available字段,并设成1 (b) alert字段必须为空,否则收到的就不是静默推送 (c)sound字段设不设不影响静默推送的接收,只不过会出现符不符合需求的问题。对了,还有一个badge属性,设置的话也不影响静默推送的接收,但是和sound一样,看需求是怎样的了。

最后,服务端关于静默推送就设置成了这样:


服务端静默推送代码

而前端收到静默推送时的log是这样的:


静默推送log

最后,总结一下,静默推送只能在应用在前台和应用在后台挂起时收到,也就是说,如果应用未启动或进程被杀掉,静默推送是唤醒不了设备的。应用在后台挂起时,收到静默通知时在appdelegate里实现-application:didReceiveRemoteNotification:fetchCompletionHandle:这个方法,在这个方法里执行想要在系统被唤醒时想做的比如更新UI,请求网络等想做的事。当应用在前台时,网上查资料说还是在这个方法里执行,可是我打断点却不走这个方法,不知道是不是我们的SDK用的是个推的原因,反而会走个推的接收payload的那个方法。

最后,提醒一下小伙伴们,实现静默推送别忘了Xcode这边还要勾选remote notifications选项:


Xcode里capabilities设置

在简书的处女作就是这篇了,感谢小伙伴们捧场,荆轲刺秦王!

转载自 http://www.jianshu.com/p/540378af5abe

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值