本文介绍如何使用 Azure 通信服务聊天 SDK 在 iOS 应用中创建推送通知。
推送通知可在移动应用未在前台运行时提醒用户,向其显示聊天线程中的传入消息。 Azure 通信服务支持两个版本的推送通知:
基本版本:锁屏提醒编号显示在应用的图标上,设备播放通知声音,并显示弹出警报横幅。
创建
.p12
APN 证书并将其设置在通知中心
如果你不是Microsoft内部客户,请完成以下过程中的步骤来创建 Apple Push Notification 服务(APNs)证书。
如果你是Microsoft内部客户,
请提交票证
并提供应用的捆绑 ID 以获取
.p12
证书。 然后跳到以下过程中的最后一步。
登录到
Apple 开发人员门户
。
转到
证书、标识符和配置文件
>
标识符
>
应用 ID
,然后选择与应用关联的应用 ID。
打开下载的
.cer
文件。 在 Keychain Access 中,选择证书,右键单击它,然后以格式导出证书
.p12
。
转到通知中心。 在“设置”下,选择“Apple (APNS)”
。 然后填写证书详细信息:
对于“身份验证模式”,请选择“证书”
。
对于
上传证书
,请上传
.p12
所创建的文件。
对于“应用程序模式”,请根据需要选择相应
模式。
输入完所有信息后,选择“保存”
。
实现推送通知
如果要实现基本版本的推送通知,则需要向 APNs 注册远程通知。 有关相关
AppDelegate.swift
实现,请参阅 GitHub Azure 示例
应用委托 Swift 代码
。
如果要实现高级版本的推送通知,则需要在应用中包含以下各项。 原因是,加密推送通知有效负载中的客户内容(例如聊天消息内容和发件人显示名称)需要一些解决方法。
加密密钥的数据存储
在 iOS 设备中创建持久性数据存储。 此数据存储需要在主应用和应用扩展之间共享数据。
在本教程的示例代码中,选择
App Groups
为数据存储,如下所示:
按照 Apple 文章
向应用添加功能
中的步骤将应用组功能添加到应用的目标(主应用和应用扩展)。
按照 Apple 文章
配置应用组
中的步骤配置应用组。 请确保主应用和应用扩展具有相同的容器名称。
通知服务扩展
实现与主应用捆绑的通知服务扩展。 当设备收到推送通知时,此应用扩展会解密其有效负载。
请参阅 Apple 文档中
的“向项目添加服务应用扩展
”,并按照步骤作。
请参阅 Apple 文档中的
实现扩展的处理程序方法
。
Apple 将提供用于解密数据的默认代码,你可以遵循本教程的整体结构。 但是,由于是使用聊天 SDK 进行解密,因此需要将从
// Try to decode the encrypted message data
开始的部分替换为自定义逻辑。
有关
NotificationService.swift
中的相关实现,请参阅 GitHub Azure 示例
适用于 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
的实现,请参阅 GitHub Azure 示例
Notification Service for Swift
。
创建用户 A 与用户 B 的聊天线程。
下载
GitHub 示例应用存储库
。
将用户 A 的
<ACCESS_TOKEN>
值和
<ACS_RESOURCE_ENDPOINT>
值放入 AppSettings.plist
。
将两个 Pod 目标(AzureCommunicationChat 和 Trouter)的“启用位码”设置为“否”
。
将 iOS 设备插入 Mac 并运行程序。 当系统要求你在设备上授权推送通知时,请选择“允许
”。
作为用户 B,发送聊天消息。 确认用户 A 在 iOS 设备上收到推送通知。
实现注册续订
为确保 Microsoft 提供安全的聊天服务,iOS 设备上的推送通知注册有效期仅为 45 分钟。 若要维护推送通知的功能,需要在客户端应用中实现注册续订。
本文介绍两个符合 Apple 官方准则的解决方案。 建议将这两种解决方案一起实施,以提高其有效性。
许多因素可能会影响任一解决方案的有效性。 例如,设备的电池状态、网络条件和特定于 iOS 的限制可能会影响应用运行后台任务的能力。 有关详细信息,请参阅 Apple 提供的
应用后台执行的进展
视频,以及
将后台更新推送到应用
一文。
解决方案 1:后台任务
即使应用不在前台,后台任务也提供了一种执行活动的方法。 当你实现后台任务时,应用可以请求更多时间来完成特定任务,例如对推送通知注册进行续订。
以下部分介绍了如何使用后台任务进行注册续订。
若要确保对聊天服务的不间断访问,需要维护有效的用户访问令牌。 令牌的默认有效期通常为 24 小时,之后令牌将过期并需要续订。 实现自动刷新机制有助于保证无论何时激活聊天应用程序,令牌都是有效的。
聊天 SDK 通过在实现自定义访问令牌刷新程序时自动执行刷新过程来简化令牌管理。 请完成以下步骤,将聊天应用程序配置为支持自动令牌刷新:
为了帮助确保聊天应用程序保持持续且安全的用户访问,需要实现专用于颁发令牌的服务层。 一个选项是将 Azure Functions 用于此目的。
若要创建 Azure 函数,请参阅
使用 Azure Functions 生成受信任的用户访问服务
一文。 文中介绍了如何设置函数应用并部署用于颁发令牌的必要代码。
配置 Azure 函数后:
从 Azure 门户获取令牌颁发者 URL。 你的聊天应用程序将使用此 URL 请求新令牌。
在聊天应用程序中创建并集成令牌刷新器。 此组件将请求新的令牌并初始化聊天客户端,以便实现无缝的自动令牌续订。
GitHub 示例应用存储库
中提供了令牌刷新器的示例代码及其与聊天客户端的集成。
启用和计划后台任务
若要在 iOS 应用中激活和计划后台任务,请按照 Apple 文章
使用后台任务更新应用
中的步骤进行操作。
有关实际实现,请参阅 GitHub Azure 示例
向应用添加聊天
。 提供的示例使用了配置为在未来一分钟内启动的
BGProcessingTask
,演示了如何高效地在后台提取数据。
解决方案 2:远程通知
远程通知是 iOS 应用程序在响应外部触发器时运行后台任务的机制。 你可以在没有用户干预的情况下将远程通知用于刷新注册等任务。
若要使用远程通知来运行后台任务,请执行以下操作:
实现一种触发机制。
例如,可以使用 Azure 函数应用作为触发机制。 它使你能够运行代码来响应各种触发器,包括 HTTP 请求,因此非常适合用来启动无提示推送通知。 请记住,需要在你这一端实现设备注册表,以便函数应用知道在何处传递通知。
设置通知中心。
Azure 通知中心服务提供了可缩放的推送通知基础结构,可将通知从任何后端(云或本地)发送到任何平台(iOS、Android、Windows 等)。
可以重复使用用于常规推送通知的相同通知中心。 若要设置新的通知中心,请参阅
Azure 通知中心文档
。
配置 Azure 函数应用,以发送定期通知。
调整函数应用,以定期通过通知中心发送远程通知。 这些通知将转发到 APNs 并定向到指定的设备。 有关更多说明,请参阅
Azure Functions 的通知中心输出绑定
。
处理应用中的通知。
在 iOS 应用中,实现
应用程序实例方法
,以便在收到无提示通知时触发对注册的自动刷新。
有关详细信息,请参阅 Apple 文章
设置远程通知服务器
。
使用 Azure Functions 生成受信任的用户访问服务
快速入门:向应用中添加聊天
UI 库概述