iOS仅在短时间内检测信标

时间:2018-03-01 05:47:10

标签: ios swift ibeacon

我正在使用核心位置框架来检测我的应用程序中的信标。我使用特定的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
        }
    })
}

0 个答案:

没有答案