如何为多个HKQuantityType标识符启用BackgroundDelivery后台投递功能
适配多健康指标后台推送的修改方案
核心思路
- 把所有需要开启后台推送的健康类型标识符统一放到数组中批量循环处理,避免重复冗余代码
- 保留原有逻辑:每个类型单独开启后台交付、注册独立的观察者查询即可
- 注意:请提前在Info.plist中配置健康数据读取权限,同时先调用
requestAuthorization方法申请所有对应类型的读取权限,否则后台交付会失效
修改后完整代码
func setupBackgroundDelivery() { // 配置所有需要开启后台推送的健康指标类型 let targetIdentifiers: [HKQuantityTypeIdentifier] = [ .stepCount, // 步数 .activeEnergyBurned, // 消耗卡路里 .distanceWalkingRunning // 步行/跑步移动距离 // 后续要加其他指标直接在这个数组里加对应Identifier即可 ] // 循环处理每个指标的后台交付开启和观察者注册 for identifier in targetIdentifiers { guard let quantityType = HKQuantityType.quantityType(forIdentifier: identifier) else { print("不支持的健康类型:\(identifier.rawValue)") continue } // 开启对应类型的后台交付,频率统一为每小时,可按需单独调整 self.healthStore.enableBackgroundDelivery(for: quantityType, frequency: .hourly) { success, error in if let error = error { print("开启\(identifier.rawValue)后台交付失败: \(error.localizedDescription)") return } if success { print("\(identifier.rawValue)后台交付已开启") } else { print("\(identifier.rawValue)后台交付开启失败,错误信息:\(error.debugDescription)") } } // 为每个类型注册独立的观察者查询 let observerQuery = HKObserverQuery(sampleType: quantityType, predicate: nil) { query, completionHandler, error in self.fetchAndSaveHealthData() { completionHandler() } } healthStore.execute(observerQuery) } }
其他注意事项
- 你原本的
fetchAndSaveHealthData方法不需要修改,触发后统一拉取所有需要的健康数据即可 - 该方法在
didFinishLaunching中调用符合苹果的要求,不会出现后台唤醒失败的问题
内容的提问来源于stack exchange,提问作者Nivru
相关产品推荐
相关产品推荐

