APNs 原理

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).

远程通知 从公司的服务器开始。我们决定何时向用户发送通知。在发送通知时,我们将生成包含通知数据和用户设备的唯一标识符的请求。然后将请求转发给 APNsAPNs 处理将通知传递给用户的设备。收到通知后,用户设备上的操作系统会处理任何用户交互并将通知发送到 应用程序

远程通知流程

APNs 概述

Apple 推送通知服务(APNs) 是远程通知功能的核心。这是一个强大,安全和高效的服务;首次在用户设备上启动应用程序时,将在 应用程序APNs 之间自动建立经过身份验证的永久加密IP连接。在应用程序中使用此连接,应用程序开发人员可以将信息分发到iOS(和间接watchOS),tvOS,macOS设备。

从提供者到应用程序的远程通知的传递

一旦Provider server应用程序 设置了推送通知,服务器就可以向 APNs 发送通知请求。APNs 将相应的通知有效负载发送到每个目标设备。接收通知的系统将有效载荷传递给设备上的相应 应用程序 并管理与用户的交互。

使用 APNs 注册应用程序

APNs 必须先知道用户设备的地址,然后才能向该设备发送通知。此地址采用设备令牌的形式,该设备令牌对于设备和应用程序都是唯一的。在启动时,应用程序APNs 通信并接收其设备令牌,然后应用程序将其转发到提供商服务器。

即使两个应用程序都安装在同一设备上,一个应用程序的设备令牌也无法用于其他应用程序。两个应用都必须请求自己唯一的设备令牌并将其转发到提供商服务器。

设备令牌(Device token)

使用 APNs 注册应用程序并接收全球唯一的 Device token ,该令牌实际上是当前设备上的应用程序的地址。提供商服务器必须先具有此令牌才能向设备发送通知。

每次使用 Apple 提供的 API 启动应用程序时,都会去 APNs 注册并接收设备令牌。

设备注册远程推送服务从 APNs 获取令牌过程
Apple Push Notification 工作机制
  • 应用程序 注册消息推送;
  • 应用程序APNsdevice 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 serverAPNs 之间建立连接信任是确保连接的可靠性,是 Provider serverAPNs 发送推送通知请求的先决条件;

  • APNs设备 之间建立连接信任是确保只有经过身份验证的设备才能连接到 APNs 并接收通知。APNs 自动与设备建立连接信任,并保证设备的有效性。

Provider server 和 APNs 之间的连接信任

有两种方法可以在 Provider serverAPNs 之间建立连接信任。

基于令牌的提供者连接信任。使用基于 HTTP/2 的 API 的提供程序可以使用 JSON Web令牌(JWT)来提供与 APNs 连接的验证凭据。在这种情况下,请生成密钥对并将公钥传递给 Apple。将私钥保留在提供者端以防止泄漏。然后创建 JWT 提供程序身份验证令牌并使用私钥对其进行签名。此提供程序为每个推送通知请求附加身份验证令牌。

通过在提供者和 APNs 之间使用单个基于令牌的连接,我们可以向在线开发者帐户中具有 Bundle ID 的所有应用程序发送推送通知请求。

对于每个推送通知请求,来自 APNsHTTP/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证书就是在开发者官网申请的。

建立基于证书的 Provider server 连接信任的过程

基于证书的提供者与 APNs 之间的信任关系如下:

  1. 服务器要求 APNs 通过 TLS协议(传输层安全性)建立安全连接(图“箭头TLS启动”中的箭头)。

  2. APNs 将 APNs证书(公钥)返回给服务器(图中的箭头“APNs证书”)。

  3. 服务器收到 APNs证书 后进行验证并生成 Provider server 证书后再返回给 APNs。查看获得提供者证书“箭头”。

  4. APNs 验证 服务器传来的证书,在确认连接请求来自合法提供者后建立TLS连接。其中 APNs 用的不是 HTTPS ,而是 HTTP/2
    建立连接信任后。提供程序服务器就已准备好向 APNs 发送基于证书的远程推送通知请求。

APNS - 设备与设备令牌之间的连接信任

APNs 和每个设备之间的信任是自动建立的,不涉及应用程序。
每个设备都有加密证书和密钥。它在激活期间由操作系统提供并存储在密钥链中。在激活期间,APNs 根据证书和密钥验证并验证与设备的连接。

设备和 APNs 之间建立连接信任的过程

APN与设备之间的信任关系如下:

  1. 当设备启动与 APNsTLS 连接时,信任协商开始(图中顶部的箭头)。

  2. APNsAPNs证书 返回给设备。

  3. 操作系统验证此证书后,它会向 APNs 发送设备证书(图“设备证书”中的箭头)。

  4. 最后,APNs 验证设备证书并建立信任(图中底部的箭头)。

由于在 APNs 和设备之间建立了 TLS连接 ,因此设备上的应用程序可以向 APNs注册并接收特定于应用程序的设备令牌以进行远程通知。

在收到设备令牌后,应用程序必须连接到与应用程序关联的提供程序,并将令牌转发给该提供程序。然后服务器将请求发送到 APNs 时将设备令牌嵌入请求中。

如果用户第一次激活设备 或 APNs 发出新设备令牌,则过程类似(参见下图)。

设备令牌管理

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

  1. 应用程序向 APNs 注册以进行远程通知(图中顶部的箭头)。如果应用程序已注册且应用程序特定设备令牌尚未更改,则现有令牌将立即返回到应用程序,并将在下一步骤4执行。

  2. 如果需要新的设备令牌,则使用设备证书中包含的信息生成 APNs。接下来,使用令牌密钥加密令牌并将其返回到设备(右箭头指向图中间)。

  3. 系统通过调用委托方法application:didRegisterForRemoteNotificationsWithDeviceToken:
    将设备令牌返回给应用程序。

  4. 应用程序(在委托方法中)接受此标记,并以二进制或十六进制字符串的形式将其转发给提供程序。如果没有此令牌,提供程序将无法向设备发送通知。

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

当提供商向 APNs 发送推送通知请求时,它在请求中嵌入设备令牌,该令牌唯一地标识应用程序和设备的组合。在下图中,连接提供者和 APNs 的箭头 Token,Payload 表示此过程。通过解密令牌,APNs 保证请求的有效性并识别目标设备。如果 APNs 判断发件人和收件人有效,则会向指定设备发送通知。

从提供商发送到设备的远程通知路由

在设备接收到通知之后(此外,在完成上图中的最后一步之后),系统将远程通知转发给应用程序。

供应程序

我们只能将 APNs 用于通过 iOS App StoretvOS App StoreMac App Store企业应用程序 分发的应用程序。必须完成使用 APNs 的配置和代码签名。此设置的大部分由团队的开发人员通过开发者账号创建提供。

参照 Apple 官方文档整理,有错误请纠正~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容