8

我正在开发的一个应用程序在后台运行时使用用户的当前位置设置区域监控。当应用程序再次激活时,我试图停止对该区域的监控,但它似乎在大多数情况下间歇性地工作,导致它无法按预期运行。当应用程序在后台运行时,我开始监视该区域,当我记录详细信息时它工作正常:

- (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 上看到的唯一其他帖子说上面对他们有用......

我错过了什么吗?

4

1 回答 1

7

如果您阅读monitoredRegions,它代表所有 CLLocationManager 实例的所有受监控区域,因此可能由私有调度队列控制 - 这可以解释延迟。

我的建议是保留你自己的可变数组(或集合),用它来跟踪哪些区域被监控,哪些没有,并且不依赖于该集合的位置管理器。

既然很明显你不能依赖它的立即更改,我会围绕它进行设计,而不是尝试找到一些似乎(今天)有效但稍后会咬你的启发式方法。

于 2014-02-06T20:00:36.297 回答