繁体   English   中英

快速后台扫描BLE

[英]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]

}

打开“背景模式”功能。

并打开以下两个选项:1.用户蓝牙LE配件。 2.充当Bluetooth LE附件。

与截图相同:

在此处输入图片说明

现在,BLE在iOS应用程序中以后台模式运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM