iOS如何在后台重新连接到BLE设备?

And*_*can 13 background-process ios bluetooth-lowenergy

有许多相关的问题,但(显然)没有答案.所以...

当应用程序处于后台时,我的iOS应用程序确实从我的BLE设备获取更新.如果我与BLE设备失去联系,那么在centralManager:didDisconnectPeripheral:我打电话 - [CBCentralManager cancelPeripheralConnection:]- 否则我将永远不会重新连接到丢失的外围设备.然后我拨打[(重新)电话 - [CBCentralManager scanForPeripheralsWithServices:options:].

记录显示didDisconnectPeripheral呼叫及其包含的呼叫都在后台发生.但是,仅当应用程序从后台唤醒时才会重新连接.

所以我能够在后台(连接!)与连接的BLE设备进行通信,但不能重新连接.这对我的应用程序非常重要,并且(人们会想到)其他应用程序.建议欢迎.

Pau*_*w11 9

您无需取消连接 - 它已经断开连接您无需重新扫描外围设备 - 您已经识别了外围设备.

didDisconnectPeripheral你可以简单地打电话

[central connectPeripheral:peripheral options:nil];
Run Code Online (Sandbox Code Playgroud)

一旦外围设备再次可见,核心蓝牙将重新连接

完整的示例在这里 - https://github.com/paulw11/BTBackground


And*_*can 9

Paul是正确的,我不需要取消连接,而且我不需要重新扫描,我需要做的就是调用connectPeripheral.但是......我没做的是这样的:

_manager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)];
Run Code Online (Sandbox Code Playgroud)

我为队列传递了nil,这意味着我的CBCentralManagerDelegate回调正在主线程上运行.