iOS推送通知如何工作?

And*_*Hin 90 push-notification apple-push-notifications ios

如果没有设备需要轮询服务器,iOS"推送"通知如何传递到特定设备?

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

Kar*_*gat 78

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

在此输入图像描述


Pan*_*ack 46

对我来说,发表评论太过分了.

从文档中.

Apple推送通知服务(APN)将推送通知传播到具有已注册接收这些通知的应用程序的设备.每个设备都与服务建立经过认证和加密的IP连接,并通过此持久连接接收通知.提供商通过持久且安全的通道与APN连接,同时监控用于其客户端应用程序的传入数据.当应用程序的新数据到达时,提供程序准备并通过通道向APN发送通知,APN将通知推送到目标设备.

我建议阅读文档以获取更多信息以及如何使用和配置.一切都在那里.

推送通知

  • 那么Apple为您的设备维护静态IP? (6认同)
  • 所以设备总是与APN服务保持长轮询/套接字连接?如果是这种情况,那么APN服务如何处理如此多的连接 - 如果服务器可以容纳50k连接并且总共有5亿用户,则服务至少需要10000台服务器.这是一个实际的场景吗? (5认同)
  • @CMCDragonkai设备建立连接,而不是服务器. (4认同)

Udi*_*wal 20

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

在此输入图像描述


Kru*_*nal 16

APNs概述

Apple推送通知服务(APN)是远程通知功能的核心.它是一种强大,安全且高效的服务,可供应用程序开发人员将信息传播到iOS(以及间接的watchOS),tvOS和macOS设备.

在用户设备上首次启动应用程序时,系统会自动在您的应用程序和APN之间建立经过认证,加密且持久的IP连接.此连接允许您的应用执行设置以使其能够接收通知,如配置远程通知支持中所述.

用于发送通知的另一半连接 - 提供商服务器和APN之间的持久安全通道 - 需要在您的在线开发者帐户中进行配置以及使用Apple提供的加密证书.提供程序是您配置为使用APN的部署和管理的服务器.图1-1显示了远程通知的传递路径.

图1-1从提供商向应用程序发送远程通知

图片:../ Art /remote_notif_simple.jpg

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

如果应用程序的通知在设备启动但应用程序未运行时到达,系统仍可显示通知.如果在APN发送通知时设备已关闭,则APN会保留通知并稍后再次尝试(有关详细信息,请参阅服务质量,存储转发和合并通知).

提供者责任

您的提供商服务器对于参与APN具有以下责任:

  • 通过APN从用户设备上的应用实例接收全球唯一的应用专用设备令牌和其他相关数据.这允许提供者了解应用程序的每个运行实例.
  • 根据通知系统的设计确定何时需要将远程通知发送到每个设备.
  • 建立并向APN发送通知请求,每个请求包含通知有效载荷和传递信息; 然后,APN代表您向目标设备发送相应的通知.

对于提供者发送的每个远程通知请求,它必须:

  • 构造包含通知有效负载的JSON字典,如创建远程通知有效负载中所述.
  • 将有效负载,全局唯一的设备令牌和其他传递信息添加到HTTP/2请求.有关设备令牌的信息,请参阅APN到设备连接信任和设备令牌.有关HTTP/2请求格式以及APN可能的响应和错误的信息,请参阅与APN通信.
  • 通过持久的安全通道将HTTP/2请求发送到APN,包括令牌或证书形式的加密凭证.
  • 安全体系结构中描述了建立此安全通道.

使用多个提供商

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

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

图片:../ Art /remote_notif_multiple.jpg

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

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

要允许合并类似通知,您可以在通知请求中包含折叠标识符.通常,当设备在线时,您发送给APN的每个通知请求都会导致向设备发送通知.但是,当HTTP/2请求标头中存在apns-collapse-id密钥时,APN会合并其密钥值相同的请求.例如,两次发送相同标题的新闻服务可以对两个请求使用相同的折叠标识符值.然后,APN将这两个请求合并为一个通知,以便传送到设备.有关apns-collapse-id键的详细信息.

安全架构

APN使用两个信任级别强制执行端到端加密验证和身份验证:连接信任和设备令牌信任.

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

设备令牌信任对每个远程通知都是端到端的.它确保仅在正确的开始(提供者)和结束(设备)点之间路由通知.

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

APN可以出于各种原因发布新的设备令牌:

  • 用户在新设备上安装您的应用
  • 用户从备份恢复设备
  • 用户重新安装操作系统
  • 其他系统定义的事件

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

