@evolxb
2016-08-27T16:10:31.000000Z
字数 2341
阅读 1414
ios,
push
notification
苹果的远程推送通知服务(APNs
)是远程通知的核心。这是一个强健并且高效的系统来为iOS
,watchOS
,tvOS
设备推送消息。每台设备都和APNs
建立了一个加密的可信IP
链接,通过这个持久的链接来接收APNs
发送给设备的消息。如果通过这个链接发送到设备后,相应的应用不在前台运行,系统会展示相应的警告框提示用户。
你需要使用自己的服务器来为用户生成远程通知。这个服务器被称为Provider
,它生成远程通知的数据并且决定什么时候推送这个远程通知。对于每个远程通知,Provider
生成通知的payload
然后使用HTTP/2
的持久的加密链接发送到APNs
,APNs
负责把通知推送到用户设备。
APNs
负责分发你的Provider
传过来的通知到你的应用的用户的设备。当你的Provider
需要推送一个通知,它把这个通知和设备的token
一起发送到APNs
。APNs
会把这个通知传递到用户设备,设备上的操作系统会负责传递这个通知到相应的应用程序。如下图:
你传给服务器的设备token
和手机号是类似的。它包含设备的信息,APNs
使用这个token
能定位你的应用程序安装的设备。APNs
也会用它来验证通知发送的过程中的路由信息。通过注册远程通知服务,系统会发送设备的token
给你的应用程序。
通知的payload
是你想发送给设备的数据,它是一个JSON
字典。payload
包含系统提示用户的方式,如警告框,badge
,声音。它也能包括你自定义的数据。
下图展示了APNs
在设备和Provider
之间的虚拟网络。在APNs
的两边--设备方和APNs
和Provider
方和APNs
之间--都会有多个连接。在Provider
和APNs
的这边,它们被称为网关。通常都会有多个Provider
,每个Provier
都通过网关和APNs
建立一个或多个持久的加密连接。这些Provider
通过APNs
发送通知到它们的客户端设备上。
APNs
默认包含一个存储和转发功能的组件。如果要推送的设备不在线,要推送的通知会被APNs
暂存一段时间,当设备上线之后会推送到设备。但是只有一个通知会被暂存。当有多个通知推送到设备而设备此时不在线时,最新的一个通知会被暂存,而以前的通知会被丢弃。这被称为通知合并。
如果设备长时间离线,那么所有的通知都会被丢弃。
为了保证安全的通信,APNs
使用两种不同的信任级别在Porvider
和设备之间:connection trust
和token trust
。
Connection trust
保障APNs
是连接到一个被授权可以推送通知的Provider
上。APNs
也会使用connection trust
来连接到设备以保证设备的合法性。APNs
到设备的可信连接是APNs
自动处理的,但是Provider
到APNs
之间的可信连接必须要你自己负责。
Token trust
确保通知是在合法的起始点和终止点之间传送。Token trust
涉及到设备token
的使用,这是分配给特定设备上的特定应用的标识符。每个应用通过注册远程通知服务来获取它的唯一设备标识符,而且必须要把这个标识符传到服务器。因此,这个标识符应该和通知一同被Provider
发送到APNs
。提供这个标识符用于传递通知到特定的设备上的特定应用程序。
注意:设备标识符并不能用来区分设备的唯一性。
APNs
也会使用必要的证书,CA证书和密钥(公钥和私钥)来验证Provider
和设备之间的连接。
Provider
到APNs
之间的可信连接每个Provider
都必须要有一个唯一的证书和私钥,APNs
会使用它们来验证它和Provider
之间的连接。Provider
的证书标示它所支持的应用的bundle id
。
你的Provider
通过TLS
的对等网络建立可信连接到APNs
。当TLS
连接初始化后,你会得到APNs
的服务端证书,然后在你这边验证证书。然后你发送你的Provider
证书给APNs
,APNs
也会在它那边验证你的证书。当这个过程完成后,一个安全和可信的TLS
就被合法的Provider
建立了。
APNs
到设备的可信连接每个设备都有一个设备证书和私钥。它们用来验证和APNs
之间的连接。设备在激活的时候会获取这个证书和私钥然后把它们保存在钥匙串中。
你不需要做任何事来建立APNs
和设备之间的可信连接。APNs
会通过TLS
来建立到设备的可信连接。在这种情况下,设备初始化TLS
连接,APNs
返回服务器证书.设备验证这个证书然后发送自己的设备证书给APNs
,APNs
验证这个证书。
Token
的生成和发送设备想要收到远程通知必须先在系统中注册远程通知服务。当系统收到应用的注册请求时会把这个请求转发到APNs
。APNs
会使用设备的证书中的信息为应用生成一个唯一的设备token
,然后加密这个token
再把它返回给设备。系统通过NSData
把设备token
传递给应用。当收到这个设备token
后,应用应该使用二进制或者十六进制把这个token
发送给你的服务器。服务器不能把通知推送到没用这个token
的设备。流程如下图:
APNs
的设备token
长度是可变的。不要写死长度。
下图显示设备token
的生成和转发路径,还有上传到Provider
的部分。
每个从Provider
发送给APNs
的远程通知都必须和device token
一起发送。APNs
使用它的token key
解密通知中的token
来确保Provider
的合法性。然后使用device token
中的device ID
来决定推送的目标设备,最后把这个通知推送给目标设备。