Swift 2 Beacon 在后台扫描

Posted

技术标签:

【中文标题】Swift 2 Beacon 在后台扫描【英文标题】:Swift 2 Beacon scan in background 【发布时间】:2016-08-23 20:12:44 【问题描述】:

我正在尝试在我的应用中运行信标背景检测。 我为此创建了一个专用类并在我的 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 永远不会启动...有什么想法吗?

【问题讨论】:

“结束后台任务”日志从何而来?你在用beginBackgroundTaskWithExoirariinHandler吗? 【参考方案1】:

后台任务需要有循环,否则直接退出。试试:

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

【讨论】:

你确定吗?因为,当我的应用程序处于前台时,每秒钟执行一次扫描... 通过添加您的代码,我只有运行...运行...运行...运行...运行...运行...运行...运行...运行。 .. 正在运行... 但 CLLocationManager 永远启动 对,很好——这意味着后台任务实际上正在运行,并且一直在运行。你没看到“didRangeBeacons”吗?如果不是,这可能表明附近没有信标。另一种想法:初始化序列可能是一个问题。尝试在 while(true) 之前移动 let beaconSharedInstance = iBeacon();,然后看看会发生什么。 不,当我将 beaconSharedInstance 作为独立线程启动时,我看不到 didRangeBeacons,如果 didRangeBeacons 不在主线程中,它似乎永远不会被调用......即使范围内没有信标, 这个函数被调用(在主线程中)。 顺便说一句,当我将应用程序设置为非活动/后台(例如锁定屏幕)时,我的日志中有“正在结束后台任务”

以上是关于Swift 2 Beacon 在后台扫描的主要内容,如果未能解决你的问题,请参考以下文章

Android Beacon库-继续记录周期扫描作业ID和即时扫描作业ID

Swift 3:如何在后台扫描外围设备?

148.网络安全渗透测试—[Cobalt Strike系列]—[HTTP Beacon基础使用/脚本web传递/屏幕截图/端口扫描]

iOS 后台扫描上的 Google Nearby API

Android Wifi 主动扫描 被动扫描

主动扫描和被动扫描的区别