startMonitoringForRegion vs CLRegion:containCoordinate



在我的IOS应用程序中,我正在实施地理围栏。在当前的实现中,我使用如下代码:

  CLRegion* region3 = [[CLRegion alloc] initCircularRegionWithCenter:coordinates radius:100 identifier:@"region3"];
[self.locationManager startMonitoringForRegion:region desiredAccuracy:kCLLocationAccuracyHundredMeters];

然后我使用这些委托方法:

 (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region{
        NSLog(@"didenterregion");
    }
    (void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region{
        NSLog(@"didexitregion");
    }
    (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error
    {NSLog(@"monitoringDidFailForRegion");}

但是,此代码仅适用于半径大于 100m 的情况。

以下是一些问题:

  1. 苹果表示,在ios6及以上,4s及以上的设备支持半径在1到400m之间。由于我不在乎查看消息需要多长时间(就像我不在乎在进入该区域时看到消息,但我确实关心在后者查看我是否从该区域经过一次)我可以使用更小的半径吗?我对半径 50m 或更小的东西感兴趣?(在某些地区,我的情况甚至需要 20m)。

我也这么认为。苹果表示,最多可以支持20个地区。这样的解决方案的优点/缺点是什么(我还没有实现它,但我想征求您的意见)。

伪代码如下所示:

Declare the regions - save them in an array
Do not call start monitoring

然后在委托方法中:

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
      for loop in all my regions {
         if ([region containsCoordinate: newLocation.coordinate])
            code for entering region
      } 
}
  1. 会不会慢一点?
  2. 它会消耗更多的电池吗?(我认为监控区域不消耗电池)?
  3. 能更准确吗?
  4. 由于我没有注册监视器,是否可以拥有超过 20 个区域?

提前谢谢。

1.

我怀疑第二个(基于didUpdateToLocation:)实现会比第一个实现更昂贵(就电池寿命而言),仅仅是因为您只会在第一个(基于startMonitoringForRegion:)实现中运行代码当且仅当设备位于您正在跟踪的区域之一(最多 20 个)的半径内。

而在第二个实现中,每次有"didUpdateToLocation:"委托调用(这种情况会经常发生)时,代码都必须运行,然后委托方法中的代码将被运行。

顺便说一句,你说代码适用于 100m 以上的半径,但随后 Apple 文档说它应该在 iOS6 中工作,"4s 及以上的设备 1 到 400m 之间的半径"。

您的"100m"数字是您的实际结果,还是您正在使用的设备的限制(比iPhone 4s或较旧的iOS版本更旧的东西)?

阿拉伯数字。

在后台做任何事情都会消耗电池,但Apple已经为此优化了CoreLocation(前提是您在应用程序的info.plist文件中设置了正确的标志)

3.

我认为两者都同样准确,除了"startMonitoringForRegion:"可能需要几分钟才能报告该区域已进入或退出。

4.

是的,在第二个实现中,您可以拥有任意数量的区域。 但是,您在后台运行的代码越多,电池就越热,您就越有可能更快地耗尽电池电量。

相关内容

  • 没有找到相关文章

最新更新