如何让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
相关产品推荐
相关产品推荐

