Swift 2 Beacon扫描在背景中

时间:2016-08-23 20:12:45

标签: ios swift2 ibeacon

我正在尝试在我的应用中运行信标背景检测。 我为此创建了一个专用类,并在我的ViewController中启动它:

    override func viewDidLoad() {
      super.viewDidLoad()
      beaconSharedInstance
      ....
    }

这是我班级的代码:

let beaconSharedInstance = iBeacon();

class iBeacon: NSObject, UIApplicationDelegate, CLLocationManagerDelegate {

var locationManager: CLLocationManager!
var beaconRegion:CLBeaconRegion!

override init(){

    super.init()

    let uuidString = "FDA50693-A4E2-4FB1-AFCF-C6EB07640978"
    let beaconIdentifier = "uby-06B524"
    let beaconUUID:NSUUID = NSUUID(UUIDString: uuidString)!
    beaconRegion = CLBeaconRegion(proximityUUID: beaconUUID, identifier: beaconIdentifier)

    locationManager = CLLocationManager()
    locationManager.delegate = self

    if(CLLocationManager.authorizationStatus() != CLAuthorizationStatus.AuthorizedAlways){
        locationManager.requestAlwaysAuthorization()
    }

    locationManager.allowsBackgroundLocationUpdates = true
    locationManager!.startRangingBeaconsInRegion(beaconRegion)
}


func locationManager(manager: CLLocationManager,
                     didRangeBeacons beacons: [CLBeacon],
                                     inRegion region: CLBeaconRegion)  {
    print("didRangeBeacons");

    if(beacons.count > 0) {

        print("Discovered beacon \(beacons[0].rssi) dBM name: \(beacons[0].proximityUUID)")
    }


}

}

这个类在前台完美运行,但只要我的应用程序变为非活动状态,我就可以在日志文件中看到:

Ending background task

并且CLLocatioManager停止......

我在我的项目的后台模式中设置了位置更新以及在我的info.plist文件中设置了NSLocationAlwaysUsageDescription但我仍然有相同的行为,当应用程序处于非活动状态时我的线程停止。

我也尝试像这样启动我的线程:

let qualityOfServiceClass = DISPATCH_QUEUE_PRIORITY_DEFAULT
    let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
    dispatch_async(backgroundQueue, {
        print("Running beacon detection in the background queue")
        beaconSharedInstance
    })

但是在那种情况下CLLocationManager永远不会启动......任何想法?

1 个答案:

答案 0 :(得分:0)

后台任务需要有一个循环,否则它只会退出。尝试:

dispatch_async(backgroundQueue, {
    print("Running beacon detection in the background queue")
    beaconSharedInstance
    while(true) {
      NSThread.sleepForTineInterval(1)
      print("running...")
    }
})