didEnterRegion 以更大的半径调用(iOS)
Posted
技术标签:
【中文标题】didEnterRegion 以更大的半径调用(iOS)【英文标题】:didEnterRegion called with larger radius (iOS) 【发布时间】:2014-03-14 23:58:34 【问题描述】:我希望非常精确地调用 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 测试过)
【问题讨论】:
我猜它在技术上是有限的,无法达到如此高的精度:" ...意识到区域事件可能不会立即发生...您可以假设最小距离约为 200 米。”引用自Apple 我认为是这样,但有趣的是,使用 -(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations 并使用 ClRegion 的 containsCoordinate 方法,您可以获得您是否在该地区的非常准确的结果。对我来说 didenterRegion 和 didExitRegion 如此准确是没有意义的。会有办法让它发挥作用,因为苹果设备非常有能力达到这种准确性。结合 wifi 和蜂窝连接,我相信有一种方法可以让这个更准确。 如果没有其他解决方案,我将赏金给你沃尔克。 还有 7 天,可能有人有一个有效的答案......会让我感觉更好。我现在正在处理一些 CLLocation 代码,也许我可以测试您的问题并寻找解决方案... 顺便说一句,你是在设备上测试还是在模拟器上测试? 【参考方案1】:虽然目前的 GPS+ 技术设备理论上可以达到 5m 的精度,但 Apple 可能出于各种原因阻止了这种精度以进行区域监控。
其中一个原因是他们总是想要良好的用户体验,而您想要的 5m 精度在您经常从 GPS 读数中获得的精度范围内。因此,离开这样一个小区域也可能是因为用户仍在该区域内时读数精度较低。 Apple 确实通过设置发布 regionEnter 或 regionExit 通知的阈值来掩盖此类错误。来自Apple documentation:
在 ios 模拟器或设备上测试您的区域监控代码时,请意识到区域事件可能不会在跨越区域边界后立即发生。为了防止虚假通知,iOS 在满足某些阈值条件之前不会发送区域通知。具体来说,用户的位置必须越过区域边界,离开边界最小距离,并在该最小距离上保持至少 20 秒,然后才会报告通知。
具体的阈值距离由硬件和当前可用的定位技术决定。例如,如果禁用 Wi-Fi,则区域监控的准确性会大大降低。但是,出于测试目的,您可以假设最短距离约为 200 米
尽管如此,由于您可以要求高精度读数,Apple 也应该考虑到这一点。替代方法可能是 - 正如您评论的那样 - 使用 didUpdateLocation: 并确定是在区域内还是区域外。这样你就可以包含一个定位精度测试,并且只在水平精度足够好时才接受退出/进入。
【讨论】:
是的,谢谢沃尔克,你得到了我的赏金。我可以在 9 小时内奖励赏金,所以我会在 9 小时后这样做。非常感谢。我正在使用 didupdatelocation,如果这适用于非常精确的 GPS 读数来模拟确实进入和退出,我将进一步发布。以上是关于didEnterRegion 以更大的半径调用(iOS)的主要内容,如果未能解决你的问题,请参考以下文章
仅在调用 requestAlwaysAuthorization 时才调用 DidEnterRegion。信标