Ios 位置管理器停止监视区域不工作

Ios 位置管理器停止监视区域不工作,ios,ios7,core-location,cllocationmanager,clregion,Ios,Ios7,Core Location,Cllocationmanager,Clregion,我正在开发的一个应用程序当前设置了区域监控,当该应用程序处于后台时,该监控会显示用户的当前位置。当应用程序再次激活时,我试图停止对该区域的监视,但它似乎在大部分时间内间歇性工作,导致它无法按预期运行。当应用程序处于后台时,我开始监视该区域,当我记录详细信息时,它工作正常: - (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region { DDLogIn

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

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {
    DDLogInfo(@"CREATED REGION: %@", region.identifier);
}
这将导致以下日志:

  • 已创建区域:regionFor:[此处为实lat,此处为实lon],半径为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个区域”
我试过几件事都没有成功。我正在创建的区域是CLCircularRegion,它继承自CLRegion,因此无论如何都可以工作,但在for循环中,我将CLRegion更改为CLCircularRegion,但没有任何效果。我最初单独使用[locationManager monitoredRegions],它会返回一个NSSet,所以我认为使用AllObject函数获取数组可以解决这个问题,但事实并非如此

我还认为在枚举时对数组进行变异可能会有问题,但我在上面看到的另一篇文章中唯一提到,上面的方法对它们有效


我遗漏了什么吗?

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

我的建议是保留您自己的可变数组(或集合),使用它跟踪哪些区域被监视,哪些不被监视,并且不依赖位置管理器来收集


现在很明显,你不能依赖于对它的即时更改,我会围绕它进行设计,而不是试图找到一些(今天)似乎有效但后来又会咬到你的启发式方法。

当我在开发上一个应用程序时,我遇到了同样的问题。显然地点经理不会马上清除监控区域。[自执行选择器:@selector(someMethod)with object:nil afterDelay:0.1];//someMethod->打印监控区域计数的虚拟方法。有趣。我的应用程序一次只需要监视一个区域,所以我感兴趣的就是停止监视旧区域,然后开始监视新区域。我认为我看到的问题实际上只是一个与想要记录所有细节有关的问题——我认为我的实现可能会按预期工作——现在就进行测试。@Mike同意,这更像是一个表面问题。但是,如果你无意中改变了一些东西,你可能会遇到麻烦。我在玩信标游戏,有一个bug,我让位置经理启动了两次监视-这破坏了一切!它仍然显示正在管理的区域,但从那时起什么也没有发生。如果在我的
didExitRegion
中,我不执行
manager。停止监视区域(region)
每次检查位置时,我是否会有无数次回调?@Honey向主线程分配一个块以停止监视。可能需要设置一个标志,表明此操作已完成,然后忽略任何其他
didexitregion