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

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

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

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

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

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

didDisconnectPeripheral您可以简单地调用

 [central connectPeripheral:peripheral options:nil]; 

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

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

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

 _manager = [[CBCentralManager alloc]initWithDelegate:self queue:dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)]; 

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

我知道你可能已经弄明白了。 我自己也偶然发现了这个问题。 单独执行以下操作并不能完全解决问题(至少对我而言):
[central connectPeripheral:peripheral options:nil];

您需要在上述方法中提供“选项”,而不是选项的“nil”。 您还需要设置其他内容(例如应用的info.plist)。 阅读Apple关于如何为App启用后台蓝牙操作的说明。 我能够让它工作并接收连接,断开连接,更新等事件,甚至扫描可以在后台工作。 不要重复Apple文档所写的所有内容,您可以查看以下链接:
适用于iOS应用的核心蓝牙背景处理

希望这可以帮助。

在“function” – >背景模式选项卡中,选择“用户蓝牙LE配件”和“充当蓝牙LE配件”。我不确定它是否可以工作,但您可以尝试一下。