APNS原理总结

什么是 APNs

先说一下远程推送。一般我们有自己的服务器,在这个过程中是 Provider 的角色。如图,推送从我们的服务器到我们的 APP 的过程,就是要通过 APNs 来发送。

2016-07-29_10:34:17.jpg

APNs(Apple Push Notification service)是远程推送功能的核心,通过 APNs 客户端和苹果服务器建立一个长连接,推送也是通过这个长连接发送到客户端上。

deviceToken

deviceToken 是设备的一个标识符,属于你这款 APP 装在你这个设备上的标识符。每个 APP 在每一个不同的设备上都有着不同的 deviceToken。通过注册远程推送服务,APNs 会返回给你的 APP 一个 deviceToken,如图。

2016-07-29_09:22:33.jpg

在项目的 AppDelegate 里面有一个方法,如果成功注册了便可以接收到 deviceToken。

1
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

deviceToken 不是永久不变的,当你的设备更新了系统,deviceToken 可能就会改变。

安全架构

为了保证安全性,APNs 用连接信任(connection trust)和 token 信任(token trust)来控制通信入口,你要用 APNs 就必须通过这两种验证。

连接信任

连接信任第一个作用是保证连接 APNs 的 provider 是苹果已经同意可通信的,第二个是保证与 APNs 连接的设备合法。第二步是 APNs 处理的,你需要处理的是 provider 与 APNs 之间的连接安全性。

服务器与 APNs 之间的连接信任

每个服务器都必须要有唯一的 provider 证书和私钥,都是用来验证连接的。provider 证书就是在开发者官网申请的。

服务器通过 TLS 验证和 APNs 连接,HTTPS 中用的也是 TLS 协议,即四步握手。首先初始化 TLS 连接,即 provider(服务器)发送请求给 APNs,APNs 服务器返回 APNs 证书(即公钥)给 provider,然后服务端收到后生成 provider 证书再返回给 APNs。APNs 收到后验证通过,即可以建立 TLS 连接。不过 APNs 用的不是 HTTPS,而是 HTTP/2,具体过程如下图。

2016-07-29_22:13:00.jpg

APNs 与设备之间的连接信任

设备和 provider 一样,都有私钥和设备证书,当设备激活了就保存在钥匙串(keychain)中。但是这部分连接信任你不用管,由 APNs 负责,也是通过 TLS 来验证,过程和 provider 与 APNs 的验证类似。

2016-07-29_23:35:06.jpg

Token 信任

Token 信任就是保证通知从合法的起点推送到合法的终点。Token 信任要用到上面说的 deviceToken,deviceToken 提供给 provider,然后之后你的 provider 每次发送推送通知都要携带 deviceToken,这就是 token 信任。

APNs 会用 token 钥匙去保证通知来源(即你的服务器)的合法性,用包含在 deviceToken 里面的 device ID 去确定目标设备的身份,过程如下图。

2016-07-29_23:41:02.jpg

参考资料

图全部来自官方文档,很多关键词都是我自行翻译。

苹果官方文档 - Apple Push Notification Service