iOS ActivityKit推送令牌问题咨询:nil令牌与令牌过期
背景
iOS 16.1引入ActivityKit,支持在锁屏显示Live Activity(与锁屏小组件存在功能差异)。Live Activity单次更新接收数据上限为4KB,需通过后端服务器经APNs推送更新,因此需从已启动的Live Activity获取pushToken并同步至后端。
问题1:Activity启动后pushToken立即为nil是否为预期行为?
问题场景
调用Activity.request创建实例后,同步访问其pushToken属性始终返回nil:
let activity = try Activity.request( attributes: attributes, contentState: contentState, pushType: .token ) print(activity.pushToken) // 始终输出nil
目前只能通过订阅pushTokenUpdates获取初始令牌,疑惑这是否为临时方案,预期启动后的Activity应直接包含有效令牌。
解答
这是完全符合官方设计的预期行为,且通过pushTokenUpdates获取令牌是标准实现方式,并非临时方案:
Activity.request仅负责发起Live Activity的创建流程,而pushToken的生成是系统异步向APNs发起申请的过程,同步返回的Activity实例此时尚未完成令牌的获取。- Apple官方明确要求开发者通过
pushTokenUpdates监听令牌的初始生成与后续更新,这是获取Live Activity推送令牌的唯一可靠方式,即使是首次创建Activity,也必须通过该订阅回调获取初始令牌。
问题2:Live Activity推送令牌的生命周期?后台后出现ExpiredProviderToken错误的原因?
问题场景
Apple文档明确要求需订阅推送令牌更新:
通过pushTokenUpdates监听Activity推送令牌的变化,将更新后的令牌发送至服务器,并在服务器上作废旧令牌。
我们已在APP中实现pushTokenUpdates订阅,但关闭APP或后台运行一段时间后,后端收到APNs返回的403错误,提示ExpiredProviderToken。文档未明确令牌的刷新频率,测试发现APP后台时令牌可能过期,疑惑是否有其他开发者遇到同类问题。
解答
Live Activity推送令牌的生命周期:
Apple官方未给出明确的有效期时长,社区开发者实测结果显示,令牌有效期通常在几小时到数天不等。APP进入后台后,令牌可能因系统资源回收或APNs策略调整提前过期,这是普遍存在的现象,已有大量开发者反馈过同类问题。关于ExpiredProviderToken错误:
该错误并非Live Activity的push token过期导致,而是后端用于向APNs认证的Provider Token过期:- Provider Token是后端请求APNs时的身份凭证(通常为JWT格式),默认有效期为60分钟,后端需实现自动刷新逻辑,确保在令牌过期前更新凭证,避免触发403错误。
- 若Live Activity的push token过期,APNs返回的错误通常为
BadDeviceToken或Unregistered,此时才需要通过pushTokenUpdates获取新令牌并同步至后端作废旧令牌。
内容的提问来源于stack exchange,提问作者Nimble

