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

如何让Apple Watch在后台运行App时关闭屏幕

解决Apple Watch App后台运行时屏幕无法关闭的问题

排查唤醒相关代码

你大概率是不小心开启了闲置计时器禁用,导致屏幕持续亮起。检查代码中是否存在以下设置:

WKExtension.shared().isIdleTimerDisabled = true

如果有,务必在App进入后台的回调中恢复闲置计时器,允许屏幕熄灭。比如在WatchKit Extension的界面控制器didDeactivate方法里添加:

override func didDeactivate() {
    super.didDeactivate()
    // 恢复闲置计时器,允许屏幕自动关闭
    WKExtension.shared().isIdleTimerDisabled = false
}

优化HealthKit后台数据获取逻辑

不要通过强制唤醒屏幕来持续获取心跳数据,改用系统原生的后台交付机制:

  • 使用HKObserverQuery监听心跳数据更新,配合enableBackgroundDelivery让系统在有新数据时静默唤醒后台处理,而非保持屏幕常亮:
func setupHeartRateMonitoring() {
    guard let heartRateType = HKObjectType.quantityType(forIdentifier: .heartRate) else { return }
    
    let observerQuery = HKObserverQuery(sampleType: heartRateType, predicate: nil) { [weak self] query, completion, error in
        guard let self = self else { return }
        // 拉取最新心跳数据并发送
        self.fetchLatestHeartRate {
            // *必须调用completion*,告知系统后台任务已完成
            completion()
        }
    }
    
    healthStore.execute(observerQuery)
    // 启用后台交付,频率可根据需求调整
    healthStore.enableBackgroundDelivery(for: heartRateType, frequency: .immediate) { success, error in
        if let error = error {
            print("后台交付开启失败: \(error.localizedDescription)")
        }
    }
}

调整Watch Connectivity传输方式

避免使用会触发屏幕唤醒的传输方法,后台场景优先用updateApplicationContext——它属于静默传输,不会点亮屏幕:

func sendHeartRateToPhone(heartRate: Double) {
    guard WCSession.default.isReachable else { return }
    let payload = ["heartRate": heartRate]
    try? WCSession.default.updateApplicationContext(payload)
}

同时检查WatchKit Extension的Info.plist,只保留必要的后台模式:com.apple.watchkitconnectivity和com.apple.healthkit,多余的后台模式可能导致系统强制保持屏幕唤醒。

规范后台任务生命周期处理

在ExtensionDelegate的handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>)方法中,处理完所有后台任务后必须调用setTaskCompleted(),让系统明确任务已结束,允许屏幕熄灭:

override func handle(_ backgroundTasks: Set<WKRefreshBackgroundTask>) {
    for task in backgroundTasks {
        switch task {
        case let connectivityTask as WKWatchConnectivityRefreshBackgroundTask:
            // 处理Watch Connectivity后台任务
            connectivityTask.setTaskCompleted()
        case let snapshotTask as WKSnapshotRefreshBackgroundTask:
            snapshotTask.setTaskCompleted(restoredDefaultState: true, estimatedSnapshotExpiration: Date.distantFuture, userInfo: nil)
        default:
            task.setTaskCompleted()
        }
    }
}

测试注意事项

Xcode调试模式会强制保持App活跃,导致屏幕无法正常熄灭,因此需要打包成IPA安装到真实设备上测试。另外,前往Apple Watch的设置界面,确认你的App已获得后台活动权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 07:01:00