iOS 18 远程启动 Live Activity 后如何获取更新 token?
数据小许
结论
获取 Live Activity 更新 token 不需要覆盖 didReceiveRemoteNotification。APNs 返回 200 OK,表示通知请求已被接受;响应中不会包含 Live Activity 的更新 token。"input-push-token": 1 会让系统在启动活动时生成更新 token,应用需通过 ActivityKit 的异步序列接收。
在应用中监听远程启动的活动
远程启动的活动不会由应用代码直接调用 Activity.request 创建。只监听某个已知 Activity 实例的 pushTokenUpdates 可能不够,应用还应观察新活动及其 token 更新。下面是 Swift 侧的示意代码,需在应用运行时启动监听任务:
import ActivityKit
func observeLiveActivities() {
guard #available(iOS 16.2, *) else { return }
Task {
for await activity in Activity<AdventureAttributes>.activityUpdates {
Task {
for await token in activity.pushTokenUpdates {
let tokenString = token
.map { String(format: "%02x", $0) }
.joined()
// 将 tokenString 发送到自己的服务器
}
}
}
}
}
将 AdventureAttributes 替换为项目中实际使用的 ActivityAttributes 类型。实际实现还需管理监听任务的生命周期,并处理 token 后续变化。收到新 token 时,应更新服务器保存的值。
核对启动 payload
启动通知的 aps 内容应包含 input-push-token,例如:
{
"aps": {
"input-push-token": 1,
"attributes-type": "AdventureAttributes",
"attributes": {
"currentHealthLevel": 100,
"eventDescription": "Adventure has begun!"
},
"...": "其余启动通知所需字段"
}
}
示例中省略的字段需根据实际 Live Activity 启动 payload 补全。input-push-token 不会让 APNs 在 HTTP 响应中附带 token。设备上的应用通过 ActivityKit 接收 token 后,再将其传给服务器。
注意事项
didReceiveRemoteNotification是应用接收远程通知的回调,不是接收 Live Activity 更新 token 的专用接口。获取该 token 不需要因此覆盖它。- 远程启动发生时,应用可能没有运行。应用启动或恢复运行后,应建立 ActivityKit 监听,并根据实际生命周期处理尚存的活动。APNs 接受请求不代表应用已经收到 token。
- 远程启动 token(
pushToStartToken)和活动更新 token 用途不同。服务器收到活动更新 token 后,才能用它向对应活动发送后续更新。 - 这里的代码展示了监听思路。React Native 项目需要通过原生 iOS 代码或现有原生模块,将 token 传递到 JavaScript 或服务器。具体桥接方式取决于项目实现。
备注:内容仅供参考。
