在我的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米的半径。
以下是一些问题:
我也认为。 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
}
}
提前致谢。
答案 0 :(得分:5)
1
我怀疑第二个(基于didUpdateToLocation:
)实现与第一个实现相比会更昂贵(就电池寿命而言),因为你只会在第一个实现代码(startMonitoringForRegion:
当且仅当设备进入您正在跟踪的(最多20个)区域之一的半径范围内时才实施。
而在第二个实现中,code has to run each time there's a "didUpdateToLocation:
" delegate call(这将经常发生),然后委托方法中的代码将运行。
你的" 100m"对您的实际结果进行编号,或者它是您使用的设备的限制(比iPhone 4s或旧版iOS更旧的设备)?
2
在后台执行任何操作会消耗电量but Apple has optimized CoreLocation for this somewhat(provided you set the correct flag in your app's info.plist file)
3
4
是的,在第二个实施中,您可以拥有任意数量的区域。但是,你在后台运行的代码越多,电池电量就越高,你就越有可能更快地耗尽电池。