iOS 常用的通知
- 本地推送通知(
Local Notification
) - 远程推送通知(
Remote Notification
)
推送和通知 NSNotification
的区别
- NSNotification是系统内部发出的通知,一般用于内部事件的监听,或者状态的改变等、是不可见的(建议不要滥用NSNotification,因为是在主线程中执行,使用不当会发生线程阻塞)
- 本地通知与远程通知是可见的,主要用户告知用户或者发送一些App的内容更新,推送一些消息,让App知道App内部发生了什么事情。
1、本地推送通知:
不需要联网就可以发出的通知
使用场景:
提醒用户完成一些任务,比如:定时提醒,生活备注,看电影等等
注意:iOS7,不需要用户授权就可发出通知,而iOS8以后,必须用户授权才可以发出通知
2、远程推送通知:
APNs 简介
远程推送服务APNS(Apple Push Notification Servers)
APNs 是苹果提供的远程通知的服务器,当 App 处于后台或者没有运行时,如果 App 的服务器(之后我们称为 Provider)需要发送通知信息给客户端,则需要借助于 APNs 服务器。
使用 APNs 服务时,远程通知的路径为: Provider –> 苹果的 APNs 服务器 –> 手机设备 –> App。在这个路径中,Provider 与 APNs 服务器之间有一个 TLS 连接,Provider 通过这个连接将远程通知推送到苹果的 APNs 服务器;手机设备与 APNs 服务器之间也会有一个 TLS 连接,所有发往手机设备的 APNs 远程通知都是使用这一个 TLS连接,然后由设备区分远程通知所属的 App,进而通知给用户某应用有远程通知。
所有苹果设备在联网的情况下都会与苹果建立长连接
长连接
为了保持服务器不断开和我们设备的联系,我们的设备默认每隔一段时间会向服务器发送心跳包(一个很小的文件),来告诉苹果服务器不要和我们的设备断开连接
- 只要联网就一直建立连接
- 长连接作用:
- 时间校准
- 系统升级
- 查找我的iPhone等
- 长连接的好处
- 数据传输速度快
- 数据保持最新状态
APNs 工作的流程
- App 需要将用户的UUID和app的bundleID发送给apps服务器,进行注册,apns服务器将加密后的Device Token返回给app
- App 拿到 Token 后需要将其发送给 Provider
- 当需要推送通知时,Provider 指定 Token 和通知内容,并发送给 APNs 服务器;
- APNs 服务器会将通知发送给 Token 对应的设备上;
- 设备收到通知后,根据 APNs 发过来的通知中带有的 bundleID 信息区分是哪个App的远程通知(这里应该是根据 Token 来获取 bundleID)。
整体如下图所示(以QQ推送为例):
客户端:
- 发送设备的UDID和应用的Bundle Identifier给APNs服务器
- 经苹果加密生成一个deviceToken
- 发送当前用户的deviceToken和用户的标志(比如id或者qq)到自己公司的服务器或者第三方推送服务器
- 监听用户通知的点击
服务端:
- 自己的服务器或者第三方推送服务器将客户端发送过来的用户信息保存在自己的服务器中
- 有人发送消息的时候,从服务器中(根据deviceToken)查询要发给谁
- 查询到要发送给某人以后,将信息发送给苹果服务器
- 苹果服务器根据得到的deviceToken和信息,查到要接受信息的设备和app,将信息发送给用户。
推送的大小限制
远程通知负载的大小根据服务器使用的API不同而不同。当使用HTTP/2 provider API时,负载最大为4kB;当使用legacy binary interface时,负载最大为2kB。当负载大小超过规定的负载大小时,APNs会拒绝发送此通知。
如何调试远程推送功能
- 真机调试,模拟器接受不到远程通知
- 创建apeid(不带*)
- 创建appid ssl 证书(获得一个调试证书,一个发布证书)
- 生成相应的描述文件
- 安装相关证书
常见面试题
- 本地通知的数量是有限制的,本地通知最多只能有
64
个,超过这个数量将被系统忽略
Push Notification 是如何工作的?
- 本地推送:
- 不需要联网也可以推送,是开发人员在APP内设定特定的时间来提醒用户干什么
- 远程推送:
- 需要联网,用户的设备会于苹果APNS服务器形成一个长连接。
- 用户设备会发送uuid和
Bundle idenidentifier
给苹果服务器。 - 苹果服务器会加密生成一个deviceToken给用户设备。
- 然后设备会将deviceToken发送给APP的服务器
- 服务器会将deviceToken存进他们的数据库
- 有人发送消息时,服务器端就会去查询我的deviceToken。
- 然后将deviceToken和要发送的信息发送给苹果服务器。
- 苹果服务器通过deviceToken找到设备并将消息推送到设备上。
- 如果APP在线,那么APP服务器会于APP产生一个长连接,这时候APP服务器会直接通过deviceToken将消息推送到设备上。
是否可以把比较耗时的操作放在NSNotificationCenter中
- 如果在异步线程发的通知,那么可以执行比较耗时的操作;
- 如果在主线程发的通知,那么就不可以执行比较耗时的操作