使用live_activities Flutter插件启动iOS Live Activity时遭遇PlatformException错误求助
live_activities Flutter插件启动iOS Live Activity时遭遇PlatformException错误求助
我之前用live_activities插件时也碰到过一模一样的错误,折腾了好一阵才解决,结合自己的踩坑经验给你几个精准的排查方向:
1. 先盯紧Widget Extension的配置细节
很多时候问题出在Widget Extension的关联和配置上,这是最容易踩漏的点:
- 确保Widget Extension的Bundle ID是主App Bundle ID的后缀形式,比如主App是
com.yourteam.yourapp,Widget就得是com.yourteam.yourapp.LiveActivityWidget,而且两者的Deployment Target必须统一为iOS 16.2或更高。 - 检查Widget Extension的Info.plist,除了
NSSupportsLiveActivities设为YES,还要确认NSExtension字典的配置:
这里的<key>NSExtension</key> <dict> <key>NSExtensionPointIdentifier</key> <string>com.apple.widgetkit-extension</string> <key>NSExtensionPrincipalClass</key> <string>$(PRODUCT_MODULE_NAME).LiveActivityWidget</string> </dict>NSExtensionPrincipalClass必须指向你Swift文件里的Widget类,用$(PRODUCT_MODULE_NAME)可以避免硬编码模块名出错。 - 还要去主App target的「General」标签下,在「Embedded Binaries」里把你的Widget Extension加进去——这步很容易忘,系统找不到Widget的话直接就会报输入错误0。
2. 验证Activity Attributes与Flutter数据的匹配度
com.apple.ActivityKit.ActivityInput error 0很大概率是数据不匹配导致的:
- 在Swift的Widget Extension里,你的
ActivityAttributes子类必须严格实现Codable协议,而且ContentState的字段要和Flutter端传递的data完全对应。举个正确的示例:import ActivityKit import WidgetKit import SwiftUI struct LiveActivityAttributes: ActivityAttributes, Codable { public struct ContentState: Codable, Hashable { // 这些字段要和Flutter端传的key完全一致 var eventName: String var progress: Double } } - Flutter端启动时,传递的
data不能有类型错误,比如把数字传成字符串、漏传必填字段。你可以先简化数据,只传一个字符串测试:final activityId = await _liveActivitiesPlugin.createActivity( data: {"eventName": "测试活动"}, type: "LiveActivityAttributes", // 必须和Swift里的Attributes类名一致 );
3. 权限配置的两个容易忽略的点
虽然你已经加了推送权限,但还有两个细节:
- Widget Extension也需要开启Push Notifications能力!别只给主App加,去Xcode的Widget Extension target的「Signing & Capabilities」里把这个加上。
- 主App的Info.plist里必须添加
NSUserNotificationsUsageDescription,描述你的App使用通知的用途,不然系统可能会默默拒绝权限请求,导致Live Activity启动失败。
4. 启动时机的坑
别在App刚启动就立刻调用启动Live Activity的方法:
- 必须等用户授予了时间敏感通知权限之后再执行。请求权限时要明确加上
timeSensitive: true:final NotificationSettings settings = await FirebaseMessaging.instance.requestPermission( alert: true, badge: true, sound: true, timeSensitive: true, // 这个是Live Activity必需的 ); - 最好把启动逻辑放在用户主动触发的操作里(比如点击一个“启动活动”按钮),或者在权限请求成功的回调里执行,避免系统还没完成初始化就调用方法报错。
如果以上排查都没问题,你可以尝试清理Xcode的DerivedData,重新编译主App和Widget Extension,有时候缓存也会导致奇怪的错误。
内容来源于stack exchange
相关产品推荐
相关产品推荐

