尝试检测信标但失败,因为 isMonitoringAvailable 始终为 false
Trying to detect beacons but failed because isMonitoringAvailable always false
你好,我正在尝试检测和测距 apple's docs article
之后的信标
但在我的情况下 CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self)
总是给我 false 因此我无法开始监控
当然,我在后台模式下设置了位置隐私和位置更新
这是我的代码
func initializeLocationManager(){
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
locationManager.desiredAccuracy = kCLLocationAccuracyBest
}
func rangeBeacons(){
if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) {
let region = CLBeaconRegion(proximityUUID: UUID(uuidString: beacons[0].uuid)!, identifier: beacons[0].identifier)
locationManager.startMonitoring(for: region)
}else {
print("CLLocation Monitoring is unavailable")
}
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedAlways {
rangeBeacons()
}
}
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
if region is CLBeaconRegion {
// start monitoring
if CLLocationManager.isRangingAvailable() {
locationManager.startRangingBeacons(in: region as! CLBeaconRegion)
}
}
print("didEnter at \(region.identifier)")
}
func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
print("didExit at \(region.identifier)")
}
func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
if beacons.count > 0 {
let nearestBeacon = beacons.first!
switch nearestBeacon.proximity {
case .far:
print("far")
break
case .near:
print("near")
break
case .immediate:
print("It's behind yout")
break
case .unknown:
print("unknown")
}
}
}
但如果我直接使用 locationManager.startRangingBeacons
而不是 locationManager.startMonitoring(for: region)
,它会起作用
但仍然存在问题 didEnterRegion
和 didExitRegion
没有被调用
我的问题是什么
我想跟苹果的文档文章完全一样
从显示的代码中不清楚 CLBeaconRegion.self
在上下文中的含义。尝试使用定义的区域来查看是否可用监控。
func rangeBeacons(){
let region = CLBeaconRegion(proximityUUID: UUID(uuidString: beacons[0].uuid)!, identifier: beacons[0].identifier)
if CLLocationManager.isMonitoringAvailable(for: region) {
locationManager.startMonitoring(for: region)
}else {
print("CLLocation Monitoring is unavailable")
}
}
实际上,没有真正的理由调用 isMonitoringAvailable
。没有这个检查就开始监控。如果由于某种原因失败,您将收到回调:locationManager:monitoringDidFailForRegion:withError
我认为 isMonitoringAvailable
对于 iBeacon (CLBeaconRegion
) 可能为假的唯一原因是当您 运行 应用所在的设备不支持蓝牙 4.0 时。
这包括:
- 模拟器,
- iPhone:第一代,3G 和 3GS,
- iPad:第一代和第二代,
- iPod Touch:第一代到第四代。
如果您 运行 您的应用程序在任何比这些更新的设备上运行,那么我唯一能想到的就是,您设备上的蓝牙存在问题。在这种情况下,重新启动可能会有所帮助。
你好,我正在尝试检测和测距 apple's docs article
之后的信标但在我的情况下 CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self)
总是给我 false 因此我无法开始监控
当然,我在后台模式下设置了位置隐私和位置更新
这是我的代码
func initializeLocationManager(){
locationManager.delegate = self
locationManager.requestAlwaysAuthorization()
locationManager.desiredAccuracy = kCLLocationAccuracyBest
}
func rangeBeacons(){
if CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self) {
let region = CLBeaconRegion(proximityUUID: UUID(uuidString: beacons[0].uuid)!, identifier: beacons[0].identifier)
locationManager.startMonitoring(for: region)
}else {
print("CLLocation Monitoring is unavailable")
}
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
if status == .authorizedAlways {
rangeBeacons()
}
}
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
if region is CLBeaconRegion {
// start monitoring
if CLLocationManager.isRangingAvailable() {
locationManager.startRangingBeacons(in: region as! CLBeaconRegion)
}
}
print("didEnter at \(region.identifier)")
}
func locationManager(_ manager: CLLocationManager, didExitRegion region: CLRegion) {
print("didExit at \(region.identifier)")
}
func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
if beacons.count > 0 {
let nearestBeacon = beacons.first!
switch nearestBeacon.proximity {
case .far:
print("far")
break
case .near:
print("near")
break
case .immediate:
print("It's behind yout")
break
case .unknown:
print("unknown")
}
}
}
但如果我直接使用 locationManager.startRangingBeacons
而不是 locationManager.startMonitoring(for: region)
,它会起作用
但仍然存在问题 didEnterRegion
和 didExitRegion
没有被调用
我的问题是什么
我想跟苹果的文档文章完全一样
从显示的代码中不清楚 CLBeaconRegion.self
在上下文中的含义。尝试使用定义的区域来查看是否可用监控。
func rangeBeacons(){
let region = CLBeaconRegion(proximityUUID: UUID(uuidString: beacons[0].uuid)!, identifier: beacons[0].identifier)
if CLLocationManager.isMonitoringAvailable(for: region) {
locationManager.startMonitoring(for: region)
}else {
print("CLLocation Monitoring is unavailable")
}
}
实际上,没有真正的理由调用 isMonitoringAvailable
。没有这个检查就开始监控。如果由于某种原因失败,您将收到回调:locationManager:monitoringDidFailForRegion:withError
我认为 isMonitoringAvailable
对于 iBeacon (CLBeaconRegion
) 可能为假的唯一原因是当您 运行 应用所在的设备不支持蓝牙 4.0 时。
这包括:
- 模拟器,
- iPhone:第一代,3G 和 3GS,
- iPad:第一代和第二代,
- iPod Touch:第一代到第四代。
如果您 运行 您的应用程序在任何比这些更新的设备上运行,那么我唯一能想到的就是,您设备上的蓝牙存在问题。在这种情况下,重新启动可能会有所帮助。