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 设备?