You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

排查方向与解决方案

既然测试项目能正常运行,问题大概率出在真实项目和测试项目的隐性配置差异上,以下是几个容易被忽略的检查点:

  1. 检查Target的Capabilities配置

    • 确认真实项目的Target中,Live Activities选项已开启(Xcode 14+,在Signing & Capabilities标签下)。测试项目默认可能自动开启,但真实项目如果是旧项目升级,可能需要手动添加。
  2. 验证Activity Attributes的实现

    • 检查LiveActivityTimerAttributes是否正确遵循ActivityAttributes协议,特别是static var content: ActivityContentConfiguration的实现是否正确返回对应的WidgetConfiguration。如果这个配置有误,系统会静默忽略Live Activity的显示请求。
    • 确认Attributes的state类型是否和ContentState完全匹配,没有类型不兼容的问题。
  3. 检查Widget Extension的配置

    • 确认真实项目的Widget Extension已正确关联主App的Target,Extension的Info.plist中,NSExtensionPrincipalClass指向正确的Widget实现类,且NSExtensionActivationRule设置为TRUEPREDICATE。
    • 检查Widget Extension的Deployment Target是否和主App一致,且不低于iOS 16.1(Live Activity的最低系统版本要求)。
  4. 清理项目缓存与重建

    • 执行Product > Clean Build Folder,删除Derived Data目录,然后重新编译项目。真实项目可能存在缓存的旧配置,导致Live Activity无法正常加载。
    • 真机上卸载App后重新安装,避免旧的Live Activity残留影响显示。
  5. 检查App的权限设置

    • 真机进入设置 > 你的App > 通知,确认Live Activities权限已开启。虽然注册时默认会请求权限,但如果用户之前拒绝过,或App权限配置异常,会导致无法显示。
    • 模拟器上可通过Settings > Notifications > 你的App确认Live Activities权限状态。
  6. 检查代码执行时机

    • 确认startActivity()是在主线程调用的。虽然Activity.request()本身线程安全,但后台线程调用可能导致UI相关配置无法生效,可尝试包裹在DispatchQueue.main.async中测试。
  7. 调整StaleDate设置

    • 当前设置staleDate: nil,部分场景下系统可能因无过期时间延迟显示。尝试设置合理的过期时间(比如startDate.addingTimeInterval(duration)),看是否触发显示。
  8. 对比Info.plist差异

    • 用diff工具对比真实项目和测试项目的Info.plist,除了Supports live activities,还要检查NSAppTransportSecurity、UIBackgroundModes等可能间接影响的配置项。

如果以上步骤无效,建议将真实项目的Live Activity相关代码(Attributes、Widget Extension、ViewModel)完全替换为测试项目的对应代码,逐步还原真实项目的其他配置,直到问题复现,以此定位具体影响因素。


内容的提问来源于stack exchange,提问作者user29798028

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 03:59:53