要与APN建立基于HTTP/2的TLS会话,必须确保在每个提供程序上安装GeoTrust全局CA根证书.如果提供程序正在运行macOS,则默认情况下此根证书位于密钥链中.在其他系统上,此证书可能需要显式安装.您可以从GeoTrust Root Certificates网站下载此证书.这是证书的直接链接.

图1-3说明了使用基于HTTP/2的APN提供程序API建立信任,以及使用JWT提供程序身份验证令牌发送通知.

图1-3建立和使用基于令牌的提供者连接信任

图片:../ Art /service_provider_ct.jpg

如图1-3所示,基于令牌的提供者信任的工作方式如下:

您的提供商要求使用传输层安全性(TLS)与APN进行安全连接,在图中标记为"TLS启动"的箭头.

然后,APN会向您的提供商提供APNs证书,该证书由图中的下一个箭头(标记为"APNs证书")表示,然后您的提供商将对其进行验证.

此时,建立连接信任,并且您的提供程序服务器已启用,以向APN发送基于令牌的远程推送通知请求.您的提供商发送的每个通知请求必须附带一个JWT身份验证令牌,在图中表示为标记为"通知推送"的箭头.

APN回复每次推送,在图中表示为标记为"HTTP/2响应"的箭头.

有关此提供商可以收到的响应的详细信息,请参阅APN的HTTP/2响应.

图1-4说明了使用Apple颁发的SSL证书在提供商和APN之间建立信任.与图1-3不同,此图不显示通知推送本身,但在建立传输层安全性(TLS)连接时停止.在基于证书的信任方案中,推送通知请求未经过身份验证,但使用随附的设备令牌进行验证.

图1-4建立基于证书的提供者连接信任

图片:../ Art/service_provider_ct_certificate_2x.png

如图1-4所示,基于证书的Provider-to-APNs信任的工作原理如下:

您的提供商要求使用传输层安全性(TLS)与APN进行安全连接,在图中标记为"TLS启动"的箭头.

然后,APN会向您的提供商提供APNs证书,该证书由图中的下一个箭头(标记为"APNs证书")表示,然后您的提供商将对其进行验证.

然后,您的提供商必须将其Apple配置的提供商证书(您之前从在线开发者帐户获得的证书,如Xcode帮助中的"生成通用APN客户端SSL证书"中所述)发送回APN,表示为标记为"提供商"的箭头证书."

然后,APN验证您的提供商证书,从而确认连接请求来自合法提供商,并建立您的TLS连接.

此时,建立连接信任并启用提供程序服务器以向APN发送基于证书的远程推送通知请求.

APN到设备连接信任和设备令牌

APN和每个设备之间的信任是自动建立的,没有您的应用程序参与,如本节所述.

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

图1-5建立设备与APN之间的连接信任

图片:../ Art/service_device_ct.jpg

如图1-5所示,APN到设备信任的工作原理如下:

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

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

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

图1-6管理设备令牌

图片:../ Art /token_generation.jpg

获取和处理特定于应用程序的设备令牌的工作方式如下:

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

当需要新的设备令牌时,APN使用设备证书中包含的信息生成一个令牌.它使用令牌密钥加密令牌并将其返回到设备,如中间的右箭头所示.

系统通过调用您的应用程序将设备令牌传送回您的应用程序:didRegisterForRemoteNotificationsWithDeviceToken:delegate方法.

收到令牌后,您的应用程序(在委托方法中)必须以二进制或十六进制格式将其转发给您的提供程序.如果没有此令牌,您的提供商无法向设备发送通知.有关详细信息,请参阅配置远程通知支持中的注册以接收远程通知.

重要

APN设备令牌的长度可变.不要硬编码他们的大小.

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

图1-7从提供商到设备的远程通知路径

图片:../ Art/token_trust.jpg

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

参考:Apple推送通知服务

现在,请看这里了解技术流程:如何在iOS应用程序上实现Apple推送通知服务?

  • 哈哈,你真的只是将整个Apple Docs条目粘贴到SO中! (3认同)

小智 14

设备不会继续轮询服务器以获取推送通知.

为了简单起见,请考虑将iPhone连接到互联网.在连接到互联网时iPhone建立与Apple推送通知服务器的连接此连接是开放连接,这意味着数据可以在数据到达服务器时从服务器投放到iPhone.

Apple不会将HTTP协议用于推送通知,但如果您了解HTTP协议,它几乎就是一种类似的方法.

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