我尝试在我的 ios 应用程序中使用指南针。我有一个问题。如果我在其中实施
locationManagerShouldDisplayHeadingCalibration
方法return YES
,则始终显示校准显示。但我应该让它像苹果地图一样。即有时应显示校准显示。当指南针应该校准。
5 回答
好的,我无法发表评论,所以我想我应该留下回复,因为 Claude Houle 的回复对我很有用。
我正在使用 Claude Houle's response的改进版本。
- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager{
if(!manager.heading) return YES; // Got nothing, We can assume we got to calibrate.
else if(manager.heading.headingAccuracy < 0 ) return YES; // 0 means invalid heading, need to calibrate
else if(manager.heading.headingAccuracy > 5 ) return YES; // 5 degrees is a small value correct for my needs, too.
else return NO; // All is good. Compass is precise enough.
}
还想说 Claude Houle 所说的几乎实现了这里的 API 文档,其中指出:
如果您从此方法返回 NO 或未在您的委托中为其提供实现,则核心位置不会显示航向校准警报。即使没有显示警报,当任何干扰磁场远离设备时,仍然可以自然地进行校准。但是,如果设备因任何原因无法校准自身,则任何后续事件的 headingAccuracy 属性中的值将反映未校准的读数。
我使用以下代码:
@property (nonatomic, retain) CLHeading * currentHeading; // Value updated by @selector(locationManager:didUpdateHeading:)
...
...
- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager{
if( !self.currentHeading ) return YES; // Got nothing, We can assume we got to calibrate.
else if( self.currentHeading.headingAccuracy < 0 ) return YES; // 0 means invalid heading. we probably need to calibrate
else if( self.currentHeading.headingAccuracy > 5 )return YES; // 5 degrees is a small value correct for my needs. Tweak yours according to your needs.
else return NO; // All is good. Compass is precise enough.
}
一个更直接的解决方案:
Objective-C
- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager
{
CLLocationDirection accuracy = [[manager heading] headingAccuracy];
return accuracy <= 0.0f || accuracy > 10.0f;
}
这利用了在 nil 对象上执行的选择器总是返回零的事实,以及准确度永远不会有效且等于 0.0f(即 100% 准确)的事实。
迅速
由于引入了可选项,最简单的 Swift 解决方案确实需要分支,看起来像:
func locationManagerShouldDisplayHeadingCalibration(manager: CLLocationManager) -> Bool {
if let h = manager.heading {
return h.headingAccuracy < 0 || h.headingAccuracy > 10
}
return true
}
请注意,我们正在查看headingAccuracy
,Apple 的文档指出:
此属性中的正值表示磁航向属性报告的值与实际磁北方向之间的潜在误差。因此,此属性的值越低,航向越准确。负值表示上报的航向无效,可能在设备未校准或受到当地磁场强干扰时出现。
manager.heading 是 CLHeading。这就是为什么 manager.heading > 5 会发出警告的原因。self.currentHeading.headingAccuracy > 5 是真实的。
在我的 iPhone6 上,headingAccuracy 通常为 25.0,因此只需返回 YES 并依靠 iOS 来确定何时显示校准屏幕似乎是最好的选择。丢弃标题准确度 < 0.0 的读数可防止使用“错误”标题。