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

Swift 3: How to scan for peripherals in background?

这是我的场景:

我连接了两个外围设备,将我的应用程序置于后台模式并开始使用外围设备,直到它们与我的应用程序失去连接。回来时,他们在伸手可及的地方不再连接。

当我在前台 运行 应用程序时执行相同的实验时,没有发生任何问题 - 外围设备更接近 iPhone 会导致重新连接。

但是,我在控制台中看到,当外围设备失去连接时,正在调用 DidDisconnectPeripheral 方法。问题是这个方法里面没有调用扫描

func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
    numberOfTagsSending = numberOfTagsSending - 1
    numberOfConnectedTags = numberOfConnectedTags - 1
    print("Tag was disconnected. Start scanning.")

    synchronizer.alreadySynced = false

    central.scanForPeripherals(withServices: arrayOfServices, options: [CBCentralManagerScanOptionAllowDuplicatesKey : true])
}

我阅读了 答案并以完全相同的方式做了所有事情,不幸的是它不起作用。

提前致谢

一旦您拥有 CBPeripheral 个实例,您就不需要再次发现它。您可以简单地连接到它;如果外围设备当前不在范围内,那么 iOS 将在外围设备进入范围内后自动连接并调用您的 didConnectPeripheral 委托方法。

func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
    numberOfTagsSending = numberOfTagsSending - 1
    numberOfConnectedTags = numberOfConnectedTags - 1

    central.connect(peripheral)
}