Or asked another way will
[CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]
and
[CLLocationManager isRangingAvailable]
ever return different values?
Or asked another way will
[CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]
and
[CLLocationManager isRangingAvailable]
ever return different values?
简短的回答:不,没有任何 iOS 设备可以监控 iBeacon 但不能对其进行范围。如果给 isMonitoringAvailableForClass 一个 CLBeaconRegion 实例,这两种方法都将返回相同的值。
API 看起来如此的原因是因为可以使用 CLBeaconRegion 类以外的类调用 isMonitoringAvailableForClass 方法。CLCircularRegion 用于监控地理围栏区域。当在没有 LE 蓝牙的设备上传递 CLBeaconRegion 时,该方法可能返回 NO,而在同一设备上传递 CLCircularRegion 时返回 YES。
我相信有一种情况[CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]
会返回NO
,并且 [CLLocationManager isRangingAvailable] 会返回YES
。
如果关闭后台应用刷新[CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]
应该返回NO
.
在“确定区域监控的可用性”部分下的Apple位置和地图编程指南中:
在尝试监控任何区域之前,您的应用应检查当前设备是否支持区域监控。以下是区域监控可能不可用的一些原因:
- 该设备没有支持区域监控的必要硬件。
- 用户拒绝了应用程序使用区域监控的授权。
- 用户在“设置”应用中禁用了定位服务。
- 用户在设置应用程序中为设备或您的应用程序禁用了后台应用程序刷新。
- 设备处于飞行模式,无法启动必要的硬件。
(我已经将第四个要点加粗,因为我正在谈论的就是这种情况。)
然而,测距只是一个前台活动,因此后台应用刷新设置并不重要。
在这种情况下,区域监控将不可用,但测距将可用。
注意:目前,当后台应用刷新[[CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]
返回YES
时,但是当您开始监控时,您将永远不会收到通知,如果您调用requestStateForRegion:
thenlocationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error
将在 CLLocationManager 的委托上调用。错误消息将是“操作无法完成”。错误代码为 4,通过转换CLError.h
为kCLErrorRegionMonitoringDenied
.
[[CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]
我希望苹果能在接下来的几次更新中修复误报。