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许可协议,转载请注明出处。