WatchKit:手表Altimeter返回iPhone高度,如何强制获取手表自身海拔
强制Apple Watch使用自身海拔传感器的解决方案
核心逻辑
当Watch App与配对iPhone连接时,系统默认会优先调用精度更高的iPhone传感器返回海拔数据,你可以通过以下配置强制使用Watch自身的气压传感器:
1. 调整代码运行位置
你提供的现有CMAltimeter调用逻辑完全可用,无需修改,只需要确保这段代码只在WatchOS应用的独立目标中编译运行,不要放在iOS端代码、跨端共享逻辑中执行,否则会默认读取当前运行设备的海拔数据。
你可以用编译宏限定代码仅在Watch端生效:
#if os(watchOS) func startAltimeter() { if CMAltimeter.isRelativeAltitudeAvailable() { switch CMAltimeter.authorizationStatus() { case .notDetermined: print("*******************Motion permission is not determined") case .restricted: fatalError("Authorization restricted!") case .denied: fatalError("Authorization denied!") case .authorized: print("Authorized!") @unknown default: fatalError("Unknown Authorization Status") } self.altimeter.startRelativeAltitudeUpdates(to: OperationQueue.main) {(data,error) in DispatchQueue.main.async { self.relativeAlt = data?.relativeAltitude.doubleValue ?? 0.0 print("relative alttitude = \(self.relativeAlt) m") } } } else { DispatchQueue.main.async { self.relativeAlt = -99 } } } #endif
2. 修改Watch App配置
对Watch应用的target做以下修改:
- 打开Watch端
Info.plist,添加WKApplicationIsIndependent字段,布尔值设为YES,标记应用为独立Watch应用,关闭系统默认的iPhone传感器优先策略 - 在同一份
Info.plist的UIRequiredDeviceCapabilities数组中加入altimeter字段,强制要求系统调用Watch自身的海拔传感器,禁止回退到iPhone的传感器数据 - 单独在Watch端
Info.plist中添加NSMotionUsageDescription字段,填写运动权限申请描述,不要依赖iPhone端的权限同步 - 进入Watch target的
Signing & Capabilities设置页,开启Motion & Fitness权限,若需要后台获取海拔数据可以同时开启后台刷新权限
3. 效果验证
你可以通过以下方式确认配置生效:
将配对的iPhone放置在固定高度位置,携带Apple Watch上下移动,观察打印的相对海拔数值是否跟随手表的位置变化同步变动,如果数值同步变动则说明已经在使用手表自身的海拔传感器。
内容的提问来源于stack exchange,提问作者RawMean
相关产品推荐
相关产品推荐

