iOS Live Activity已注册但未在锁屏显示问题求助
iOS Live Activity 注册成功但锁屏不显示问题
上下文
我正在开发一款iOS应用,在视图模型中注册Live Activity的代码如下:
@Observable class LiveActivityViewModel { private var activity: Activity<LiveActivityTimerAttributes>? // 更多属性 func startActivity() { // .... (定义一些变量) // 创建属性 let attributes = LiveActivityTimerAttributes() // 创建初始状态 let state = LiveActivityTimerAttributes.ContentState( duration: offlineViewModel.state.durationSeconds, // 之前已定义 startDate: startDate, // 之前已定义 peopleOffline: offlineCountViewModel?.count ?? 0 // 之前已定义 ) let content = ActivityContent(state: state, staleDate: nil) // 请求启动Activity do { activity = try Activity.request( attributes: attributes, content: content, pushType: nil // 这里必须传nil,默认允许推送更新Live Activity ) print("📣 Requested activity \(activity!.id)") } catch { print("Error requesting live activity: \(error)") } } func stopActivity() { // 更新Activity状态 // 模拟数据 let state = LiveActivityTimerAttributes.ContentState( duration: nil, startDate: .now, peopleOffline: 0 ) // 请求结束Activity let content = ActivityContent(state: state, staleDate: nil) Task { for activity in Activity<LiveActivityTimerAttributes>.activities { await activity.end(content, dismissalPolicy: .immediate) } } } }
控制台输出如下:
📣 Starting live activity 📣 Requested activity A383F4AF-9C4A-4840-927F-01A67040AECF
注:Live Activity的内容与此问题无关,不会产生影响。
问题描述
如上所示,Live Activity已完成注册,但在iPhone 16 Plus模拟器和iPhone 11真机上,均未在锁屏界面显示。
已尝试的排查步骤
我创建了一个包含默认Live Activity的测试应用,将上述视图模型代码复制到新应用中并适配属性,在ContentView中设置启动/停止按钮后,测试应用的Live Activity在iPhone 16模拟器上可正常显示。
随后我逐步将真实应用的文件/文件夹添加到测试项目中,试图定位问题,但未发现异常——测试项目已基本与真实项目一致,仅修改了名称,真实项目使用Git管理。
我还做了以下调研和操作:
- 确保所有图片大小小于4kB
- 在Console.app中未发现相关异常日志
- 在Xcode中启用线程Sanitizer
- 在Info.plist中添加"Supports live activities"并设为YES
排查方向与解决方案
既然测试项目能正常运行,问题大概率出在真实项目和测试项目的隐性配置差异上,以下是几个容易被忽略的检查点:
检查Target的Capabilities配置
- 确认真实项目的Target中,
Live Activities选项已开启(Xcode 14+,在Signing & Capabilities标签下)。测试项目默认可能自动开启,但真实项目如果是旧项目升级,可能需要手动添加。
- 确认真实项目的Target中,
验证Activity Attributes的实现
- 检查
LiveActivityTimerAttributes是否正确遵循ActivityAttributes协议,特别是static var content: ActivityContentConfiguration的实现是否正确返回对应的WidgetConfiguration。如果这个配置有误,系统会静默忽略Live Activity的显示请求。 - 确认Attributes的
state类型是否和ContentState完全匹配,没有类型不兼容的问题。
- 检查
检查Widget Extension的配置
- 确认真实项目的Widget Extension已正确关联主App的Target,Extension的
Info.plist中,NSExtensionPrincipalClass指向正确的Widget实现类,且NSExtensionActivationRule设置为TRUEPREDICATE。 - 检查Widget Extension的Deployment Target是否和主App一致,且不低于iOS 16.1(Live Activity的最低系统版本要求)。
- 确认真实项目的Widget Extension已正确关联主App的Target,Extension的
清理项目缓存与重建
- 执行
Product > Clean Build Folder,删除Derived Data目录,然后重新编译项目。真实项目可能存在缓存的旧配置,导致Live Activity无法正常加载。 - 真机上卸载App后重新安装,避免旧的Live Activity残留影响显示。
- 执行
检查App的权限设置
- 真机进入
设置 > 你的App > 通知,确认Live Activities权限已开启。虽然注册时默认会请求权限,但如果用户之前拒绝过,或App权限配置异常,会导致无法显示。 - 模拟器上可通过
Settings > Notifications > 你的App确认Live Activities权限状态。
- 真机进入
检查代码执行时机
- 确认
startActivity()是在主线程调用的。虽然Activity.request()本身线程安全,但后台线程调用可能导致UI相关配置无法生效,可尝试包裹在DispatchQueue.main.async中测试。
- 确认
调整StaleDate设置
- 当前设置
staleDate: nil,部分场景下系统可能因无过期时间延迟显示。尝试设置合理的过期时间(比如startDate.addingTimeInterval(duration)),看是否触发显示。
- 当前设置
对比Info.plist差异
- 用diff工具对比真实项目和测试项目的Info.plist,除了
Supports live activities,还要检查NSAppTransportSecurity、UIBackgroundModes等可能间接影响的配置项。
- 用diff工具对比真实项目和测试项目的Info.plist,除了
如果以上步骤无效,建议将真实项目的Live Activity相关代码(Attributes、Widget Extension、ViewModel)完全替换为测试项目的对应代码,逐步还原真实项目的其他配置,直到问题复现,以此定位具体影响因素。
内容的提问来源于stack exchange,提问作者user29798028
相关产品推荐
相关产品推荐

