尝试检测信标但失败,因为 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),它会起作用

但仍然存在问题 didEnterRegiondidExitRegion 没有被调用

我的问题是什么

我想跟苹果的文档文章完全一样

从显示的代码中不清楚 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:第一代到第四代。

如果您 运行 您的应用程序在任何比这些更新的设备上运行,那么我唯一能想到的就是,您设备上的蓝牙存在问题。在这种情况下,重新启动可能会有所帮助。