startMonitoringForRegion vs CLRegion:containsCoordinate

时间:2013-09-08 00:24:42

标签: ios mkmapview geofencing clregion

在我的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");}

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

以下是一些问题:

  1. Apple表示,在ios6及以上版本中,4s及以上的设备支持1到400m之间的半径。因为我不在乎需要花多长时间才能看到这条消息(就像我不想看到进入该地区时的信息,但是如果我从该地区过了一次,我确实想看到后者)我可以使用较小的半径?我对50米半径或更小的东西感兴趣? (在某些地区,我的案件甚至需要20米)。
  2. 我也认为。 Apple表示可以支持多达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个地区吗?
    5. 提前致谢。

1 个答案:

答案 0 :(得分:5)

1

我怀疑第二个(基于didUpdateToLocation:)实现与第一个实现相比会更昂贵(就电池寿命而言),因为你只会在第一个实现代码(startMonitoringForRegion:当且仅当设备进入您正在跟踪的(最多20个)区域之一的半径范围内时才实施。

而在第二个实现中,code has to run each time there's a "didUpdateToLocation:" delegate call(这将经常发生),然后委托方法中的代码将运行。

顺便说一下,你说代码在半径100米以上的情况下运行良好,但是Apple文档说它应该在iOS6中使用"支持1到400米之间的半径适用于4s及以上的设备。"

你的" 100m"对您的实际结果进行编号,或者它是您使用的设备的限制(比iPhone 4s或旧版iOS更旧的设备)?

2

在后台执行任何操作会消耗电量but Apple has optimized CoreLocation for this somewhatprovided you set the correct flag in your app's info.plist file

3

我认为两者都同样准确,except for the fact it may take up to a few minutes for "startMonitoringForRegion:" to report that the region was entered or exited

4

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