【发布时间】:2014-03-03 18:08:03
【问题描述】:
我正在开发的一个应用程序在后台运行时使用用户的当前位置设置区域监控。当应用程序再次激活时,我试图停止对该区域的监控,但它似乎在大多数情况下间歇性地工作,导致它无法按预期运行。当应用程序在后台运行时,我开始监视该区域,当我记录详细信息时它工作正常:
- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {
DDLogInfo(@"CREATED REGION: %@", region.identifier);
}
这会导致以下日志:
- “创建区域:regionFor:[此处为实纬度,此处为实经度],半径:100”
当应用唤醒时,我调用以下函数:
- (void)stopMonitoringAllRegions {
DDLogInfo(@"About to stop monitoring for %d regions", [locationManager monitoredRegions].count);
// stop monitoring for any and all current regions
for (CLRegion *region in [[locationManager monitoredRegions] allObjects]) {
[locationManager stopMonitoringForRegion:region];
}
DDLogInfo(@"After stopping, we're currently monitoring for %d regions", [locationManager monitoredRegions].count);
}
这导致大约 75% 的时间出现以下日志:
- “即将停止对 1 个区域的监控”
- “停止后,我们目前正在监控 1 个区域”
而且我很少得到看似成功的东西:
- “即将停止对 1 个区域的监控”
- “停止后,我们目前正在监控 0 个区域”
我尝试了几件事,但都没有成功。我正在创建的区域是 CLCircularRegions,它继承自 CLRegion,因此无论如何都应该可以工作,但是在 for 循环中,我已将 CLRegion 更改为 CLCircularRegion,但没有任何效果。我最初使用 [locationManager monitorRegions] 本身,它返回一个 NSSet,所以我认为使用 allObjects 函数来获取数组可以解决问题,但它没有。
我还认为在枚举时改变数组可能是一个问题,但是我在 SO 上看到的唯一其他帖子说上面对他们有用...
我错过了什么吗?
【问题讨论】:
-
在我以前的应用程序上工作时,我遇到了同样的问题。显然 locationManager 不会立即清除受监控的区域。 [self performSelector:@selector(someMethod) withObject:nil afterDelay:0.1]; // someMethod -> 打印监控区域计数的虚拟方法。
标签: ios ios7 core-location cllocationmanager clregion