[英]Background scan BLE in swift
我正在尝试与BLE在后台连接,但它没有在后台连接。 当我的应用程序处于前台时,它可以正常工作。 我正在尝试使用外围设备的UUID进行扫描。 这是附加的代码。
override func viewDidLoad() {
super.viewDidLoad()
manager = CBCentralManager(delegate: self, queue: nil)
}
func centralManagerDidUpdateState(_ central: CBCentralManager) {
var msg = ""
switch central.state {
case .poweredOff:
msg = "Bluetooth is Off"
case .poweredOn:
msg = "Bluetooth is On"
let arrayOfServices: [CBUUID] = [CBUUID(string: "CCAExxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]
manager?.scanForPeripherals(withServices:arrayOfServices, options: nil)
case .unsupported:
msg = "Not Supported"
default:
msg = "Not Connected"
}
print("STATE: " + msg)
}
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
print("Name: \(peripheral.name)") //print the names of all peripherals connected.
//you are going to use the name here down here ⇩
if peripheral.name == "Name of device" { //if is it my peripheral, then connect
self.myBluetoothPeripheral = peripheral //save peripheral
self.myBluetoothPeripheral.delegate = self
manager.stopScan() //stop scanning for peripherals
manager.connect(myBluetoothPeripheral, options: nil) //connect to my peripheral
}
}
怎么解决呢?
您需要做的是在实例化CentralManager时,需要使用恢复标识符实例化它。
例如:
CBCentralManager(delegate: self,options:
[CBCentralManagerOptionRestoreIdentifierKey: "bleCentralManager"])
这是必要的,因为在Apple文档中说“ Core Bluetooth仅保留具有恢复标识符的那些对象的状态”。
然后,当您的应用重新启动到后台时,您必须在appDelegate的application:didFinishLaunchingWithOptions:方法中使用相同的恢复标识符重新实例化适当的中央管理器。您可以像这样获得恢复标识符:
let centralManagerIdentifiers = launchOptions![UIApplicationLaunchOptionsKey.bluetoothCentrals]
最后,在您的中央管理器centralManager(_ Central:CBCentralManager,willRestoreState dict:[String:Any])委托方法中,您可以获取中央管理器已连接或试图连接到的所有外围设备的列表,并可以执行任何操作用这种方法。
func centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any]) {
let peripherals = dict[CBCentralManagerRestoredStatePeripheralsKey]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.