PAYATHON 2026

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 或服务器。具体桥接方式取决于项目实现。

备注:内容仅供参考。