你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

教程:在 iOS 应用中创建推送通知

本教程介绍如何使用 Azure 通信服务聊天 SDK 在 iOS 应用中创建推送通知。

推送通知可在移动应用未在前台运行时提醒用户,向其显示聊天线程中的传入消息。 Azure 通信服务支持两个版本的推送通知:

  • 基本版本:锁屏提醒编号显示在应用的图标上,设备播放通知声音,并显示弹出警报横幅。

    推送通知的基本版本的屏幕截图。

  • 高级版本:除了基本版本支持的功能外,你还可以在警报横幅中自定义标题和消息预览。

    推送通知的高级版本的屏幕截图。

在本教程中,你将了解:

  • 设置 Apple Push Notification 服务 (APNs) 证书。
  • 为推送通知配置 Xcode。
  • 实现基本或高级版本的推送通知。
  • 在应用中测试通知。
  • 为推送通知设置自动注册续订。

下载代码

GitHub 上访问本教程的示例代码。

先决条件

创建 .p12 APNs 证书,并在通知中心中对其进行设置

如果你不是 Microsoft 内部客户,请执行以下过程中的所有步骤。

如果你是 Microsoft 内部客户,请提交票证并提供应用的程序包 ID 以获取 .p12 证书。 然后跳到以下过程中的最后一步。

  1. 登录到 Apple 开发人员门户

  2. 转到“证书、标识符和档案”>“标识符”>“应用 ID”,然后选择与你的应用关联的应用 ID。

    显示用于选择应用 ID 的选项的屏幕截图。

  3. 在你的应用 ID 的页面上,选择“功能”>“推送通知”,然后选择“保存”

    显示用于编辑应用 ID 配置的选项的屏幕截图。

  4. 在显示的“修改应用功能”对话框中,选择“确认”。

    显示修改应用功能的“确认”按钮的屏幕截图。

  5. 在你的应用 ID 的页面上,选择“功能”>“推送通知”>“配置”,然后进行以下选择:

    • 若要在开发 iOS 应用期间测试推送通知,请选择“开发 SSL 证书”下的“创建证书”按钮。
    • 若要在生产环境中发送推送通知,请选择“生产 SSL 证书”下的“创建证书”按钮

    显示用于创建开发证书或生产证书的选项的屏幕截图。

  6. “创建新证书”区域显示在“证书、标识符和档案”页面上。

    显示用于上传证书签名请求的选项的屏幕截图。

    在此区域中,上传证书签名请求 (CSR):

    1. 在新的浏览器标签中,按照此 Apple 帮助页面的说明创建 CSR 并将文件另存为“应用名称.cer”。 说明包括使用证书助手请求证书并填写证书信息。

      显示用于从证书颁发机构请求证书的选项的屏幕截图。

      显示填写证书信息的示例的屏幕截图。

    2. 将.cer 文件拖到“选择文件”区域。 然后选择右上角的“继续”

      用于选择证书文件的区域的屏幕截图。

  7. 选择下载

    用于下载证书的按钮的屏幕截图。

  8. 以 .p12 格式将文件保存在本地。

    显示用于保存证书文件的区域的屏幕截图。

  9. 打开下载的 .cer 文件。 在“密钥链访问”中,选择你的证书,右键单击该证书,然后以 .p12 格式导出证书。

  10. 转到通知中心。 在“设置”下,选择“Apple (APNS)”。 然后填写证书详细信息:

    • 对于“身份验证模式”,请选择“证书”
    • 对于“上传证书”,请上传刚刚创建的 .p12 文件
    • 对于“应用程序模式”,请根据需要选择相应模式。

    输入完所有信息后,选择“保存”

    显示通知中心的应用程序和证书设置的屏幕截图。

配置 Xcode

  1. 在 Xcode 中,转到“签名和功能”

  2. 选择“+功能”来添加一项功能,然后选择“推送通知”

  3. 选择“+功能”来再添加一项功能,然后选择“背景模式”

  4. 在“后台模式”下,选择“远程通知”

    显示如何在 Xcode 中添加推送通知和后台模式的屏幕截图。

  5. 对于“Pod 目标 - AzureCore”,请将“仅需要应用扩展安全 API”设置为“否”

实现推送通知

基本版本

如果要实现基本版本的推送通知,则需要向 APNs 注册远程通知。 请参阅示例代码,以了解 AppDelegate.swift 中的相关实现。

高级版本

如果要实现高级版本的推送通知,则需要在应用中包含以下各项。 这是因为加密推送通知有效负载中的客户内容(例如聊天消息内容和发件人显示名称)需要一些变通方法。

加密密钥的数据存储

在 iOS 设备中创建持久性数据存储。 此数据存储应该能够在主应用和应用扩展之间共享数据。

在本教程的示例代码中,请通过执行以下操作,选择将“应用组”作为数据存储:

  • 按照 Apple 文章向应用添加功能中的步骤将应用组功能添加到应用的目标(主应用和应用扩展)。

  • 按照 Apple 文章配置应用组中的步骤配置应用组。 请确保主应用和应用扩展具有相同的容器名称。

通知服务扩展

实现与主应用捆绑的通知服务扩展。 此应用扩展用于在设备收到推送通知有效负载后对其进行解密。

  1. 转到 Apple 文档中的向项目添加服务应用扩展,并按照其中的步骤操作。

  2. 转到 Apple 文档中的实现扩展的处理程序方法。 Apple 将提供用于解密数据的默认代码,你可以遵循本教程的整体结构。 但是,由于是使用聊天 SDK 进行解密,因此需要将从 // Try to decode the encrypted message data 开始的部分替换为自定义逻辑。 请参阅示例代码,以了解 NotificationService.swift 中的相关实现。

PushNotificationKeyStorage 协议的实现

