Flutter Live Activity推送更新失败:APNs响应成功但无法解码内容状态
解决Live Activity无法通过APNs更新的问题
核心错误点及修正
1. 错误的APNs Topic
apns-topic参数必须是Bundle ID + .liveactivity后缀,而非单纯的Bundle ID。例如你的Bundle ID是com.yourcompany.yourapp,则topic应为com.yourcompany.yourapp.liveactivity。
2. Content-State格式错误
不需要在content-state的键名前添加activityId前缀,键名必须和你创建Live Activity时传入的contentState结构完全一致。比如启动Live Activity的代码是:
LiveActivity.start( activityId: "E5275E75-5F1F-4D99-AD63-E1AC2BF000C3", contentState: { "deliveryMode": "pickup", "orderStatus": "Confirmed", "quantity": 2, "readyTime": "2024-02-23T14:30:00Z", "deliveryStatus": "Preparing", "orderId": "AG123456" }, );
那么更新时的content-state必须保持相同的键名结构。
3. 其他关键参数校验
- 确保
aps中的event字段值为"update",apns-push-type为"liveactivity",这两个参数不可出错。 - 推送使用的
activityToken必须是启动Live Activity后获取到的有效token,不能混淆为设备token。
修正后的推送代码示例
const authToken = generateApnsAuthToken(); // 移除activityId前缀,与初始contentState键名完全匹配 const updatedData = { "deliveryMode": "pickup", "orderStatus": "Confirmed", "quantity": 2, "readyTime": "2024-02-23T14:30:00Z", "deliveryStatus": "Preparing", "orderId": "AG123456" }; const payload = JSON.stringify({ "aps": { "event": "update", "content-state": updatedData, "timestamp": Math.floor(Date.now() / 1000) // 可选,建议添加以确保时序正确 } }); const client = http2.connect("https://api.sandbox.push.apple.com", { rejectUnauthorized: false }); const request = client.request({ ":method": "POST", ":path": `/3/device/${activityToken}`, "apns-topic": `${BUNDLE_ID}.liveactivity`, // 补充.liveactivity后缀 "apns-push-type": "liveactivity", "authorization": `Bearer ${authToken}`, "content-type": "application/json", "content-length": Buffer.byteLength(payload), });
验证步骤
- 检查Xcode控制台是否仍有解码错误,若有则对比初始contentState与推送的content-state键名,确保完全一致(包括大小写)。
- 确认APNs返回状态码为
200,若为其他状态码,参照Apple官方APNs错误码文档排查问题。 - 确保测试设备iOS版本在16.1及以上,Live Activity仅支持该版本及更高系统。
内容的提问来源于stack exchange,提问作者Mohamed Al Ameen
相关产品推荐
相关产品推荐

