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

时间:2018-12-31 09:57:04

标签: ios swift core-bluetooth cbcentralmanager

我有3个ViewController。 1)家用VC 2)扫描VC 3)连接VC

步骤: 我从Home VC推送到Scan 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),我正在检查BLUETOOTH的所有状态。如果,

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

            startScan()
        }

然后我扫描设备。

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

然后我成功连接到该设备,它进入 Connect 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.
    }

我不知道这是什么问题。我没有任何错误。 请帮助...

2 个答案:

答案 0 :(得分:1)

我认为,由于您将CBCentralManager中的AppConstants.sharedInstance.centralManager重新分配给viewDidLoad,因此CBCentralManager遭到破坏和断开连接。

也被销毁了,它没有返回任何委托回调。

那么您能否像下面这样尝试仅初始化CBCentralManager一次并在需要时断开连接?

示例:

override func viewDidLoad() {
        super.viewDidLoad()


        if AppConstants.sharedInstance.centralManager == nil{

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

        AppConstants.sharedInstance.centralManager.delegate = self
    }

答案 1 :(得分:0)

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

pip install pandas

这可以达到我的目的,我可以检查蓝牙状态并进行相应的扫描(每次按下Scan VC)

Yuppieee ... :)