iOS推送通知如何工作?

如何将iOS“推送”通知传递到特定设备,而无需轮询服务器?

例如,假设我在Facebook上收到了一条新消息。 Facebook通知苹果,我的设备应该收到通知。 但苹果公司如何知道哪个设备/ IP推送消息?

对我来说太过分了。

从文档。

Apple推送通知服务(APN)将推送通知传播到已注册应用程序以接收这些通知的设备。 每个设备都与该服务build立一个经过authentication和encryption的IP连接,并通过此持续连接接收通知。 提供商通过一个持久安全的通道与APN连接,同时监控预定用于其客户端应用程序的传入数据。 当应用程序的新数据到达时,提供程序准备并通过通道发送通知给APN,这会将通知推送到目标设备。

我build议阅读文档以获取更多信息以及如何使用和configuration。 都在那里

推送通知

每个设备都可以使用自己独特的设备令牌更新数据。 这张照片解释了一切。 。

在这里输入图像说明

我创build了一个信息图来解释推送通知的工作stream程。 希望这是有帮助的。

在这里输入图像说明

设备不会保持轮询服务器的推送通知。

为了简单起见,可以考虑将iPhone连接到互联网。 在连接到互联网iPhonebuild立连接到苹果推送通知服务器这个连接是开放的连接,这意味着数据到服务器的时刻数据可以从服务器扔到iPhone。

苹果不使用HTTP协议进行推送通知,但是如果您了解HTTP协议,则几乎可以使用类似的方法。

http://en.wikipedia.org/wiki/Push_technology#HTTP_server_push

APN概述

Apple推送通知服务(APN)是远程通知function的核心。 这是一个强大的,安全的,高效率的应用程序开发人员向iOS(以及间接的watchOS),tvOS和macOS设备传播信息的服务。

在用户设备上初次启动应用程序时,系统会自动在您的应用程序和APN之间build立一个经过authentication,encryption且持久的IP连接。 此连接允许您的应用执行设置,使其能够接收通知,如configuration远程通知支持中所述。

另一半用于发送通知的连接(提供商服务器和APN之间的持续安全通道)需要在您的在线开发者帐户中进行configuration,并使用Apple提供的encryption证书。 提供程序是您部署和pipe理的服务器,您configuration为使用APN。 图1-1显示了远程通知的传送path。

图1-1从提供者向应用发送远程通知 image:../Art/remote_notif_simple.jpg

在您的提供商和应用中完成推送通知设置后,您的提供商就可以向APN发送通知请求。 APN向每个目标设备传送相应的通知有效载荷。 收到通知后,系统将有效载荷传递到设备上的相应应用程序,并pipe理与用户的交互。

如果您的应用程序通知在设备开机但是应用程序未运行的情况下到达,系统仍然可以显示通知。 如果设备在APN发送通知时closures电源,则APN将保留该通知并稍后再试(有关详细信息,请参阅服务质量,存储转发和合并通知)。

供应商的责任

您的提供商服务器具有参与APN的以下职责:
– 通过APN从用户设备上的应用实例接收全球唯一的应用专用设备令牌和其他相关数据。 这允许提供者了解应用程序的每个正在运行的实例。
– 根据通知系统的devise确定何时需要将远程通知发送到每个设备。
– build立并向APN发送通知请求,每个请求包含通知有效载荷和传送信息; APN随后以您的名义向相关设备发送相应的通知。

对于提供者发送的每个远程通知请求,它必须:
– 如创build远程通知有效负载中所述,构build包含通知负载的JSON字典。
– 将有效载荷,全局唯一的设备令牌和其他传递信息添加到HTTP / 2请求中。 有关设备令牌的信息,请参阅APNs到设备连接信任和设备令牌。 有关HTTP / 2请求格式的信息以及APN可能的响应和错误,请参阅与APN进行通信。
– 通过永久的安全通道,将HTTP / 2请求发送给APN,包括以令牌或证书forms的encryption凭证。
安全体系结构中描述了build立这个安全通道。

使用多个提供者

图1-2描述了APN为运行应用程序的设备启用的虚拟networking。 要处理通知负载,您通常会部署多个提供程序,每个提供程序都有自己的与APN持久且安全的连接。 然后每个提供者可以发送针对提供者具有有效设备令牌的任何设备的通知请求。

