centralManager (_: didDisconnectPeripheral: error :) не вызывается - PullRequest
0 голосов
/ 04 февраля 2019

В связанном с CoreBluetooth приложении для iOS, написанном в Swift (4.2), у меня возникает следующая проблема:

Приложение обрабатывает определенное количество Peripherals и Centrals.Каждый Peripheral предоставляет услугу и имеет несколько Centrals подключенных к ней;он ведет учет этого и знает, сколько центральных станций подключено.

Таким же образом каждый Central связан с несколькими Peripherals;а также ведет учет этого, чтобы знать, сколько Peripherals подключено.

У меня есть вопрос о ведении бухгалтерского учета для ведения учета, о которой я только что упомянул, до даты.

Со стороны Peripheral это работает, и я вижу, когда Central отключился.Для этого я использую: Периферийный менеджер (_: центральный: didSubscribeTo:) и: Периферийный менеджер (_: центральный: didUnsubscribeFrom:)

Из Central Я хочуиспользовать: centralManager (_: didConnect:) и: centralManager (_: didDisconnectPeripheral: error:)

Но здесь по какой-то причине это не работает,Первая функция ( centralManager (_: didConnect:) ) вызывается, как и ожидалось, но не вторая ( centralManager (_: didDisconnectPeripheral: error:) ).

Я полагаю, что мне нужно решить этот последний вопрос о том, что функция не вызывается.Но я могу ошибаться.

В результате я вижу, когда приходит Peripheral, а не когда он уходит.

Чего мне не хватает?Или я просто делаю это неправильно?

Я тестирую приложение на двух устройствах.

--- Дополнительная информация --- (Обновление после публикации)

Вот некоторые изсоответствующий код:

func centralManager(_ central: CBCentralManager,
                    didDiscover peripheral: CBPeripheral,
                    advertisementData: [String : Any],
                    rssi RSSI: NSNumber) {
    print(#function)

    if cbPerifList  == nil {cbPerifList = [CBPeripheral]()}

    if let perifIndx = cbPerifList!.index(where:{$0.identifier==peripheral.identifier}) {
        central.connect(cbPerifList[perifIndx], options: nil)
    } else {
        peripheral.delegate = self
        cbPerifList.append(peripheral)
        central.connect(peripheral, options: nil)
    }
}

Еще одна, возможно, важная вещь, которую я заметил, заключается в следующем.Вместо того, чтобы переключать периферийное устройство с помощью кнопочного переключателя, как я обычно делаю, я принудительно завершаю приложение на устройстве, которое в данный момент играет роль периферийного устройства, затем вызывается функция centralManager (_: didDisconnectPeripheral: error:) на другом устройстве, как я и ожидал;и учет ведется правильно.

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Я не нашел прямого ответа на этот вопрос.Чтение комментариев, кажется, показывает, что теперь есть ответ.Другими словами, то, что я хотел сделать, звучит невозможно.Если кто-то из экспертов узнает иначе, пожалуйста, сообщите нам.

Тем временем я принял решение для обходного пути:

При отключении одного периферийного устройства я использую одну из его характеристик для настройкикакое-то бессмысленное значение, которое затем используется центральным как подсказка, чтобы знать, что периферийное устройство «попрощалось» ..... И это работает.

0 голосов
/ 05 февраля 2019

В моем CoreBluetooth приложении

func centralManager (_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
}

Вызывается при потере любого периферийного устройства.

Возможно, проверьте ваш синтаксис didDisconnectPeripheral функции.

...