我将尝试使用以下代码在后台线程中发送进程:
``` 我想使用以下代码在后台线程中发送进程: ```
let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
print("running in the background queue")
btDiscovery
})
但是该类仅在前台处理时才会执行...有什么想法吗?
编辑1:
btDiscovery是一个类,每X秒执行一次BLE设备扫描:
let btDiscoverySharedInstance = Beacon();
class Beacon: NSObject, CBCentralManagerDelegate {
private var centralManager: CBCentralManager?
private var peripheralBLE: CBPeripheral?
....
func centralManagerDidUpdateState(central: CBCentralManager) {
switch (central.state) {
case CBCentralManagerState.PoweredOff:
print("BLE powered off")
self.clearDevices()
case CBCentralManagerState.Unauthorized:
// Indicate to user that the iOS device does not support BLE.
print("BLE not supported")
break
case CBCentralManagerState.Unknown:
// Wait for another event
print("BLE unknown event")
break
case CBCentralManagerState.PoweredOn:
print("BLE powered on")
self.startScanning()
break
case CBCentralManagerState.Resetting:
print("BLE reset")
self.clearDevices()
case CBCentralManagerState.Unsupported:
print("BLE unsupported event")
break
}
}
func startScanning() {
print("Start scanning...")
if let central = centralManager {
central.scanForPeripheralsWithServices(nil, options: nil)
}
}
func centralManager(central: CBCentralManager, didDiscoverPeripheral peripheral: CBPeripheral, advertisementData: [String : AnyObject], RSSI: NSNumber) {
print("Discovered peripheral \(RSSI) dBM name: \(peripheral.name)")
print("UUID: \(peripheral.identifier.UUIDString)")
...
sleep(delayPolling)
self.startScanning()
}
当应用程序启动并保持在前台时,扫描每"delayPolling"秒会正确执行。但是,一旦我将我的应用程序置于后台,扫描就会暂停。它只有在再次回到前台时才重新启动。
我需要让此扫描在后台始终运行(即使我们为此线程设置较低的优先级)。
编辑2:
当实现中央角色的应用程序在其Info.plist文件中使用UIBackgroundModes密钥,并将值bluetooth-central与之配对时,Core Bluetooth框架允许您的应用程序在后台运行以执行某些与蓝牙相关的任务。当您的应用程序在后台运行时,仍然可以发现和连接外围设备,并探索和交互与外围数据。此外,当调用任何CBCentralManagerDelegate或CBPeripheralDelegate委托方法时,系统会唤醒您的应用程序
我在我的Info.plist文件中选择了相应的选项:
但是我的应用程序没有在后台运行我的线程。