设为首页 加入收藏

TOP

iOS Push详述,了解一下?(三)
2019-08-31 01:05:16 】 浏览:150
Tags:iOS Push 详述 了解
件,这里以我司的腾讯新闻为例(有标题,内容,和附件):

img26.png

 腾讯新闻push

3D touch点入详情以后:

img27.png

   腾讯新闻push详情

这里我们惊奇的发现,除了可以携带图片这样的附件、push还能展开详情以外,进入详情以后,下面还多了“打开”、“收藏”、“不感兴趣”这些选项,这里就涉及到以下iOS10的新特性。

二、push携带附件


因为payload有大小限制,所以如果remote notification想要携带附件,那么payload上只能带上如附件下载地址之类的信息,等通知到达客户端后由service extension下载附件到本地,然后在初始化UNNotificationAttachment对象时传入附件在本地的URL。

img28.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:

img29.png

怎么得知用户选了哪个action并做出相应操作呢?这需要给UNUserNotificationCenter指定一个delegate:

img30.png

然后在delegate的类中实现

img31.png

方法:通过response.notification.request.content.categoryIdentifier和response.actionIdentifier就可以得知用户选择的action了。

四、改变push内容


这里主要讲应用的比较多的离线(远程)push的改变push方法

1、改变本地push内容

本地push,只要request的id一样,那么就可以更新推送:

更新的例子:

img31.png

img32.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有什么不同,为什么需要两个?它们分别实现什么功能呢?

img33.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(举例)如下:

img34.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实现的。

依然以腾讯新闻为例子:

img35.png

      展开界面

这里Notification Content Extension大展拳脚的地方,在这里可以自定义绘制不同的内容,将希望展现给用户的额外信息可以加载这里。

下半部分的notification action的实现就是在上面提到的“携带action的通知”。

测试要点

img36.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

使用方法也比较简单

img37.png

比如我的payload输入如下:

img38.png

得到的应该是有“K

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇iOS面试题 下一篇【OC底层】OC对象本质,如 isa, su..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目