图1-2将来自多个提供者的远程通知推送到多个设备

图片:../Art/remote_notif_multiple.jpg

服务质量,存储转发和合并通知

Apple推送通知服务包括执行存储转发function的服务质量(QoS)组件。 如果APN尝试发送通知,而目标设备处于脱机状态,则APN将在一段有限的时间内存储通知,并在设备再次可用时将其发送。 此组件仅存储每个设备和每个应用的最近通知。 如果设备处于脱机状态,则发送针对该设备的通知请求会导致先前的请求被丢弃。 如果设备长时间保持离线状态,则其在APN中存储的所有通知都将被丢弃。

要允许合并类似的通知,可以在通知请求中包含合拢标识符。 通常情况下,当设备处于联机状态时,您发送给APN的每个通知请求都会通知设备。 但是,当您的HTTP / 2请求标头中存在apns-collapse-id密钥时,APN会合并该密钥的值相同的请求。 例如,发送相同标题两次的新闻服务可以为这两个请求使用相同的折叠标识符值。 然后,APN会将这两个请求合并为一个单一的通知传递给设备。 有关apns-collapse-id密钥的详细信息。

安全架构

APN使用两个级别的信任(连接信任和设备令牌信任)实施端到端的encryptionvalidation和validation。

连接信任在提供者和APN之间以及在APN和设备之间起作用。

设备令牌信任对于每个远程通知端对端工作。 它确保通知只在正确的开始(提供者)和结束(设备)点之间路由。

设备标记是一个不透明的NSData实例,它包含由Apple分配给特定设备上的特定应用程序的唯一标识符。 只有APN可以解码和读取设备令牌的内容。 每个应用程序实例在向APN注册时都会收到其唯一的设备令牌,然后必须将该令牌转发给其提供程序,如configuration远程通知支持中所述。 提供者必须将设备令牌包含在每个针对关联设备的推送通知请求中; APN使用设备令牌来确保通知仅传递给它所针对的唯一应用程序设备组合。

APN可以出于各种原因发出新的设备令牌:
– 用户将您的应用程序安装在新设备上
– 用户从备份恢复设备
– 用户重新安装操作系统
– 其他系统定义的事件

因此,应用程序必须在启动时请求设备令牌,如APNs到设备连接信任和设备令牌中所述。 有关代码示例,请参阅注册以接收远程通知。

要使用APNbuild立基于HTTP / 2的TLS会话,您必须确保每个提供商都安装了GeoTrust Global CA根证书。 如果提供者正在运行macOS,则默认情况下此根证书位于钥匙串中。 在其他系统上,这个证书可能需要明确的安装。 您可以从GeoTrust根证书网站下载此证书。 这是证书的直接链接。

图1-3说明了使用基于HTTP / 2的APNs提供程序APIbuild立信任关系,并使用JWT提供程序authentication令牌发送通知。

图1-3build立并使用基于令牌的提供者连接信任 image:../Art/service_provider_ct.jpg 如图1-3所示,基于令牌的提供商信任如下所示:

您的提供商要求使用传输层安全性(TLS)与APNbuild立安全连接,如图中标有“TLS启动”的箭头所示。 APN然后为您的提供商提供一个APNs证书,由图中的下一个箭头(标记为“APNs证书”)表示,供应商随后将对其进行validation。 此时,连接信任已build立,您的提供商服务器已启用将基于令牌的远程推送通知请求发送给APN。 您的提供商发送的每个通知请求必须附带一个JWT身份validation令牌,如图中所示,标记为“通知推送”的箭头。APN回复每个推送,在图中表示为标有“HTTP / 2响应”的箭头。有关您的提供商可以针对此步骤收到的响应的具体信息,请参阅来自APN的HTTP / 2响应。

图1-4说明了使用Apple颁发的SSL证书来build立提供者与APN之间的信任关系。 与图1-3不同,此图不显示通知推送本身,而是在build立传输层安全性(TLS)连接时停止。 在基于证书的信任scheme中,推送通知请求未通过身份validation,但是使用随附的设备令牌进行validation。

图1-4build立基于证书的提供者连接信任 image:../Art/service_provider_ct_certificate_2x.png

