您好我试图通过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)
,则可以使用
但仍未解决问题didEnterRegion
和didExitRegion
我的案子有什么问题
我想完全遵循苹果公司的文档
答案 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。
这包括:
如果您在比这些设备更新的任何设备上运行您的应用,那么我能想到的唯一剩下的事情是,设备上的蓝牙存在问题。在这种情况下,重启可能有所帮助。