尝试检测信标但失败,因为isMonitoringAvailable始终为false

时间:2018-04-19 12:47:05

标签: ios swift core-location cllocationmanager ibeacon

您好我试图通过apple's docs article

检测和测量信标

但在我的情况下CLLocationManager.isMonitoringAvailable(for: CLBeaconRegion.self)总是给我假,因此我无法开始监控

当然,我在背景模式下为位置和位置更新设置了隐私

这是我的代码

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

我的案子有什么问题

我想完全遵循苹果公司的文档

2 个答案:

答案 0 :(得分:1)

从代码中不清楚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

答案 1 :(得分:0)

我认为isMonitoringAvailable对于iBeacon(CLBeaconRegion)可能为false的唯一原因是,您运行该应用的设备无法支持蓝牙4.0。

这包括:

  • 模拟器,
  • iPhone:第一代,3G和3GS,
  • iPad:第一代和第二代,
  • iPod Touch:第1代到第4代。

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