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

15

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

我的iOS应用程序在后台运行时确实会从我的BLE设备获取更新。如果我与BLE设备失去联系,那么在centralManager:didDisconnectPeripheral:中,我调用-[CBCentralManager cancelPeripheralConnection:] -- 否则,我将永远无法重新连接到丢失的外围设备。然后我调用[(re)call -[CBCentralManager scanForPeripheralsWithServices:options:]

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

因此,我能够在后台与已连接的BLE设备通信(耶!),但无法重新连接。这对我的应用程序非常重要,也对其他应用程序(人)很重要。欢迎提供建议。

4个回答

11

保罗是正确的,我不需要取消连接,也不需要重新扫描,并且我所需要做的只是调用connectPeripheral。但是...我没有做到的是:

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

我之前将队列参数传递为nil,这意味着我的CBCentralManagerDelegate回调函数在主线程上运行。


9

您不需要取消连接 - 连接已经断开。

您不需要重新扫描外围设备 - 您已经识别了外围设备。

didDisconnectPeripheral 中,您只需调用

[central connectPeripheral:peripheral options:nil];

当外设再次可见时,Core Bluetooth 将重新连接。

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


谢谢Paul。我不认为这与任何自动断开连接有关。这是我故意断开连接(或走50米远)以强制失去连接。我也会继续努力。这一定是一个已解决的问题...否则每个人都在同样的困境中。 - Andrew Duncan
1
一旦您已经确定了外围设备,您只需使用其UUID重新连接(假设它不是iOS设备,因为根据我之前的评论,它会发生变化)。 - Paulw11
如果中央重置,外围对象将不再有效。 - Can
调用connectPeripheral时,CoreBluetooth会在外设再次可见时重新连接。这不会耗尽电池吗? - Arubu
不是的。设备只是在监听外围设备的广告,没有发送任何东西。 - Paulw11
显示剩余9条评论

3
我知道你可能已经把一切都想清楚了。我自己也遇到了这个问题。单独执行以下操作无法完全解决问题(至少对我而言):
[central connectPeripheral:peripheral options:nil];

在上述方法中,你需要提供“options”而不是“nil”作为选项。你还需要设置其他一些东西(例如,应用程序的info.plist)。 阅读苹果公司有关如何使应用程序启用后台蓝牙操作的说明后,我能够让它工作并接收连接、断开连接、更新等事件,甚至可以在后台扫描。不必重复苹果文档中的所有内容,你可以查看以下链接:
iOS 应用程序的 Core Bluetooth 后台处理

希望这有所帮助。


对我来说,关键是像上面提到的那样传递队列的适当参数。但是选项确实也很重要。谢谢。 - Andrew Duncan

0
在“功能”选项卡中,选择“后台模式”,并勾选“用户蓝牙LE配件”和“作为蓝牙LE配件”。我不确定它是否可行,但你可以试一试。

谢谢您的建议。我已经勾选了使用蓝牙LE配件。我添加了Acts As,但事情并没有改变。虽然如此,这是个好主意。人们应该尝试那些不应该起作用的东西。因为它们可能会起作用! - Andrew Duncan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接