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

Posted

技术标签:

【中文标题】iOS如何在后台重新连接到BLE设备?【英文标题】:iOS how to reconnect to BLE device in background? 【发布时间】:2014-11-12 02:21:11 【问题描述】:

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

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

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

所以我可以在后台与连接的 BLE 设备通信(耶!)但不能重新连接。这对我的应用程序非常重要,并且(人们会认为)对其他应用程序来说。欢迎提出建议。

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

didDisconnectPeripheral,您可以简单地调用

[central connectPeripheral:peripheral options:nil];

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

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

【讨论】:

不幸的是不适合我。事实上,使用 connectPeripheral(而不是重新调用 scanForPeripherals)我的应用程序不会重新连接,即使它仍在前台。永远不会重新建立连接。而如果我在 didDisconnectPeripheral 中调用 scanForPeripheral,我会在前台重新连接,但仍然不在后台。 Grr. 设备是 TI SensorTag,FWIW。 好的。传感器标签很烦人 - 它们会在几分钟后关闭,所以我不确定这是否是您的问题。 iOS 设备也很难使用,因为它们每隔几分钟就会更改一次 MAC 地址。我有一个传感器标签,所以我会玩一玩,看看会发生什么。我可能需要一两天... 谢谢保罗。我认为这与任何自动断开连接无关。这是我故意断开连接(或走 50m 远)以强制断开连接。我也会继续插电的。必须是一个已解决的问题.. 否则每个人都在同一个泡菜中。 一旦您确定了外围设备,您就可以使用其 UUID 重新连接(假设它不是按照我之前的评论更改的 iOS 设备)【参考方案3】:

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

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

希望这会有所帮助。

【讨论】:

对我来说,关键是为队列传递适当的参数,如上所述。但是,这些选项也绝对是相关的。谢谢。【参考方案4】:

在“功能”选项卡 -> 后台模式中,选择“用户蓝牙 LE 配件”和“充当蓝牙 LE 配件”。我不确定它是否可以工作,但你可以尝试一下。

【讨论】:

感谢您的建议。我已经检查了使用蓝牙 LE 配件。我添加了 Acts As,但并没有改变。不过好主意。人们应该始终尝试不应该起作用的事情。因为它们可能会起作用!

以上是关于iOS如何在后台重新连接到BLE设备?的主要内容,如果未能解决你的问题,请参考以下文章

Android上的BLE(蓝牙低功耗蓝牙),创建并重新连接到并不总是存在的设备

移动应用程序可以连接到 BLE 设备并在后台保持连接数小时吗?

为啥在 Android 中将 autoConnect 设置为 true 时,App 不会重新连接到 BLE 设备?

使用 MAC ios 连接到 BLE 设备

如果在 Android 中连接到 BLE 设备失败,如何通知用户?

XCode:如何通过 UUID 连接到 BLE 外围设备?