如图1-4所示,基于证书的提供者到APNs信任如下工作:

您的提供商要求使用传输层安全性(TLS)与APNbuild立安全连接,如图中标有“TLS启动”的箭头所示。 APN然后为您的提供商提供一个APNs证书,由图中的下一个箭头(标记为“APNs证书”)表示,供应商随后将对其进行validation。 然后,您的提供商必须将其Apple提供的提供商证书(您之前从在线开发者帐户获得,如Xcode帮助中的“生成通用APNs客户端SSL证书”中所述)发送回APN,标记为“Provider证书“。然后,APNvalidation您的提供者证书,从而确认连接请求源自合法提供者,并build立您的TLS连接。 此时,连接信任已build立,您的提供商服务器已启用将基于证书的远程推送通知请求发送到APN。 APNs到设备连接信任和设备令牌

如本节所述,APN和每台设备之间的信任会自动build立,无需参与您的应用程序。

每个设备都有一个encryption证书和一个私人encryption密钥,由操作系统在初始设备激活时提供并存储在设备的钥匙串中。 在激活期间,APN根据证书和密钥对设备的连接进行validation和validation,如图6-5所示。

图1-5build立设备与APN的连接信任 image:../Art/service_device_ct.jpg 如图1-5所示,APN对设备的信任如下:

信任协商在设备启动与APN的TLS连接时开始,如图中的顶部箭头所示。 APNs将APNs证书返回给设备。 操作系统validation此证书,然后如“设备证书”箭头所示,将设备证书发送到APN。 最后,如图中底部箭头所示,APNvalidation设备证书,build立信任。 通过在APN和设备之间build立TLS连接,设备上的应用程序可以向APN注册,以接收其应用程序特定设备令牌以进行远程通知。 有关详细信息和代码示例,请参阅在configuration远程通知支持中注册以接收远程通知。

收到设备令牌后,应用程序必须连接到应用程序的相关提供程序,并将令牌转发给它。 此步骤是必需的,因为提供商必须在发送通知请求时将设备令牌包含在APN中,以设备为目标。 您为转发令牌而编写的代码也显示在注册接收远程通知中。

无论用户是第一次激活设备还是APN发出了新的设备令牌,过程都是类似的,如图6-6所示。

图1-6pipe理设备令牌 image:../Art/token_generation.jpg 获取和处理特定于应用程序的设备令牌的工作方式如下:

您的应用程序向APN注册以进行远程通知,如顶部箭头所示。 如果应用程序已经注册,且应用程序特定的设备令牌没有更改,系统会将现有的令牌快速返回到应用程序,并且此过程跳到步骤4。

当需要新的设备令牌时,APN使用设备证书中包含的信息生成一个令牌。 它使用令牌密钥encryption令牌,并将其返回给设备,如中间的右箭头所示。 系统通过调用您的应用程序:didRegisterForRemoteNotificationsWithDeviceToken:delegate方法将设备令牌传回您的应用程序。 收到令牌后,您的应用(在委托方法中)必须以二进制或hex格式将其转发给您的提供者。 没有此令牌,您的提供者不能发送通知给设备。 有关详细信息,请参阅在configuration远程通知支持中注册以接收远程通知。

重要
APN设备令牌长度可变。 不要硬编码它们的大小。

当您的提供商向APN发送推送通知请求时,它会包含标识唯一应用程序设备组合的设备标记。 图6-7中提供者和APN之间的“令牌,有效载荷”箭头显示了此步骤。 APN解密令牌以确保请求的有效性并确定目标设备。 如果APN确定发件人和收件人是合法的,则它将通知发送到已识别的设备。

图1-7提供者到设备的远程通知path image:../Art/token_trust.jpg

设备收到通知后(并在图1-7所示的最后一步之后),系统会将远程通知转发给您的应用程序。

参考: 苹果推送通知服务

在这篇文章中有一个非常好的推送通知exaplanation。

在iOS中,应用程序不能在后台做很多事情。 应用程序只允许进行有限的一系列活动,以便节省电池寿命。

但是如果发生了一些有趣的事情,并且希望让用户知道这一点,即使他们目前还没有使用你的应用程序呢?