iOS BLE后台重连

Posted

技术标签:

【中文标题】iOS BLE后台重连【英文标题】:iOS BLE background reconnection 【发布时间】:2018-01-18 17:30:23 【问题描述】:

我在后台重新连接设备时遇到问题。当我离开 BLE 设备区域时,离开 iPhone 大约 3 分钟,等待后台然后返回,它不会重新连接。我试图在后台扫描外围设备,但即使我指定了 UUID,它也无法正常工作。有什么解决办法吗?

func centralManager(central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: NSError?) 
        dispatch_async(dispatch_get_main_queue(), 
            self.centralManager?.connectPeripheral(self.choosenPeripheral!, options: nil)  
        )    
   

【问题讨论】:

您需要显示一些代码,但本质上,当您调用didDisconnect 委托方法时,您应该立即在外围设备上调用connect。然后,当它回到范围内时,您将重新连接到它。 我在didDisconnect中调用connect:gist.github.com/anonymous/d84ec2b18f9937d86d6ca44e6e3aa708我在第一次连接后设置了选择的外围设备,我也尝试在dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0)中放置连接 请edit您的问题显示相关代码。 您不需要Dispatch。您只需要centralManager.connectPeripheral(peripheral, options: nil)。确保您在应用功能上启用了适当的蓝牙后台模式。您还需要选择恢复蓝牙状态以进行长期后台操作,以便 ios 可以在需要时重新启动您的应用程序。不要使用UIViewController 来保存您的CBCentralManager 和相关属性。使用由您的 AppDelegate 持有或作为 Singleton 实现的另一个类。 我将它存储在单例中。测试后我会尝试不发送和回复。感谢您的帮助! 【参考方案1】:

当外设断开连接时,只需在didDisconnectPeripheral委托方法中再次调用connectPeripheral即可;这将创建一个“待处理”连接,一旦外围设备回到范围内,iOS 就会连接到它并调用您的 didConnectPeripheral 委托方法。

您不需要Dispatch 连接操作。只需使用:

func centralManager(central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: NSError?) 
        central.connectPeripheral(peripheral, options: nil)    

【讨论】:

这个挂起的重新连接没有超时吗?我有一个应用程序可以执行此操作,但似乎只有在外围设备在一段时间内回到范围内时才会重新建立连接。几个小时后回到范围内似乎并没有为我重新建立连接。将应用程序带到前台并调用 connect() 确实会重新建立连接,因此它似乎不是外围设备进入某种低功耗状态。

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

腾讯云服务器只要操作后台老是网络重连

mysql 连接闪断自动重连的方法(用在后台运行中的PHP代码)

iOS 配对设备重连代理

SignalR注册成Windows后台服务,并实现web前端断线重连

Socket.IO-client.java 反复断开重连

RabbitMQ 消费者断线重连