Live Activity Push Token更新被重复调用两次的问题咨询
Live Activity推送Token重复获取及耗时问题解答
一、重复收到相同Token的原因
Apple的pushTokenUpdates是异步数据流,系统重复发送相同Token通常有这些情况:
- 系统内部状态校验:Live Activity启动后,系统会多次确认Token有效性,可能重复推送同一个Token
- 应用状态切换:比如应用从后台回到前台,系统会重新下发当前有效Token,确保你能及时接收
- 推送通道维护:系统在维护APNs连接时,可能会重复分发已生效的Token
二、只获取一次Token的解决办法
在代码里加个去重逻辑就行,记录上一次处理过的Token,新Token和它对比,不一样再执行保存操作。修改后的代码示例:
Task { var lastProcessedToken: String? for await data in runningActivity.pushTokenUpdates { let currentToken = data.hexString // 跳过和上一次相同的Token guard currentToken != lastProcessedToken else { continue } lastProcessedToken = currentToken self.count += 1 print("Count \(self.count)\n" + currentToken) // 在这里调用API保存Token } }
三、Token获取耗时较长的原因
- 网络问题:获取Token依赖APNs连接,网络信号差、有防火墙/代理干扰都会拖慢速度
- 设备资源不足:CPU、内存占用过高时,系统处理Live Activity初始化的速度会变慢
- Live Activity启动延迟:如果你的代码在创建Activity时有主线程耗时操作,会间接影响Token下发
- APNs服务器负载:高峰时段Apple服务器响应变慢,也会导致Token获取延迟
四、操作优化建议
你的核心逻辑没问题,但可以调整这几点:
- 确保
runningActivity是完全初始化且处于活跃状态的实例,避免在Activity未启动完成时就监听Token更新 - 保存Token的API调用放到后台队列执行,别在
pushTokenUpdates的循环里做同步耗时操作,避免阻塞数据流 - 监听Live Activity的
state属性,只在active状态下处理Token,减少过渡状态的重复推送
内容的提问来源于stack exchange,提问作者forceunwrapped
相关产品推荐
相关产品推荐

