详解消息推送 iOS(借鉴AVOS消息推送的讲解)
2018-03-27 本文已影响0人
希达like
APNs的推送机制
AE4C2A67-89C7-4B53-A986-B9F1F2A3C82A.png- Provider 是指某个应用的Developer,如果开发者使用 LeanCloud 的服务,把发送消息的请求委托给我们,那么这里的 Provider 就是 LeanCloud 的推送服务程序了。上图可以分为三步:
1.LeanCloud推送服务程序把要发送的消息、目的设备的唯一标识打包,发给APNs。
2.APNs在自身的已注册Push服务的应用列表中,查找有相应标识的设备,并把消息发送到设备。
- iOS系统把发来的消息传递给相应的应用程序,并且按照设定弹出Push通知。
- 为了实现消息推送,有两点非常重要:
1.App的推送证书:需要在App ID中打开Push Notifications,还需要Provisioning Profile和SSL证书。
2.设备标识DeviceToken:知道了谁要推送,或者说要推送给哪个应用后,APNs还需要知道推到哪台设备上,这就是设备标识的作用。获取设备标识的流程如下:- 应用打开推送开关,用户要确认TA希望获得该应用的推送消息;
- 应用获得一个DeviceToken;
- 应用将DeviceToken保存起来
- 当某些特定事件发生,开发者委托LeanCloud来发送推送消息这时候LeanCloud的推送服务器就会给APNs发送一则推送消息,APNs最后把消息送到用户设备。
推送相关的几个概念
- 消息类型
一条消息推送过来,可以有如下几种表现方式:- 显示一个alert或者banner,展现具体内容
- 在应用icon上提示一个新到消息数
- 播放一段声音
开发者可以在每次推送的时候设置,在推送到达用户设备时开发者也可以选择不同的提示方式。
- 本地消息通知
iOS上有两种消息通知,一种是本地消息(Local Notification),一种是远程消息(Push Notification 或Remote Notification)
代码里面如何实现推送
- 首先,我们要获取DeviceToken
应用需要每次启动的时候都去注册远程通知——通过调用UIApplication的registerForRemoteNotificationTypes:方法,传递给它你希望支持的消息类型参数即可。如果注册成功,APNs会返回给你设备的token,iOS系统把它传递给app delegate代理方法。注册流程需要在每次启动时调用,这并不会带来额外的负担,因为iOS操作系统在第一次获得了有效的device token之后,会本地缓存起来 - 其次,我们要处理收到消息之后的回调
设想一下消息通知的几种使用场景:- 在应用没有被启动的时候,接收到了消息通知。这时候操作系统会按照默认的方式来展现一个alert消息,在应用的icon上标记一个数字,甚至播放一段声音。
- 用户看到消息之后,点击了一下 action 按钮或者点击了应用图标。如果 action 按钮被点击了,系统会通过调用 application:didFinishLaunchingWithOptions: 这个代理方法来启动应用,并且会把 notification 的 payload 数据传递进去。如果应用图标被点击了,系统也一样会调用 application:didFinishLaunchingWithOptions: 这个代理方法来启动应用,唯一不同的是这时候启动参数里面不会有任何 notification 的信息。
- 如果远程消息发送过来的时候,应用正在运行,这时候会发生什么呢?应用代理的 application:didReceiveRemoteNotification: 方法会被调用,同时远程消息中的 payload 数据会作为参数传递进去。