Setting Up a Remote Notification Server
Set up a server to generate notifications and push them to user devices.
远程通知 Remote notifications
(也称为推送通知)允许我们将少量数据推送到安装了应用程序的设备,即使应用程序未运行也是如此。应用使用通知来通知用户。
远程通知的传递涉及几个关键组件:
Your company's server (known as the provider server)
Apple Push Notification service(APNs)
The user's device
Your app (running on the user's device).
远程通知
从公司的服务器开始。我们决定何时向用户发送通知。在发送通知时,我们将生成包含通知数据和用户设备的唯一标识符的请求。然后将请求转发给 APNs
,APNs
处理将通知传递给用户的设备。收到通知后,用户设备上的操作系统会处理任何用户交互并将通知发送到 应用程序
。
APNs 概述
Apple 推送通知服务(APNs)
是远程通知功能的核心。这是一个强大,安全和高效的服务;首次在用户设备上启动应用程序时,将在 应用程序
和 APNs
之间自动建立经过身份验证的永久加密IP连接。在应用程序中使用此连接,应用程序开发人员可以将信息分发到iOS(和间接watchOS),tvOS,macOS设备。
一旦Provider server
和 应用程序
设置了推送通知,服务器就可以向 APNs
发送通知请求。APNs
将相应的通知有效负载发送到每个目标设备。接收通知的系统将有效载荷传递给设备上的相应 应用程序
并管理与用户的交互。
使用 APNs 注册应用程序
APNs
必须先知道用户设备的地址,然后才能向该设备发送通知。此地址采用设备令牌的形式,该设备令牌对于设备和应用程序都是唯一的。在启动时,应用程序
与 APNs
通信并接收其设备令牌,然后应用程序将其转发到提供商服务器。
即使两个应用程序都安装在同一设备上,一个应用程序的设备令牌也无法用于其他应用程序。两个应用都必须请求自己唯一的设备令牌并将其转发到提供商服务器。
设备令牌(Device token)
使用 APNs
注册应用程序并接收全球唯一的 Device token
,该令牌实际上是当前设备上的应用程序的地址。提供商服务器必须先具有此令牌才能向设备发送通知。
每次使用 Apple
提供的 API
启动应用程序时,都会去 APNs
注册并接收设备令牌。
Apple Push Notification 工作机制
-
应用程序
注册消息推送; -
应用程序
跟APNs
要device token
并接收device token
; -
应用程序
将device token
发送给服务端; -
服务端
向APNs
服务发送消息; -
APNs
服务将消息发送给应用程序
;
APNs
可以出于以下各种原因生成发布新的设备令牌:
- 用户在新设备上安装应用程序。
- 用户从备份恢复设备。
- 用户重新安装操作系统。
- 其他系统定义事件。
启用推送通知功能
应用必须具有使用推送通知的适当权利。要将这些权利添加到应用程序,需要在 Xcode
项目中启用推送通知功能,如图所示。在iOS中启用此选项会将 aps-environment
代码签名权利添加到应用程序中。在macOS中,它添加了代码签名权利,com.apple.developer.aps-environment
Provider server 如何参与 APNs
Provider server
通过获取应用程序
从APNs
接收到的设备令牌和其他相关数据,提供程序将能够获取有关每个正在运行的应用程序的信息。根据通知系统的设计判断是否需要向每个设备发送远程通知。
Provider server
会生成通知请求并将其发送到APNs
。单个请求包含通知有效负载和传递信息,并且APNs
向目标设备传递相应的通知。
服务质量,存储交换,通知整合
Apple 推送通知服务包括执行存储和转发功能的服务质量(QoS)组件。如果传送目标设备在 APNs
尝试发送通知时处于脱机状态,则会将通知保存一段时间,然后在再次联机后将其发送。它仅保存每个设备或应用程序的最新通知。如果设备处于脱机状态,如果您发送有关设备发往的通知的通知请求,则旧请求将被丢弃。如果离线状态持续很长时间,则存储在 APNs
中的所有通知也将被丢弃。
为了能够合并类似的通知,请在通知请求中包含合并标识符。通常,当您在设备联机时向APNs
发送通知请求时,会将通知单独发送到设备。但是,如果 HTTP/2
请求的标头 apns-collapse-id
中有密钥 ,则 APNs
将使用该密钥的相同值合并请求。例如,如果新闻服务连续两次发送相同的标题,则对两个请求使用相同的合并标识符值。然后,APNs
在将两个请求传递到设备时将其捆绑到单个通知中。
安全架构
为了保证安全性,APNs
用两级信任,连接信任
和 设备令牌信任
来执行端到端加密验证和身份验证。
连接信任
在
Provider server
和APNs
之间建立连接信任是确保连接的可靠性,是Provider server
向APNs
发送推送通知请求的先决条件;在
APNs
和设备
之间建立连接信任是确保只有经过身份验证的设备才能连接到APNs
并接收通知。APNs
自动与设备建立连接信任,并保证设备的有效性。
Provider server 和 APNs 之间的连接信任
有两种方法可以在 Provider server
和 APNs
之间建立连接信任。
基于令牌的提供者连接信任。使用基于 HTTP/2 的 API 的提供程序可以使用 JSON Web令牌(JWT)来提供与 APNs
连接的验证凭据。在这种情况下,请生成密钥对并将公钥传递给 Apple。将私钥保留在提供者端以防止泄漏。然后创建 JWT 提供程序身份验证令牌并使用私钥对其进行签名。此提供程序为每个推送通知请求附加身份验证令牌。
通过在提供者和 APNs
之间使用单个基于令牌的连接,我们可以向在线开发者帐户中具有 Bundle ID
的所有应用程序发送推送通知请求。
对于每个推送通知请求,来自 APNs
的 HTTP/2
响应将向请求者返回请求的成功或失败细节。
基于证书的提供者连接信任。它使用唯一的提供程序证书和密钥,而不是令牌。Apple在使用在线开发者帐户提供的推送服务时为提供程序证书设置了一个标识,即一个应用程序的 Bundle ID
。
当你使用 供应商和 APNs 之间基于证书的连接,通过网络开发者帐号设置的证书,您可以将推送通知请求发送到指定的应用程序。
为了与
APNs
建立基于HTTP/2
的TLS会话,必须在每个提供商上安装GeoTrust Global CA根证书。如果提供程序在macOS上运行,则此根证书将从头开始注册到密钥链中。对于其他系统,您必须明确安装它。可以从GeoTrust Root Certificates网站下载此证书。这里有证书的直接链接。
相反,该系统的,如果您使用的旧的二进制接口的APNs,该委托SSL证书的网站,请确保该委托证书颁发机构(2048)的根证书,可以提供在每个供应商拥有。
Provider server 与 APNs 之间基于令牌的信任
每个服务器都必须要有唯一的 Provider server
证书和私钥,都是用来验证连接的。provider证书就是在开发者官网申请的。
基于证书的提供者与 APNs 之间的信任关系如下:
服务器要求 APNs 通过 TLS协议(传输层安全性)建立安全连接(图“箭头TLS启动”中的箭头)。
APNs 将 APNs证书(公钥)返回给服务器(图中的箭头“APNs证书”)。
服务器收到 APNs证书 后进行验证并生成
Provider server
证书后再返回给APNs
。查看获得提供者证书“箭头”。APNs 验证 服务器传来的证书,在确认连接请求来自合法提供者后建立TLS连接。其中
APNs
用的不是HTTPS
,而是HTTP/2
。
建立连接信任后。提供程序服务器就已准备好向 APNs 发送基于证书的远程推送通知请求。
APNS - 设备与设备令牌之间的连接信任
APNs
和每个设备之间的信任是自动建立的,不涉及应用程序。
每个设备都有加密证书和密钥。它在激活期间由操作系统提供并存储在密钥链中。在激活期间,APNs
根据证书和密钥验证并验证与设备的连接。
APN与设备之间的信任关系如下:
当设备启动与
APNs
的TLS
连接时,信任协商开始(图中顶部的箭头)。APNs
将APNs证书
返回给设备。操作系统验证此证书后,它会向
APNs
发送设备证书(图“设备证书”中的箭头)。最后,
APNs
验证设备证书并建立信任(图中底部的箭头)。
由于在 APNs
和设备之间建立了 TLS连接
,因此设备上的应用程序可以向 APNs
注册并接收特定于应用程序的设备令牌以进行远程通知。
在收到设备令牌后,应用程序必须连接到与应用程序关联的提供程序,并将令牌转发给该提供程序。然后服务器将请求发送到 APNs
时将设备令牌嵌入请求中。
如果用户第一次激活设备 或 APNs 发出新设备令牌,则过程类似(参见下图)。
获取和处理特定于应用程序的设备令牌的过程如下:
应用程序向 APNs 注册以进行远程通知(图中顶部的箭头)。如果应用程序已注册且应用程序特定设备令牌尚未更改,则现有令牌将立即返回到应用程序,并将在下一步骤4执行。
如果需要新的设备令牌,则使用设备证书中包含的信息生成 APNs。接下来,使用令牌密钥加密令牌并将其返回到设备(右箭头指向图中间)。
系统通过调用委托方法
application:didRegisterForRemoteNotificationsWithDeviceToken:
将设备令牌返回给应用程序。应用程序(在委托方法中)接受此标记,并以二进制或十六进制字符串的形式将其转发给提供程序。如果没有此令牌,提供程序将无法向设备发送通知。
APNs 设备令牌是可变长度的。不要硬编码长度。
当提供商向 APNs
发送推送通知请求时,它在请求中嵌入设备令牌,该令牌唯一地标识应用程序和设备的组合。在下图中,连接提供者和 APNs 的箭头 Token,Payload
表示此过程。通过解密令牌,APNs
保证请求的有效性并识别目标设备。如果 APNs
判断发件人和收件人有效,则会向指定设备发送通知。
在设备接收到通知之后(此外,在完成上图中的最后一步之后),系统将远程通知转发给应用程序。
供应程序
我们只能将 APNs
用于通过 iOS App Store
,tvOS App Store
,Mac App Store
和 企业应用程序
分发的应用程序。必须完成使用 APNs
的配置和代码签名。此设置的大部分由团队的开发人员通过开发者账号创建提供。
Apple setting up a remote notification server
Apple Push Notification
Registering App with APNs
参照 Apple 官方文档整理,有错误请纠正~