或者问另一种方式
[CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]
和
[CLLocationManager isRangingAvailable]
永远会回归不同的价值观吗?
答案 0 :(得分:4)
简短回答:不,没有任何iOS设备可以监控iBeacons,但不能对它们进行测距。如果isMonitoringAvailableForClass被赋予CLBeaconRegion实例,则两种方法都将返回相同的值。
API看起来这样的原因是因为可以使用CLBeaconRegion类以外的类调用isMonitoringAvailableForClass方法。 CLCircularRegion用于监控地理围栏区域。在没有LE蓝牙的设备上传递CLBeaconRegion时,该方法可能返回NO,在同一设备上传递CLCircularRegion时返回YES。
答案 1 :(得分:2)
我相信有一种情况,[CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]
将返回NO
而[CLLocationManager isRangingAvailable]将返回YES
。
如果关闭后台应用刷新,[CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]
应返回NO
。
在Apple的位置和地图编程指南下的“确定区域监控的可用性”部分下:
在尝试监控任何地区之前,您的应用应该检查 当前设备是否支持区域监控。这是 可能无法进行区域监测的一些原因:
- 设备没有必要的硬件来支持区域监控。
- 用户拒绝了应用程序使用区域监控的授权。
- 用户在“设置”应用中禁用了位置服务。
- 用户在设置应用中停用了背景应用刷新,适用于设备或应用。
- 设备处于飞行模式,无法启动必要的硬件。
(我加粗了第四个要点,因为我正在谈论的情况。)
然而,测距仅是前景活动,因此后台应用刷新设置并不重要。
在这种情况下,区域监控将不可用,但可以进行测距。
注意:目前,当启用后台应用刷新时,[[CLLocationManager isMonitoringAvailableForClass:[CLBeaconRegion class]]
会返回YES
,但当您开始监控时,您将永远不会收到通知,如果您致电{{1然后将在CLLocationManager的委托上调用requestStateForRegion:
。
错误消息将是“操作无法完成”。错误代码为4,通过locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error
转换为CLError.h
。
我希望Apple能够在接下来的几次更新中解决kCLErrorRegionMonitoringDenied
中的误报。