3

我希望以非常精确的方式调用 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];

问题是当我距离这个目的地 150m 时,didEnterRegion 被调用。同样距离相似的距离 didExitRegion 被调用。我希望当我在 5 m 之外时调用 didEnter 和 didExit 区域,而不是在 150m 之外,正如我在启动 CLCircularRegion 时指定的那样。有没有人有办法解决吗?精度是我需要的,150m 而不是 5m 对我来说太不准确了。谢谢吨 -

(我用 iPhone 4S 测试)

4

1 回答 1

6

虽然理论上使用当前的 GPS+ 技术设备可以达到 5m 的精度,但 Apple 可能出于各种原因阻止了这种精度以进行区域监控。

一是他们总是想要良好的用户体验,而您想要的 5m 精度在您经常从 GPS 读数中获得的精度范围内。因此,离开这样一个小区域也可能是因为用户仍在该区域内时读数精度较低。Apple 确实通过设置发布 regionEnter 或 regionExit 通知的阈值来掩盖此类错误。从苹果文档

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

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

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

于 2014-03-17T10:55:04.487 回答