iOS“推送”通知如何传递到特定设备,而该设备无需轮询服务器?
例如,假设我在Facebook上收到了一条新消息。Facebook通知Apple我的设备应收到这样的通知。但是,Apple如何知道将消息推送到哪个设备/ IP?
iOS“推送”通知如何传递到特定设备,而该设备无需轮询服务器?
例如,假设我在Facebook上收到了一条新消息。Facebook通知Apple我的设备应收到这样的通知。但是,Apple如何知道将消息推送到哪个设备/ IP?
Answers:
因此,我对此发表评论实在太多了。
从文档中。
Apple推送通知服务(APN)将推送通知传播到已注册应用程序以接收那些通知的设备。每个设备都与服务建立一个经过认证和加密的IP连接,并通过该持久连接接收通知。提供程序通过持久且安全的通道与APN连接,同时监视旨在为其客户端应用程序提供的传入数据。当应用程序的新数据到达时,提供者准备并通过通道将通知发送到APN,APN将通知推送到目标设备。
我建议阅读文档以获取更多信息以及如何使用和配置。都在那里。
可以使用各自的唯一设备令牌用数据更新每个设备。这幅画说明了一切。。
Apple Push Notification Service(APN)是远程通知功能的核心。对于应用程序开发人员来说,它是一项强大,安全且高效的服务,可以将信息传播到iOS(以及间接地通过watchOS),tvOS和macOS设备。
在用户设备上首次启动您的应用程序时,系统会自动在您的应用程序和APN之间建立经过认可,加密和持久的IP连接。通过此连接,您的应用可以执行设置以使其能够接收通知,如配置远程通知支持中所述。
发送通知的连接的另一半(提供商服务器和APN之间的持久安全通道)需要在线开发人员帐户中进行配置,以及使用Apple提供的加密证书。提供程序是您配置和使用APN的服务器,您可以对其进行部署和管理。图1-1显示了远程通知的传递路径。
图1-1从提供者向应用程序传递远程通知
在您的提供商和应用程序中完成推送通知设置后,提供商可以将通知请求发送到APN。APN将相应的通知有效载荷传送到每个目标设备。收到通知后,系统会将有效负载传送到设备上的相应应用程序,并管理与用户的交互。
如果在设备开机但未运行应用程序的情况下收到有关您应用程序的通知,则系统仍可以显示该通知。如果在APN发送通知时关闭设备电源,则APN会保留该通知并稍后再试(有关详细信息,请参阅服务质量,存储转发和合并通知)。
您的提供程序服务器对参与APN负有以下责任:
对于提供者发送的每个远程通知请求,它必须:
图1-2描述了APN为运行您的应用程序的设备启用的虚拟网络的种类。为了处理通知负载,您通常会部署多个提供程序,每个提供程序都具有自己与APN的持久性和安全连接。然后,每个提供程序都可以发送针对该提供程序具有有效设备令牌的任何设备的通知请求。
图1-2将远程通知从多个提供商推送到多个设备
Apple Push Notification服务包括执行存储转发功能的服务质量(QoS)组件。如果APNs尝试传递通知,并且目标设备处于脱机状态,则APNs将在有限的时间内存储该通知,并在该设备再次变得可用时将其传递。该组件仅存储每个设备和每个应用程序的最新通知。如果设备离线,则发送针对该设备的通知请求会导致先前的请求被丢弃。如果设备长时间保持离线状态,则其存储在APN中的所有通知都将被丢弃。
要允许合并类似的通知,您可以在通知请求中包含折叠标识符。通常,当设备处于联机状态时,您发送给APN的每个通知请求都会导致向设备发送通知。但是,当HTTP / 2请求标头中存在apns-collapse-id密钥时,APNs合并该密钥的值相同的请求。例如,发送两次相同标题的新闻服务可以对两个请求使用相同的崩溃标识符值。然后,APN会将两个请求合并为一个通知,以传送到设备。有关apns-collapse-id密钥的详细信息。
APNs使用两个级别的信任来实施端到端,密码验证和身份验证:连接信任和设备令牌信任。
连接信任在提供者和APN之间以及APN和设备之间起作用。
设备令牌信任对于每个远程通知都是端到端的。它确保仅在正确的起点(提供者)和终点(设备)之间路由通知。
设备令牌是不透明的NSData实例,其中包含Apple分配给特定设备上特定应用程序的唯一标识符。只有APN才能解码和读取设备令牌的内容。每个应用程序实例在向APN注册时都会收到其唯一的设备令牌,然后必须将令牌转发到其提供程序,如配置远程通知支持中所述。提供者必须在针对关联设备的每个推送通知请求中包含设备令牌;APN使用设备令牌来确保将通知仅传递到预期的唯一应用程序设备组合。
APN可以出于多种原因发行新的设备令牌:
因此,应用程序必须在启动时请求设备令牌,如APNs到设备连接信任和设备令牌中所述。有关代码示例,请参见注册以接收远程通知。
要使用APN建立基于HTTP / 2的TLS会话,必须确保在每个提供商上都安装了GeoTrust Global CA根证书。如果提供程序正在运行macOS,则默认情况下,此根证书位于钥匙串中。在其他系统上,此证书可能需要显式安装。您可以从GeoTrust根证书网站下载此证书。这是证书的直接链接。
图1-3说明了使用基于HTTP / 2的APNs提供程序API建立信任,以及使用JWT提供程序身份验证令牌发送通知。
图1-3建立和使用基于令牌的提供商连接信任
如图1-3所示,基于令牌的提供商信任的工作方式如下:
您的提供商要求使用传输层安全性(TLS)与APN进行安全连接,如图中标为“ TLS初始化”的箭头所示。
然后,APNs为您的提供商提供APNs证书,该证书由图中的下一个箭头表示(标记为“ APNs证书”),然后您的提供商对其进行验证。
此时,建立了连接信任,并启用了提供程序服务器以将基于令牌的远程推送通知请求发送到APN。您的提供商发送的每个通知请求都必须带有JWT身份验证令牌,该令牌在图中以标有“ Notification push”的箭头表示。
APN对每个推送进行回复,在图中以箭头标记为“ HTTP / 2响应”表示。
有关您的提供商可以为此步骤接收的响应的详细信息,请参阅来自APN的HTTP / 2响应。
图1-4说明了使用Apple发行的SSL证书在提供商和APN之间建立信任关系。与图1-3不同,该图本身未显示通知推送,但在建立传输层安全性(TLS)连接时停止。在基于证书的信任方案中,推送通知请求未经身份验证,但使用随附的设备令牌对其进行了验证。
图1-4建立基于证书的提供商连接信任
如图1-4所示,基于证书的提供商对APN的信任关系如下:
您的提供商要求使用传输层安全性(TLS)与APN进行安全连接,如图中标为“ TLS初始化”的箭头所示。
然后,APNs为您的提供商提供APNs证书,该证书由图中的下一个箭头表示(标记为“ APNs证书”),然后您的提供商对其进行验证。
然后,您的提供者必须将其Apple提供的提供者证书(您先前从在线开发者帐户获得的证书,如Xcode帮助中的“生成通用APNs客户端SSL证书”中所述)发送回APN,以箭头标记为“提供者”证书。”
然后,APNS会验证您的提供者证书,从而确认连接请求源自合法的提供者,并建立您的TLS连接。
此时,建立了连接信任,并启用了提供程序服务器将基于证书的远程推送通知请求发送到APN。
如本节所述,APN和每个设备之间的信任是自动建立的,无需您的应用程序的参与。
每个设备都有一个密码证书和一个私有密码密钥,由操作系统在初始设备激活时提供并存储在设备的钥匙串中。在激活过程中,APN根据证书和密钥对与设备的连接进行身份验证和验证,如图6-5所示。
图1-5在设备与APN之间建立连接信任
如图1-5所示,APN对设备的信任关系如下:
收到设备令牌后,应用程序必须连接到该应用程序的关联提供程序并将令牌转发给它。此步骤是必需的,因为提供程序在稍后向目标设备的APN发送通知请求时必须包含设备令牌。您编写的用于转发令牌的代码也显示在“注册以接收远程通知”中。
无论用户是首次激活设备,还是APN是否发布了新的设备令牌,过程都相似,如图6-6所示。
图1-6管理设备令牌
您的应用已向APN注册以进行远程通知,如顶部箭头所示。如果该应用程序已经注册,并且该应用程序专用的设备令牌尚未更改,则系统会迅速将现有令牌返回给该应用程序,并且该过程跳至步骤4。
当需要新的设备令牌时,APN使用设备证书中包含的信息生成一个。它使用令牌密钥对令牌进行加密,然后将其返回设备,如中间的向右箭头所示。
系统通过调用application:didRegisterForRemoteNotificationsWithDeviceToken:委托方法将设备令牌重新发送回您的应用程序。
收到令牌后,您的应用程序(在委托方法中)必须将其以二进制或十六进制格式转发给您的提供程序。没有此令牌,您的提供商将无法向设备发送通知。有关详细信息,请参阅配置远程通知支持中的注册接收远程通知。
APNs设备令牌的长度是可变的。不要硬编码它们的大小。
当您的提供商将推送通知请求发送到APN时,它会包含一个设备令牌,用于标识唯一的应用程序设备组合。在图6-7中提供程序和APN之间的“令牌,有效负载”箭头中显示了此步骤。APN对令牌进行解密,以确保请求的有效性并确定目标设备。如果APN确定发送者和接收者是合法的,则它将通知发送到所标识的设备。
图1-7从提供商到设备的远程通知路径
设备收到通知后(图1-7中显示的最后一步),系统将远程通知转发到您的应用程序。
参考:Apple Push Notification Service
现在,看这里了解技术流程:如何在iOS应用程序上实现Apple Push Notification Service?
设备不会继续轮询服务器以获取推送通知。
为简单起见,请考虑将iPhone连接到互联网。在连接到Internet时,iPhone建立与Apple Push Notifications服务器的连接,此连接为开放连接,这意味着数据可以在到达服务器时从服务器抛出到iPhone。
Apple不会将HTTP协议用于Push通知,但是如果您了解HTTP协议,它几乎是一种类似的方法。
http://en.wikipedia.org/wiki/Push_technology#HTTP_server_push