我简化了一下这个问题。当我在我的应用中创建和添加区域并询问这些区域的状态时,我在monitoringDidFailForRegion
方法中看到以下内容:
The operation couldn’t be completed. (kCLErrorDomain error 4.)
检查CLErrorDomain constants我发现错误4是kCLErrorRegionMonitoringDenied
,其描述如下:
Access to the region monitoring service was denied by the user.
这怎么可能?这是我的设置和我检查过的内容:
didChangeAuthorizationStatus
报告的状态正确:kCLAuthorizationStatusAuthorized
didStartMonitoringForRegion
的调用开始监视确实开始了。我错过了什么?为什么在明确启用位置服务时会看到此错误?
答案 0 :(得分:17)
所以,我又看了documentation on Region Monitoring,我在列表中突出显示的项目中注意到了这一点:
确定区域监控的可用性
在尝试监控任何区域之前,您的应用应检查当前设备是否支持区域监控。有几个原因导致可能无法进行区域监测:
- 设备可能没有支持区域监控所需的硬件。
- 用户可能已拒绝该应用授权使用区域监控。
- 用户可能已在“设置”应用中禁用了位置服务。
- 用户可能已在设置应用中为设备或应用禁用了后台应用刷新功能。
- 设备可能处于飞行模式,无法启动必要的硬件。
然后我检查了背景应用刷新(iOS 7中的新功能:设置>常规>后台应用刷新)已打开并可用于我的应用。 不是 。我打开了这个功能,BOOM我的区域现在正在报告他们的状态。
令人困惑和误导:
[CLLocationManager isMonitoringAvailableForClass:[CLRegion class]] returns YES
...即使禁用后台应用刷新。我认为它会返回NO。
<强>更新强>
我已向Apple和added an Open Radar发送了一个错误报告,以解决此问题。
更新3-11-14:
Apple确认这是一个错误。答案 1 :(得分:4)
为了进行区域监控(至少在iOS 9中),您需要请求“始终”授权。这在我能找到的任何地方都没有记录,但这是我能够让区域监控工作的唯一方法。
rdar:// 23566600 - 如果你在苹果内部:)
答案 2 :(得分:0)
在授予使用位置服务的权限时,请尝试在info.list中添加适当的条目以获取用户提示。这些info.plist条目是(NSLocationWhenInUseUsageDescription和NSLocationAlwaysUsageDescription)。我注意到遗漏了NSLocationUsageDescription条目并没有产生同样的负面影响。祝好运。
答案 3 :(得分:0)
我的案例帮助设置“总是” “为了进行区域监控(至少在iOS 9中),您需要”始终“授权”和300米半径