概括
iOS APNs: 远程推送
说过远程推送(RemotePush).
今天说说本地推送, 本地推送也就是平时所说的 LocalPush.
该系列博客:
- iOS APNs: 本地推送(本篇)
- iOS APNs: 处理数据
- iOS APNs: 静默推送
- iOS APNs: Background Fetch
业务场景
在具体实现之前, 先说一下业务场景.
假如你的 APP 具有 IM(即时通讯) 功能, 这个时候, 你可以根据连接来判断用户是否在线, 如果不在线, 可以使用远程推送将推送内容告知用户.如果在线, 可以通过 IM 把内容告诉 APP, APP 收到这个消息后, 可以使用本地推送告知给用户.
据说 APNs 每天要处理的推送在亿级别, 所以如果可以使用 LocalPush 完成的业务, 我建议大家还是不要使用远程推送, 况且苹果并不一定保证远程推送一定成功, 如果网络或者 APNs 压力大, 推送也会延时.
给苹果减少点压力吧, 哈哈!
再说一个业务场景, 你的 APP 在后台运行时间快到要被系统挂起的时候了, 你可以发送一个 LocalPush 来提示用户或者刺激用户, 再次将 APP 拉回前台运行. 这样可以保证 APP 可以正常运行了.
上面说的第二个业务场景, 是今天例子的基础, 你也可以根据自己的实际业务场景来使用 LocalPush 功能.
LocalPush 简介
LocalPush 允许 APP 向用户发送通知, 对于用户来说, 就跟远程推送是一样的, 基本没有感知, 开发者也不希望用户有感知.
推送效果图:
注意: 如果你的 APP 在前台, 发送 LocalPush 是不会要上述效果的.
如果在前台, 可以使用自定义的弹框来提示用户.
LocalPush 同样需要用户授权推送的权限, 否则也无法发送成功.这个跟远程推送是一样的.
另外, LocalPush 需要 APP 在后台没有被挂起的情况下, 才能发送, 否则无法启用.
发送 LocalPush 的一个好处是不需要用户连接网络, 这个是区别于远程推送的, 因为远程推送必须要求用户连接网络的.很多单机游戏或者弱联网的游戏, 发送的推送都是 LocalPush, 而非远程推送.
在阅读下面内容之前, 建议大家先看看 iOS 后台模式 这篇文章.本篇也是基于这个为基础的.
实现
这个示例, 实现的场景如下:
用户打开 APP, 授权了推送的权限, 用户试玩一会之后, 将 APP 退到了后台, APP 监听退到后台之后, 延时一定时间发送 LocalPush 给用户.
AppDelegate.m 中使用后台模式
关于 MZBackgroundTask 的实现, 附录给出.
1 | - (void)applicationDidEnterBackground:(UIApplication *)application { |
ViewController.m
1 | - (void)viewDidLoad { |
将 APP 点击 Home 键退到后台, 6s 后可以看到推送的效果.
点击推送的提示框, 再次打开了 APP, 会执行 AppDelegate 中的方法, 如下:
1 | - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification { |
打印出来的 notification, 如下图所示:
其中, user_info 是我们自定义的数据部分.
附录
MZBackgroundTask 实现
1 | #import "MZBackgroundTask.h" |