首页 > 解决方案 > locationManager.startMonitoring(for: region) 错误?

问题描述

我有一个奇怪的问题,我一辈子都解决不了。

我正在创建一个在后台监视区域的应用程序,但它似乎间歇性地不监视某些区域(我已将位置权限设置为始终,并启用了后台位置功能)。

它监控的区域工作正常,所以它似乎与locationManager.startMonitoring(for: region)

该应用程序非常简单,每次添加或编辑区域时,它:

  1. 停止监控所有区域
  2. 然后,如果少于 20 个区域,则开始监控所有区域
  3. 否则,计算最接近的 20 并开始监控它们

这是代码

let locationManager = CLLocationManager()



if(regionsArray.count <= 20{

    //monitor all regions
    monitorAllRegions()

}else{

    //calculate closest 20 regions, and monitor them

    //do some stuff here.....
}


func monitorAllRegions(){

    //stop monitoring all regions
    stopMonitoringAllRegions()

    //start monitoring all regions in array
    for region in regionsArray{
        locationManager.startMonitoring(for: region)
    }

    //check all regions are monitored
    print(regionsArray.count)
    print(locationManager.monitoredRegions.count)

}


func stopMonitoringAllRegions() {

    //stop monitoring all monitored regions
    for region in locationManager.monitoredRegions {
        locationManager.stopMonitoring(for: region)
    }

}

一旦监控了所有区域,它就会打印阵列中的区域总数以及受监控区域的总数,以确保它们都已添加。奇怪的是,大约 50% 的时间,被监控的区域数小于区域数组数,所以它不是监控 1 个或更多区域?

首先,我假设一个或多个区域存在问题,但并不总是错过相同的区域(我已经检查了阵列中的区域与受监控的区域)。

此外,它并不总是发生,例如:

我打开区域 1,不做任何更改,然后保存...计数相等

然后我再次打开区域 1,不做任何更改并保存...监控的计数现在小于数组计数?

另一个奇怪的事情是,如果我在 locationManager.startMonitoring(for: region) 上设置断点,它工作得非常好,就好像放慢代码速度让它以某种方式正常工作?但是一旦我禁用 BP 并让代码运行,它就会再次开始不受监控的位置

这是一个错误,还是我错过了一些愚蠢的东西?我对快速编码很陌生,这是我第一次尝试区域监控,所以我有点难过

任何帮助将不胜感激

标签: swiftlocationlocationmanager

解决方案


推荐阅读