iOS - 关闭WiFi后的地理围栏技术

6

我有一段代码,在我的iPhone上创建了一个地理围栏,当didExitRegion被调用时会触发一些代码执行。但是,我发现当我关闭WiFi时,didExitRegion永远不会被触发。

iOS在监测区域变化时需要WiFi吗?

我的期望精度设置为kCLLocationAccuracyHundredMeters。

我正在iOS 6.1和iPhone 4上进行测试。

这是我设置位置监测的代码:

- (id)init {
self = [super init];
if (self) {
    CLLocationManager *manager = [[CLLocationManager alloc] init];
    manager.delegate = self;
    manager.desiredAccuracy = kCLLocationAccuracyHundredMeters;
    manager.distanceFilter = RADIUS/10.0;
    manager.headingFilter = kCLHeadingFilterNone;
    self.locationManager = manager;
    self.authorizationStatus = [CLLocationManager authorizationStatus];
}
return self;
}

谢谢

3个回答

11

iOS设备使用三种方法来确定用户位置,通常从最准确到最不准确分别是:

  1. GPS硬件
  2. 通过识别附近的WiFi网络
  3. 基站三角定位

如果您的应用程序不使用GPS或未运行(即已经终止),设备将尝试使用上述2和3方法来定位用户。因此,在GPS硬件未使用或GPS信号较弱时,设备定位用户的能力取决于WiFi网络和基站的可用性。WiFi网络和基站越多,定位精度就越高。因此,当用户进入或退出监视区域(即穿过“地理围栏”)时,无法预测用户是否会在何时收到通知,如果有的话也无法确定具体时间。(当然,如果涉及的区域始终相同,则设备每次都可以以大致相同的精度定位用户)。

以下是来自位置感知编程指南的相关文档:

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

因此,区域监视不需要WiFi即可工作,但启用WiFi后,您的设备将更有机会确定用户是否已越过某个区域的地理围栏。


无论你是否使用WIFI,你都不能在系统设置中关闭WIFI。 - LiangWang
@Jacky - 我可以在iOS 7上关闭我的iPhone的Wi-Fi。我从底部边缘向上滑动,然后就有了控制中心。然后我切换Wi-Fi符号(AirPort)。 - Nicolas Barbulesco
一个应用程序可以选择仅使用三种方法中的某些特定方法吗?应用程序Citymapper表示其地理围栏不使用GPS芯片。这是可能的吗? - Nicolas Barbulesco

2
如果关闭WiFi,您的位置精度会降低。如果没有GPS信号(在某些建筑物内),您将无法获得任何位置更新。您是否尝试过在户外进行此操作,或者使用位置模拟器进行测试?
另外,如果您有GPS(带有sim卡的iPhone或iPad),则不需要WiFi即可使用地理围栏功能。

2
嘿,是的,我一直在外面测试它,而不是在室内。我已经通过在应该越界的地方四处走动来测试它。当关闭Wi-Fi时,它从未越界。我知道关闭Wi-Fi会降低定位精度,但不至于导致地理围栏完全失效吧? - Brian Boyle
这可能意味着几件事情。当你关闭WiFi时,你已经退出了围栏,因为精度的差异,而苹果没有回调给你。奇怪的事情可能会发生。我建议你将精度设置为10米,然后使用仅GPS而不是WiFi来设置你的地理围栏,半径为100米,并测试didExitRegion是否被触发。 - mskw

2
奇怪的事情在没有wifi的情况下使用核心位置服务时可能会发生。为了帮助你解决问题,我建议去掉距离过滤器,因为它可能会干扰事情并且没有什么用处。对于需要设置地理围栏所需精度的任何情况,我可能只会使用kCLLocationAccuracyBest。对我来说,使用其他精度和过滤器有时会使GPS计量器偏移1000米,并需要一两分钟才能纠正。如果这会消耗太多电池,请设置一个系统,根据与围栏的距离远近打开和关闭。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接