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

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

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

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

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

【问题讨论】:

    标签: ios bluetooth-lowenergy background-process


    【解决方案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,但并没有改变。不过好主意。人们应该始终尝试不应该起作用的事情。因为它们可能会起作用!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-01
      • 1970-01-01
      • 2016-01-30
      相关资源
      最近更新 更多