件,这里以我司的腾讯新闻为例(有标题,内容,和附件):
26.png
腾讯新闻push
3D touch点入详情以后:
27.png
腾讯新闻push详情
这里我们惊奇的发现,除了可以携带图片这样的附件、push还能展开详情以外,进入详情以后,下面还多了“打开”、“收藏”、“不感兴趣”这些选项,这里就涉及到以下iOS10的新特性。
二、push携带附件
因为payload有大小限制,所以如果remote notification想要携带附件,那么payload上只能带上如附件下载地址之类的信息,等通知到达客户端后由service extension下载附件到本地,然后在初始化UNNotificationAttachment对象时传入附件在本地的URL。
28.png
初始化UNNotificationAttachment对象时,可以传入option参数。这里的option参数可以强制指定附件的类型,可以选择是否展示缩略图,以及缩略图截取自附件的哪一帧、哪一部分。
目前iOS10通知只将几种格式的图片、音频和视频作为附件,附件的大小也有一定限制,具体可以看官方文档中的限制说明。
关于附件的更加详细的说明,可以参考官方文档:
https://developer.apple.com/documentation/usernotifications/unnotificationattachment?language=objc
三、携带action的通知
上面提到的“打开”、“收藏”、“不感兴趣”这些选项其实就是push携带的action,其实从iOS8开始,通知已经可以携带action了。而在iOS10中,通知的action被放在了更明显的位置,与action相关的接口也有了很大变化。
决定一个通知应该有哪些action呢?在payload中,这是由category字段决定的。如果我们希望一个通知能携带若干个action,我们就需要将若干个action和一个category绑定起来。通知到达前端后,系统会根据category的名字来决定要给这个通知展示哪些action:
29.png
怎么得知用户选了哪个action并做出相应操作呢?这需要给UNUserNotificationCenter指定一个delegate:
30.png
然后在delegate的类中实现
31.png
方法:通过response.notification.request.content.categoryIdentifier和response.actionIdentifier就可以得知用户选择的action了。
四、改变push内容
这里主要讲应用的比较多的离线(远程)push的改变push方法
1、改变本地push内容
本地push,只要request的id一样,那么就可以更新推送:
更新的例子:
31.png
32.png
此外,还有删除所有推送等,都在UNUserNotificationCenter.h中实现。
2、改变离线(远程)push内容
目前远程push只支持更新push内容,更新需要通过新的字段apps-collapse-id来作为唯一标示。方法是在HTTP/2 请求头中使用相同的apns-collapse-id,这样收到同样的apns-collapse-id的push时,push内容便会更新。
使用场景:比较容易理解的一个场景就是球赛比分,比如现在是1:0,如果变成1:1的话,只需要刷新原来的新闻,这样用户就不会因为同一场比赛收到多条push。
五、两个extension
有两个与push相关的extension,可能我们会好奇这两个extension有什么不同,为什么需要两个?它们分别实现什么功能呢?
33.png
push相关extension
1、notification service extension
给app添加notification service extension后,系统会在收到通知后唤醒它,并允许它修改通知的内容,之后再展示这个通知。
service extension只对remote notification起作用,local notification是无法唤起它的。
如果想要让系统唤起service extension的话,payload必须符合这样几个条件:
1) 必须增加mutable-content字段并为1,这表示允许客户端修改这个通知:
payload(举例)如下:
34.png
2)这个通知必须展示一个alert,如果只是一个修改badge的通知的话,是不会唤起service extension的
3)静默推送是不能唤起service extension的,所以payload中不能有”content-available” : 1字段
所以,通过这个notification service extension,你可以在接收到推送之后、展示推送之前处理一些事情,比如说更新一下推送内容,或者在后台做一些其他事情。
2、notification content extension
另一项notification content extension用于完全自定义推送展开后的视图。上面腾讯新闻的展开后的视图就是通过这个notification content extension实现的。
依然以腾讯新闻为例子:
35.png
展开界面
这里Notification Content Extension大展拳脚的地方,在这里可以自定义绘制不同的内容,将希望展现给用户的额外信息可以加载这里。
下半部分的notification action的实现就是在上面提到的“携带action的通知”。
测试要点
36.png
Q&A
Q:离线push,支持角标(badge)在本地角标数值上+1这样的操作吗?
A:不支持。如果是自己实现push服务的话,需要自己的后台将角标值badge发送个APNs服务器,有些APP使用第三方push SDK除外。
Q:如果重复收到离线push,可能是什么情况?
A:
1)iOS9之后卸载重装后生成新的deviceToken,后台对多个deviceToken都发送了push
2)后台对注销了的账号也发送了push。
总而言之一般是后台的逻辑出现了问题,而不是APNs服务器出现问题。
Q:直接卸载APP,还能收到离线push吗?
A:不会收到。直接卸载APP,虽然后台不知道APP被卸载了,仍然会对之前的账号发送push,但是由于手机上没有对应APP,所以并不会收到push。
Q:为什么有时候全新安装APP就立马有红点角标?
A:这是因为卸载该APP时有红点角标。每个 APP 的角标都是存在 iOS 手机系统里的,开发无法修改,所以此时卸载前有角标,重新安装也会有角标。但是,APP 卸载之后超过一天的时间再重装,那么角标就会被系统清空,届时也不会有新安装的 APP 就有角标的情况存在。
相关工具
Knuff离线push工具下载链接:https://github.com/KnuffApp/Knuff/releases
使用方法也比较简单
37.png
比如我的payload输入如下:
38.png
得到的应该是有“K