核心蓝牙:CBPeripheral 在不知不觉中断开连接并且没有收到任何对 didDisconnectPeripheral 的调用

Core Bluetooth: CBPeripheral disconnects unknowingly and not getting any call to didDisconnectPeripheral

我有 3 个视图控制器。 1)首页VC 2) 扫描VC 3) 连接 VC

步骤: 从主页 VC,我按下扫描 VC 以扫描可用的 BLE 设备。

扫描VC:我这里有所有的BLE通信代码:

override func viewDidLoad() {
        super.viewDidLoad()

            AppConstants.sharedInstance.centralManager = CBCentralManager(delegate: self, queue: nil) // created global Instance for central Manager and assigned it here
    }

上面将调用 centralManagerDidUpdateState(_ central: CBCentralManager) 我正在检查蓝牙的所有状态。如果,

case .poweredOn:
            btnRefresh.isEnabled = true
            print("central.state is .poweredOn...")

            startScan()
        }

然后我扫描设备。

拿到设备后,我会从扫描设备列表中连接到它,

然后我成功连接到该设备,它转到 连接 VC。

到这里一切都很好。

但真正的问题开始于

1) 我从 弹出连接 VC 到扫描 VC 然后再次弹出到 HOMEVC

2) 然后我再次从主页VC推送到扫描VC

扫描 VC: 这将调用委托并将其分配给我的全局 CentralManager,一旦它再次分配委托,它就会断开之前的连接。 (即使我没有接到任何 didDisconnectPeripheral 电话)

override func viewDidLoad() {
        super.viewDidLoad()

            AppConstants.sharedInstance.centralManager = CBCentralManager(delegate: self, queue: nil) // Here when I come again it disconnects old connection.
    }

我不知道出了什么问题。我没有收到任何错误。 请帮助...

我认为,由于您在 viewDidLoad 中将 CBCentralManager 重新分配给 AppConstants.sharedInstance.centralManagerCBCentralManager 被破坏并断开连接。

此外,当它被销毁时,它不会返回任何委托回调。

那么你能不能像下面这样只初始化一次 CBCentralManager 并在需要时断开连接?

示例:

override func viewDidLoad() {
        super.viewDidLoad()


        if AppConstants.sharedInstance.centralManager == nil{

            AppConstants.sharedInstance.centralManager = CBCentralManager(delegate: nil, queue: nil)
        }

        AppConstants.sharedInstance.centralManager.delegate = self
    }

不用担心。我找到了解决方法。感谢@Natrajan 给我一些想法。

override func viewDidLoad() {
            super.viewDidLoad()


            if AppConstants.sharedInstance.centralManager == nil{
                AppConstants.sharedInstance.centralManager = CBCentralManager(delegate: self, queue: nil)
            }
            else
            {
                centralManagerDidUpdateState(AppConstants.sharedInstance.centralManager!)
            } 
}

这符合我的目的,我可以检查蓝牙状态并相应地扫描(每次推送到扫描 VC)

雅皮士... :)