APNs简述
Apple Push Notification server(APNs)
,即苹果推送通知服务。
APNs出现需求
由于移动设备内存、CPU
、电池容量等各种因素,iOS
不允许APP
进程常驻后台(时限大概为10min)。
当用户主动关闭APP
或后台APP
进入后台达到限定时长后,意味着该APP
进程的结束,在一定程度上保证了手机的流畅度与使用时长。但这也同时意味着服务器无法主动和用户交互(如实时推送消息),为了解决这个限制,苹果推出了APNs
,允许设备和服务器分别与苹果的推送服务器保持长连接状态。
iOS通知
iOS
通知分为本地通知和远程通知两类,APNs
是远程通知功能的核心。
本地通知
由本地应用触发,一般是基于时间的通知形式,如闹钟、日历、待办事项等。
远程通知
通过自建服务器推送消息的通知形式。
APNs推送流程
苹果官方APNs
概述:Local and Remote Notification Programming Guide: APNs Overview (apple.com)
以下为APNs
推送流程图:
- Provider:自建应用服务器
- APNs:苹果APNs推送通知服务器
- Device:苹果设备
- Client App:应用
大致流程可分为以下4点:
- 苹果设备安装应用后会向
APNs
服务器进行注册,注册成功后APNs
服务器返回一个deviceToken
,且二者之间会维持一个基于SSL
协议的TCP
流通讯的长连接。 - 拿到
deviceToken
后设备会将其发送至自建应用服务器 - 有消息需要被推送时,自建服务器会将消息按指定格式结合
deviceToken
一并打包发送给APNs
。 APNs
将新消息推送至设备,并在设备屏幕上显示出来(因为设备和服务器之间维持了一个长连接)
结合上述过程可以发现,真正完成推送的是APNs
服务器,消息一定是由APNs
服务器推送给我们的设备,自建应用服务器只是将需要推送的消息告诉APNs
服务器。至于如何维护消息队列或如何保证消息能被推送到指定设备上,这些功能都是由APNs
实现的。
deviceToken
deviceToken
是一个APP
安装在设备上的唯一标识符,一个APP
在不同设备上的deviceToken
不同,同一台设备重新安装同一个APP
后deviceToken
也会不同。
项目代码AppDelegate
中有一个回调方法,当APNs
注册成功后通过该回调方法可以获取到返回的deviceToken
。
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
APNs
拿到这个包之后会验证包结构是否正确,验证无误后会提取其中的消息,再将消息推送至指定设备。
消息体结构如下:
{
"aps":{
"alert":{ // 显示在用户设备上的推送标题内容
"title":"Test Request",
"body":"This is a test msg.",
},
"badge":5, // 显示的数量(整形类型),是在应用icon右上角显示的数量,提示有几条未读信息
"sound":"default" // 推送消息声
}
}
其实这就是一个JSON
结构体,上述代码只是一种简单消息体,详情可见苹果官方文档:Local and Remote Notification Programming Guide: Creating the Remote Notification Payload (apple.com)
安全架构
APNs
用连接信任(connection trust
)和token
信任(token trust
)来控制通信入口。
连接信任
连接信任主要有两个作用:
- 保证
APNs
连接的服务器是苹果已同意允许进行通信的服务器。 - 保证
APNs
连接设备的合法性,由APNs
处理。
我们所需要完成的工作就是处理服务器和APNs
之间的连接安全性。
服务器与APNs之间的连接信任
每个服务器必须有一个唯一的provider
证书和私钥,均用于验证连接,其中provider
证书需在苹果开发者官网申请。
服务器通过TLS
验证和APNs
进行连接,过程为四步握手:
- 初始化
TLS
连接,即服务器给APNs
发送请求。 APNs
服务器向服务器返回APNs
证书,即公钥。- 服务器端收到后生成
provider
证书并返回给APNs
。 APNs
收到验证后即可建立TLS
连接,但并不是使用HTTPS
,而是HTTP/2
。
常见问题
从设备卸载应用后如何处理推送消息
当我们卸载应用后便不会再收到推送消息,也就是说APNs
和Provider
得知用户已卸载了应用,那么这个过程是怎么实现的呢?
这是通过利用苹果提供的反馈服务(Feedback Service
),它是APNs
的一部分,APNs
会持续更新Feedback Service
列表,当Provider
将信息发给APNs
,APNs
再将消息推送到设备时,若设备无法将消息推送给指定应用,则会向APNs
返回一个反馈信息,而这个反馈信息就记录在Feedback Service
中。对于这种机制,Provider
应该定时检测Feedback Service
列表,然后删除在自己数据库中记录的deivce Token
,从而判断应用已卸载的情况。
在连接Feedback Service
的过程中,同样使用长连接方式,连接成功之后会直接接收由APNs
传输给我们的反馈列表,传输完成后就会断开连接,然后根据最新的反馈列表更新应用服务器数据库。
文章许可:本文采用CC BY-NC-SA 4.0许可协议,转载请注明出处。