iOS推送通知如何工作?


98

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

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


2
@Wain我正在寻找技术层面的详细说明。那篇文章水平很高。因此,我的设备始终保持与Apple推送服务器的开放连接吗?
Andy Hin

我更熟悉android push,但通常,当您安装应用程序时,它将向Apple注册具有唯一ID的设备。然后,当facebook向苹果发送消息时,苹果会将其转发到设备的唯一ID。
巴拿马杰克

6
@Pjack是的,但是随着我的设备不断变化的不同的信号塔,不同的wifi网络,Apple如何知道我唯一ID的IP?
Andy Hin

@whydna感谢您提出这个问题。我想完全理解同一件事。我相信,在这里这个回答我的问题:stackoverflow.com/questions/18859732/...
太空飞鼠

@AndyHin设备操作系统(iOS)知道哪个APNs服务器有效。设备正在连接到这些服务器,并保持连接打开。此连接可能与设备ID和其他元数据(电话号码)相关联。当需要“推送”消息时,APN会找到正确的连接并将其发送到该已经打开的连接。因此,APN不会尝试建立与设备的连接,而是总是由该设备打开该连接。每个设备一个连接。
托德

Answers:


49

因此,我对此发表评论实在太多了。

从文档中。

Apple推送通知服务(APN)将推送通知传播到已注册应用程序以接收那些通知的设备。每个设备都与服务建立一个经过认证和加密的IP连接,并通过该持久连接接收通知。提供程序通过持久且安全的通道与APN连接,同时监视旨在为其客户端应用程序提供的传​​入数据。当应用程序的新数据到达时,提供者准备并通过通道将通知发送到APN,APN将通知推送到目标设备。

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

推送通知


谢谢你的回答。
MightyMouse

7
那么Apple为您的设备维护一个静态IP吗?
CMCDragonkai 2014年

我不知道我的服务器是否必须向每个目标设备的APNS发送通知!:(
弗拉基米尔

4
@CMCDragonkai设备建立连接,而不是服务器。
Hitechcomputergeek

7
因此,设备始终与APN服务保持长轮询/套接字类的连接?如果是这样,那么APN服务如何处理这么多的连接-如果服务器可以容纳5万个连接并且始终有5亿用户,则服务至少需要10000台服务器。这是实际的情况吗?
AV94

87

可以使用各自的唯一设备令牌用数据更新每个设备。这幅画说明了一切。。

在此处输入图片说明


知道设备令牌的用途是什么?它用于加密APNS服务器与App或其他地方之间的通信吗?
Mugen

1
@Mugen:APNS使用设备令牌来标识它应该转发提供程序发送的有效负载的设备!
D4ttatraya

@Karan-用于用户的通知(例如,“嘿,您有消息!”)和用于唤醒应用程序并悄悄告诉应用程序进行某些后台处理的通知之间是否有区别?
Howiecamp '17

@Howiecamp如果您使用的是推送通知,则在应用程序正在运行时,只要收到通知,就会收到通知。当用户从通知中心点击通知并启动应用程序时,也可以访问活动的通知详细信息。在这段时间内,您可以执行所需的过程。
卡兰·阿兰加特

@KaranAlangat,这里如何处理徽章计数?服务器如何知道的?
GvSharma


21

APNs概述

Apple Push Notification Service(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请求。有关设备令牌的信息,请参阅APNs到设备的连接信任和设备令牌。有关HTTP / 2请求格式以及APN可能的响应和错误的信息,请参阅与APN通信。
  • 通过持久安全的通道将HTTP / 2请求发送到APN,包括令牌或证书形式的加密凭据。
  • 安全体系结构中介绍了建立此安全通道的方法。

使用多个提供者

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

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

图片:../ Art / remote_notif_multiple.jpg

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

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建立和使用基于令牌的提供商连接信任

图片:../ Art / service_provider_ct.jpg

如图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建立基于证书的提供商连接信任

图片:../ Art / service_provider_ct_certificate_2x.png

如图1-4所示,基于证书的提供商对APN的信任关系如下:

您的提供商要求使用传输层安全性(TLS)与APN进行安全连接,如图中标为“ TLS初始化”的箭头所示。

然后,APNs为您的提供商提供APNs证书,该证书由图中的下一个箭头表示(标记为“ APNs证书”),然后您的提供商对其进行验证。

然后,您的提供者必须将其Apple提供的提供者证书(您先前从在线开发者帐户获得的证书,如Xcode帮助中的“生成通用APNs客户端SSL证书”中所述)发送回APN,以箭头标记为“提供者”证书。”

然后,APNS会验证您的提供者证书,从而确认连接请求源自合法的提供者,并建立您的TLS连接。

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

APNs到设备的连接信任和设备令牌

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

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

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

图片:../ Art / service_device_ct.jpg

如图1-5所示,APN对设备的信任关系如下:

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

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

无论用户是首次激活设备,还是APN是否发布了新的设备令牌,过程都相似,如图6-6所示。

图1-6管理设备令牌

图片:../ Art / token_generation.jpg

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

您的应用已向APN注册以进行远程通知,如顶部箭头所示。如果该应用程序已经注册,并且该应用程序专用的设备令牌尚未更改,则系统会迅速将现有令牌返回给该应用程序,并且该过程跳至步骤4。

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

系统通过调用application:didRegisterForRemoteNotificationsWithDeviceToken:委托方法将设备令牌重新发送回您的应用程序。

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

重要

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

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

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

图片:../ Art / token_trust.jpg

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

参考:Apple Push Notification Service

现在,看这里了解技术流程:如何在iOS应用程序上实现Apple Push Notification Service?


7
哈哈,您实际上只是将整个Apple Docs条目粘贴到了SO中!
Matt Mc

@MattMc-是的,我不是SO的新手,当我发布此答案时,当时我发布了指向APNS的链接,但该链接不被视为SO的答案,所以我做到了.... :)
Krunal

1
实际上,这确实是正确的,比仅链接的答案要好得多;)
Matt Mc

14

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

为简单起见,请考虑将iPhone连接到互联网。在连接到Internet时,iPhone建立与Apple Push Notifications服务器的连接,此连接为开放连接,这意味着数据可以在到达服务器时从服务器抛出到iPhone。

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

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


如果不是http,他们使用什么?
Howiecamp '17

2

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

在iOS中,应用程序无法在后台执行很多操作。应用只能执行有限的活动集,因此可以节省电池寿命。

但是,如果发生了一些有趣的事情,并且您希望让用户知道这一点,即使他们当前未使用您的应用程序该怎么办?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.