iOS CoreBluetooth: 应用程序和小组件同时与相同目标外设进行活动连接?

5
我希望在我的应用程序和小部件中,在中央模式下与外设保持持久的BLE连接,这样技术上可行吗?
原因如下:当在应用程序中建立连接后,我们将其发送到后台,然后打开今天的小部件——该小部件应继续操作连接的外设。反之亦然:如果我们隐藏了今天的小部件,则启动应用程序——应用程序应继续使用现有的连接。
2个回答

2

如果你在后台启用了蓝牙功能,那么你可以继续处理BLE事件。只需选择主项目文件,然后选择目标,在Capabilities选项卡中打开Background Modes并启用“Uses Bluetooth LE accessories”。

在你的主应用程序中,即使应用程序在后台运行,你也有机会处理任何BLE事件。

需要注意的一点是,BLE事件会发起操作,因此请确保将你想要在后台执行的代码放在委托方法内,例如didUpdateValueForCharacteristic

在初始化CBCentralManager时,你可以指定代码将在哪个队列上运行。

小部件和应用程序无法共享BLE连接。你可以使用苹果建议的方法(NSUserDefaults或键值观察)在应用程序和小部件之间进行通信,或者你可以从小部件创建另一个BLE连接,并通过它进行通信。


Marcus,感谢您的回答。这是一个好方法,但我的问题有点不同:我们能否在今天的小部件中使用已在应用程序中建立的BLE连接?反之亦然。例如:我们启动应用程序,连接BLE,隐藏应用程序,启动小部件并在那里继续连接。 - brigadir
1
请修改您的答案,因为那不是您所问的。不,小部件和应用程序不能共享连接。您可以使用苹果建议的方法(NSUserDefaults或键值观察)在应用程序和小部件之间进行通信,或者您可以从小部件创建另一个BLE连接,并通过该连接进行通信。 - Marcus Adams
Marcus,感谢你的解释和使用BLE在后台的想法。我会尝试一下... - brigadir

1
是的,这是可能的。在CBCentralManager上查看retrieveConnectedPeripheralsWithServices:
基本上,这个方法会收集整个iOS设备连接的所有外围设备。当在iOS设备上启动第二个应用程序时,请使用此方法。
当应用程序在后台运行时,其BLE连接保持活动状态,因此您可以隐藏应用程序1,启动应用程序2,使用此方法来识别您感兴趣的外围设备,并独立于第一个应用程序使用它。

那么,在第二个应用程序中使用“retrieveConnectedPeripheralsWithServices”之后,我应该连接检索到的外设,就像参考文献中所提到的那样。在这种情况下,第一个应用程序中的现有连接是否仍然保持活动状态?如果是,那么如何在两个同时连接时进行数据传输? - brigadir
是的,现有的连接保持活动状态。我不确定性能如何。 - Shay Thompson

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