swift - locationManager.startMonitoring(for: region) 错误?
问题描述
我有一个奇怪的问题,我一辈子都解决不了。
我正在创建一个在后台监视区域的应用程序,但它似乎间歇性地不监视某些区域(我已将位置权限设置为始终,并启用了后台位置功能)。
它监控的区域工作正常,所以它似乎与locationManager.startMonitoring(for: region)
该应用程序非常简单,每次添加或编辑区域时,它:
- 停止监控所有区域
- 然后,如果少于 20 个区域,则开始监控所有区域
- 否则,计算最接近的 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 并让代码运行,它就会再次开始不受监控的位置
这是一个错误,还是我错过了一些愚蠢的东西?我对快速编码很陌生,这是我第一次尝试区域监控,所以我有点难过
任何帮助将不胜感激
解决方案
推荐阅读
- google-tag-manager - 为什么我的 GTM 点击 ID 触发器会在所有点击时触发?
- c - 访问二维数组中的元素时出错
- javascript - CKEditor 插件在删除后缓存在磁盘中。如何强制浏览器重新扫描或删除该缓存?
- webpack - 使用 webpack style-loader 捆绑的包不兼容 SSR,因此无法导入 Next.js
- vue.js - 类型 vuejs pwa data() 函数上不存在属性
- c# - 美元 ($) 前缀字段对存储无效
- date - Hippo CMS 文件夹的创建日期
- typescript - 使用具有类的泛型类型 - 类型 T 不满足约束
- asp.net - Azure AD B2C - ASP.NET Core 注册链接
- python - 如何保存网络抓取 Python 的结果