didEnterRegion以更大的半径调用(iOS)

时间:2014-03-14 23:58:34

标签: ios cllocationmanager clregion

我想要以非常精确的方式调用didEnterRegion,但我无法这样做。这就是我所做的:我使用了distanceFilter和desiredAccuracy的最佳值(根据Apple最精确的GPS设置)并且有一个目的地CLCircularRegion(CLRegion的子类)。

self.locationManager.distanceFilter = kCLLocationAccuracyBestForNavigation;
self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation;

@property (nonatomic, strong) CLCircularRegion *Destination;
self.Destination = [[CLCircularRegion alloc] initWithCenter:CLLocationCoordinate2DMake(43.907691, -69.963158) radius:5 identifier:@"Destination"];

[self.locationManager startMonitoringForRegion:self.Destination];

问题是,当我离这个目的地150米远时,didEnterRegion被调用。距离类似的距离也会调用didExitRegion。我希望在我离开5米远的地方时调用didEnter和didExit区域,而不是150米远,因为我已经指定启动了CLCircularRegion。有没有人有办法解决吗?精度是我所需要的,150米而不是5米对我来说太不准确了。谢谢吨 -

(我用iPhone 4S测试)

1 个答案:

答案 0 :(得分:5)

虽然理论上使用当前的GPS +技术设备可以达到5米的准确度,但可能是因为各种原因,Apple阻止了区域监控的准确性。

一个是他们总是希望获得良好的用户体验,并且您想要的5米精度在您通常从GPS读数获得的精确度范围内。因此,当用户仍然在该区域内时,留下这样小的区域也可能是由于较低的准确度读数。 Apple通过设置发布regionEnter或regionExit通知的阈值来确实掩盖此类错误。来自Apple documentation

  

在iOS模拟器或设备上测试区域监控代码时,请注意区域事件可能不会在跨越区域边界后立即发生。为防止虚假通知,iOS在满足某些阈值条件之前不会发送区域通知。具体来说,用户的位置必须越过区域边界,离开边界最小距离,并在报告通知之前保持最小距离至少20秒。

     

特定阈值距离由当前可用的硬件和定位技术决定。例如,如果禁用Wi-Fi,则区域监控的准确性要低得多。但是,出于测试目的,您可以假设最小距离约为200米

尽管如此,由于您可以要求高精度读数,Apple也应该考虑到这一点。替代方案可能是 - 如您所评论的那样 - 使用didUpdateLocation:并确定区域内部还是外部。这样,您可以包括位置精度测试,只有在水平精度足够好时才接受退出/输入。