Базовая Bluetooth: CBPeripheral отключается по незнанию и не получает никакого звонка на didDisconnectPeripheral - PullRequest
0 голосов
/ 31 декабря 2018

У меня есть 3 ViewControllers.1) Домашний VC 2) Scan VC 3) Подключение VC

Шаги: Из Home VC я нажимаю на Scan VC для сканирования доступных устройств BLE.

Scan 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()
        }

, то я сканирую устройства.

Как только я получаю свое устройство, я подключаюсь к нему из списка отсканированных устройств,

Затем я успешноПодключитесь к этому устройству: Подключите VC.

Пока все отлично.

Но настоящая проблема начинается, когда

1) Я выскакиваю из Подключите VC к сканированию VC и затем снова зайдите на HOMEVC И

2) Затем я снова перехожу из Home VC к СканированиюVC

Scan VC: Это вызовет и назначит делегата моему глобальному CentralManager, и как только он снова назначит делегата, он отключит предыдущее соединение.(Даже я не получаю didDisconnectPeripheral Call)

override func viewDidLoad() {
        super.viewDidLoad()

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

Я не знаю, в чем проблема.Я не получаю никаких ошибок.Пожалуйста, помогите ...

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Нет проблем.Я нашел свой способ обойти.Спасибо @Natrajan за то, что он дал мне некоторое представление об этом.

override func viewDidLoad() {
            super.viewDidLoad()


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

Это служит моей цели, и я могу проверить состояние Bluetooth и соответственно сканировать (каждый раз нажимая на Scan VC)

Yuppieee...:)

0 голосов
/ 31 декабря 2018

Я думаю, так как вы переназначаете 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
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...