iOS APNs: 静默推送

今天跟大家介绍一下 ios 的静默推送功能.

静默推送, 简单来说就是通过推送实现用户无感知的消息通知.

该系列博文:

iOS APNs: 远程推送
iOS APNs: 本地推送
iOS APNs: 处理数据
iOS APNs: 静默推送(本篇)

普通推送

例如微信, 好友给你发送了一条消息, 你的微信APP 在后台, 此时会收到带声音的一个消息提示.

这条推送机油有文字又有声音, 点开这个推送可以直接打开 APP.

从程序的角度来讲, 进入 App 后会调用下面的方法:

iOS10.0.x 和其之前的系统调用下面的方法:

1
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo

iOS10.0.x 之后的系统, 会调用如下的方法:

1
2
3
- (void)application:(UIApplication *)application
didReceiveRemoteNotification:(NSDictionary *)userInfo
fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler

静默推送的异同

1.没有弹出框

没有推送的弹框出现, 用户毫无感知的接收到了这个推送消息. 有 润物细无声 的感觉.

该推送既没有文字又没有声音.

2.需要用户授权允许推送

这个跟普通推送一样, 都需要用户授权才可以推送.

3.会执行代理方法

静默推送来的时候, 也能执行上面的回调方法. 执行上面方法的场景如下::

1.App 在前台.
2.App 在后台, 但是没有被 kill 掉.

4.iOS7 以后才有的

对于 iOS 之前是没有静默推送的.

5.可以延长后台时间

收到静默推送后, 在应用程序挂起之前有 30 秒左右可以执行相关的操作.

6.推送频率的控制

静默的推送是苹果推送服务器控制推送频率的.

苹果推送服务根据后台推送任务的能耗(用电量,接收情况)来控制后台推送的推送频率和延迟时间.


总之, 静默推送是普通推送的一种变种而已.

无论是静默推送还是普通推送, 开发者证书里面必须开通 push 相关的功能, 并且也需要用户开启允许推送的授权.

这个在 iOS APNs: 远程推送 里面已经介绍过, 不在这里赘述.

推送的格式

普通推送的格式, 大致是这个样子:

1
2
3
4
5
6
7
8
{
"aps":
{
"alert":"Testing.. (15),
"badge":1,
"sound":"default"
}
}

静默推送是不允许带 alert badge sound 等字段的. 但是必须包含 "content-available":1.

例如下面的形式都可以:

形式1

1
2
3
4
5
6
{
"aps":
{
"content-available":1
}
}

形式2

1
2
3
4
5
6
7
{
"aps":
{
"custom":"open_profile_page"
"content-available":1
}
}

其中, custom 是自己定义的, 大家根据需求自行扩展即可.

形式3

1
2
3
4
5
6
7
{
"aps" : {
"content-available" : 1
},
"acme1" : "bar",
"acme2" : 42
}

这个来自苹果开发者 文档.

使用场景

具体的使用场景, 需要结合本身的业务和功能特点来说.

静默推送的前提是 APP 没有被杀死, 可以通过回调函数来执行相关的代码.

另外, 静默推送不会打扰用户, 比如用户正在游戏中战斗, 你频繁的使用普通推送给他, 估计他都要疯了.

我个人使用静默推送的场景大致是这样的, APP 将要挂起的时候, 请求服务器去发一条静默推送, 然后使用本地通知的方式唤起用户来打开 APP, 从而保证 APP 处于保活的状态, 至少静默推送可以增加后台挂起的时间.

关于本地通知的内容, 可以参考之前的文章 iOS APNs: 本地推送.

更多的使用场景等大家在业务中去挖掘.

坚持原创技术分享!