灵动岛/实时活动 启动成功后(.active)立即dismiss
适用于:在开发 灵动岛/实时活动 时,监控到在成功创建(.active)后,几乎立刻取消(. dismissed)的bug
先上代码
//一个灵动岛实例
let activityInstance = try Activity<MBSNIsLandAttributes>.request(
attributes: staticAttributes,
content: .init(state: initialContentState, staleDate: endTime),
pushType: .token)
//给该实例加个状态监听
Task { @MainActor in
for await state in activityInstance.activityStateUpdates {
switch state {
case .active:
print("Live Activity 正在运行")
case .ended:
print("Live Activity 已结束或过期")
case .dismissed:
print("Live Activity 被用户手动关闭")
case .stale: break
case .pending:
print("Live Activity 被用户pending")
@unknown default:
break
}
}
}
print("灵动岛activity id -> \(activityInstance.id)")
这是新建了一个灵动岛实例activityInstance,然后给他加上了状态监听。正常创建成功后,监听会打印“Live Activity 正在运行”,然后显示灵动岛/实时活动。但是笔者在开发过程遇到了:
先打印“Live Activity 正在运行”,甚至成功打印了activityInstance的id
然后立刻打印“Live Activity 被用户手动关闭”这样的情况,
然后灵动岛/实时活动并没有被创建出来,
当然现实中也没有人操作。
经过AI的帮助,这种情况的原因可能是,创建成功后,灵动岛在渲染的过程中失败。从而导致系统取消。
具体到本人, 笔者在新建的过程中传入的初始化实例initialContentState中的某个参数有问题,这个参数是一个json字符串,而这个json字符串在灵动岛的swiftUI中,拼接到了一个URL上,从而导致URL失败,从而导致加载URL的LINK失败,从而导致灵动岛渲染失败。
泛化到所有:
-
先检查项目的 Target 中灵动岛(*Extension)Target的 Minimum deployments ,这个最小版本号(推荐16.1)需要低于你运行设备的系统版本号。
-
可以检查是否在灵动岛的swiftUI中用到图片,
是否传入了正确的ImageData?
如果传入的ImageName,那ImageName在SwiftUI中是否成功初始化成了Image?
另外注意这个Image的具体图片需要存放在 Widget Extension 的 Assets.xcassets 里面,而不仅仅是在主 App 中。 -
在某些低iOS版本中,灵动岛的始化实例中,如果传入的endTime值过于小,导致渲染失败,从而出现上述的情况。
希望对你有帮助。