我正在使用核心位置框架来检测我的应用程序中的信标。我使用特定的Proximity UUID注册信标区域。
uuidString = "74278bda-b644-4520-8f0c-720eaf059935"
beaconRegionIdentifier = "ios.test"
beaconUUID = UUID(uuidString: uuidString)
beaconRegion = CLBeaconRegion(proximityUUID: beaconUUID!, identifier: beaconRegionIdentifier)
然后实现以下 CLLocationManagerDelegate 方法
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion) {
manager.startRangingBeacons(in: region as! CLBeaconRegion)
print(region)
manager.startUpdatingLocation()
print("Detected a beacon")
}
func locationManager(_ manager: CLLocationManager, didRangeBeacons beacons: [CLBeacon], in region: CLBeaconRegion) {
...
// Ranging beacons here
print(beacons)
}
我得到的日志是:
[CLBeacon (uuid:74278BDA-B644-4520-8F0C-720EAF059935, major:200, minor:51, proximity:1 +/- 0.17m, rssi:-45)]
[CLBeacon (uuid:74278BDA-B644-4520-8F0C-720EAF059935, major:200, minor:51, proximity:1 +/- 0.17m, rssi:-45)]
[CLBeacon (uuid:74278BDA-B644-4520-8F0C-720EAF059935, major:200, minor:51, proximity:0 +/- -1.00m, rssi:0)]
[CLBeacon (uuid:74278BDA-B644-4520-8F0C-720EAF059935, major:200, minor:51, proximity:0 +/- -1.00m, rssi:0)]
[]
[]
[]
即 didRangeBeacons 方法仅检测到一次信标,然后突然[CLBeacon]数组变空,即使信标在整个时间内传输数据包。
有人可以解释这种奇怪的行为吗?
PS:一旦应用程序处于后台状态,就会完美地检测到信标。仅当应用程序位于前台时才会看到这些日志
TL; DR
iOS信标应用程序无法在前台正确检测信标。
修改
信标使用相同的代码在背景中进行检测,即使用相同的功能进行前景和背景检测。我只是要求iOS的额外时间来扫描背景中的信标
func extendBackgroundTime() {
if backgroundTask != UIBackgroundTaskInvalid {
return
}
let self_terminate = false
backgroundTask = UIApplication.shared.beginBackgroundTask(withName: "RangeBeacons", expirationHandler: {() -> Void in
print("Background Task Terminated By iOS")
if self_terminate {
UIApplication.shared.endBackgroundTask(self.backgroundTask)
self.backgroundTask = UIBackgroundTaskInvalid
}
})
}