高级版本的推送通知需要 PushNotificationKeyStorage 协议。 你可以使用聊天 SDK 提供的默认 AppGroupPushNotificationKeyStorage 类。 如果不使用应用组作为密钥存储,或者想要自定义密钥存储方法,请创建自己的符合 PushNotificationKeyStorage 协议的类。

PushNotificationKeyStorage 将定义两种方法:

  • onPersistKey(encryptionKey:expiryTime):此方法用于将加密密钥持久保存在用户 iOS 设备的存储中。 聊天 SDK 将 45 分钟设置为加密密钥的过期时间。 如果希望推送通知的有效时间超过 45 分钟,则需要更频繁地安排 chatClient.startPushNotifications(deviceToken:) 调用(例如每 15 分钟一次),以便在旧加密密钥过期之前注册新的密钥。

  • onRetrieveKeys() -> [String]:此方法用于检索以前存储的有效密钥。 你可以根据之前选择的数据存储灵活地提供自定义。

在协议扩展中,聊天 SDK 将提供你可以使用的 decryptPayload(notification:) -> PushNotificationEvent 方法的实现。 请参阅示例代码,以了解 NotificationService.swift 中的相关实现。

测试通知

  1. 创建用户 A 与用户 B 的聊天线程。

  2. 下载 GitHub 示例应用存储库

  3. 将用户 A 的 <ACESS_TOKEN> 值和 <ACS_RESOURCE_ENDPOINT> 值放入 AppSettings.plist

  4. 将两个 Pod 目标(AzureCommunicationChat 和 Trouter)的“启用位码”设置为“否”

  5. 将 iOS 设备插入 Mac 并运行程序。 当系统要求你在设备上授权推送通知时,请选择“允许”。

  6. 作为用户 B,发送聊天消息。 确认用户 A 在 iOS 设备上收到推送通知。

实现注册续订

为确保 Microsoft 提供安全的聊天服务,iOS 设备上的推送通知注册有效期仅为 45 分钟。 若要维护推送通知的功能,需要在客户端应用中实现注册续订。

本教程提出了两个符合 Apple 官方准则的解决方案。 建议将这两种解决方案一起实施,以提高其有效性。

注意

各种因素都可能会影响其中任一解决方案的有效性。 例如,设备的电池状态、网络条件和特定于 iOS 的限制可能会影响应用运行后台任务的能力。 有关详细信息,请参阅 Apple 提供的应用后台执行的进展视频,以及将后台更新推送到应用一文。

解决方案 1:后台任务

即使应用不在前台,后台任务也会提供一种方式来执行活动。 当你实现后台任务时,应用可以请求更多时间来完成特定任务,例如对推送通知注册进行续订。

以下部分介绍了如何使用后台任务进行注册续订。

配置用户访问令牌的自动刷新

若要确保对聊天服务的不间断访问,需要维护有效的用户访问令牌。 令牌的默认有效期通常为 24 小时,之后令牌将过期并需要续订。 实现自动刷新机制有助于保证无论何时激活聊天应用程序,令牌都是有效的。

聊天 SDK 通过在实现自定义访问令牌刷新程序时自动执行刷新过程来简化令牌管理。 请完成以下步骤,将聊天应用程序配置为支持自动令牌刷新:

  1. 若要帮助确保聊天应用程序保持持续且安全的用户访问,你需要实现专用于颁发令牌的服务层级。 一个选项是将 Azure Functions 用于此目的。

    若要创建 Azure 函数,请参阅使用 Azure Functions 生成受信任的用户访问服务一文。 文中介绍了如何设置函数应用并部署用于颁发令牌的必要代码。

  2. 配置 Azure 函数后:

    1. 从 Azure 门户获取令牌颁发者 URL。 你的聊天应用程序将使用此 URL 请求新令牌。

    2. 在聊天应用程序中创建并集成令牌刷新器。 此组件将请求新的令牌并初始化聊天客户端,以便实现无缝的自动令牌续订。

      GitHub 示例应用存储库中提供了令牌刷新器的示例代码及其与聊天客户端的集成。

启用和计划后台任务

若要在 iOS 应用中激活和计划后台任务,请按照 Apple 文章使用后台任务更新应用中的步骤进行操作。

有关实际实现,请参阅 GitHub 示例应用存储库。 提供的示例使用了配置为在未来一分钟内启动的 BGProcessingTask,演示了如何高效地在后台提取数据。

解决方案 2:远程通知

远程通知是 iOS 应用程序在响应外部触发器时运行后台任务的机制。 你可以在没有用户干预的情况下将远程通知用于刷新注册等任务。

若要使用远程通知来运行后台任务,请执行以下操作:

  1. 实现一种触发机制。

    例如,可以使用 Azure 函数应用作为触发机制。 它使你能够运行代码来响应各种触发器,包括 HTTP 请求,因此非常适合用来启动无提示推送通知。 请记住,需要在你这一端实现设备注册表,以便函数应用知道在何处传递通知。

  2. 设置通知中心。

    Azure 通知中心服务提供了可缩放的推送通知基础结构,可将通知从任何后端(云或本地)发送到任何平台(iOS、Android、Windows 等)。

    可以重复使用用于常规推送通知的相同通知中心。 若要设置新的通知中心,请参阅 Azure 通知中心文档

  3. 配置 Azure 函数应用,以发送定期通知。

    调整函数应用,以定期通过通知中心发送远程通知。 这些通知将转发到 APNs 并定向到指定的设备。 有关更多说明,请参阅 Azure Functions 的通知中心输出绑定

  4. 处理应用中的通知。

    在 iOS 应用中,实现应用程序实例方法,以便在收到无提示通知时触发对注册的自动刷新。

有关详细信息,请参阅 Apple 文章设置远程通知服务器