locationManagerShouldDisplayHeadingCalibration未调用

时间:2015-01-09 21:39:58

标签: ios cllocationmanager compass calibration heading

我有一个使用标题的简单iOS应用程序。然而,由于精度非常差(10到25度),我实现了locationManagerShouldDisplayHeadingCalibration功能。然而它永远不会被称为。这是我的代码:

    ...
    locmanager = [CLLocationManager new];

    [locmanager setDelegate:self];
    [locmanager setDesiredAccuracy:kCLLocationAccuracyBest];
    [locmanager setHeadingFilter:kCLHeadingFilterNone];
    [locmanager setHeadingOrientation:CLDeviceOrientationLandscapeLeft|CLDeviceOrientationLandscapeRight];
    if ([CLLocationManager locationServicesEnabled])
    {

        [locmanager startUpdatingLocation];
        [locmanager startUpdatingHeading];
    }
    ...

- (void)locationManager:(CLLocationManager*)manager didUpdateHeading:(CLHeading*)newHeading
{
     // This one gets called
}

- (BOOL)locationManagerShouldDisplayHeadingCalibration:(CLLocationManager *)manager
{
     // This one does NOT get called
     NSLog ("Here");
     return YES;
}

我该怎么做罗盘校准?感谢。

2 个答案:

答案 0 :(得分:2)

Apple官方文档:

  

核心位置可以调用此方法以努力校准用于确定航向值的板载硬件。通常,Core Location会在以下时间调用此方法:

     
    

首次要求更新标题

         

当核心位置观察到观察到的磁场的幅度或倾斜度发生显着变化时

  

因此,完全有可能您的校准已经很好并且无需设置。请注意,此方法永远不会在模拟器中调用。

尝试将MKMapView与MKUserTrackingMode.FollowWithHeading一起使用,看看是否出现校准窗口。您的委托可能仍未被调用,因为MKMapView通过它自己的私有位置管理器委托来调用它。

您也可以尝试在设置中关闭指南针校准 - >位置服务 - >您设备上的系统服务。

答案 1 :(得分:0)

  1. 请参阅CLLocationManager requestAlwaysAuthorization方法

  2. 将所需的密钥添加到 info.plist 文件中(现在需要)

    NSLocationAlwaysUsageDescription     bla bla为什么我们使用GPS。     NSLocationWhenInUseUsageDescription     bla bla为什么我们使用GPS。

  3. 必须在主UI线程上设置
  4. !!