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