Периферийная служба CoreBluetooth становится пустой при повторном подключении / восстановлении

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

Но проблема возникает, когда происходит восстановление состояния. В методе centralManager:willRestoreState: я могу получить ранее подключенные периферийные устройства, используя метод retrieveConnectedPeripheralsWithServices:. Но ничего не происходит, когда я вызываю метод discoverServices: на извлеченном периферийном устройстве. peripheral:didDiscoverServices: метод никогда не вызывается. Значение свойства извлеченных периферийных служб также равно нулю. IOS не кеширует сервисы и характеристики?

Примечание. Наше периферийное устройство BLE изначально рекламирует услуги. Когда приложение запускается в первый раз, оно считывает значение с периферийного устройства и записывает пользовательские данные в характеристику. Написание сообщений, периферийные устройства останавливают рекламу услуг. Но инженер по микропрограммному обеспечению утверждает, что даже если служба остановлена ​​периферийным устройством, периферийное устройство, извлеченное из восстановления состояния, должно иметь кэшированную службу. Это правда ?


person saikamesh    schedule 08.12.2017    source источник


Ответы (1)


Вы проверили состояние подключения периферийных устройств, полученных через retrieveConnectedPeripheralsWithServices:? У платформы CoreBluetooth есть некоторые особенности, о которых вам нужно знать, одна из которых - это поведение метода retrieveConnectedPeripheralsWithServices::

Когда вы получаете периферийные устройства с помощью вышеупомянутого метода, они могут быть подключены только на системном уровне (iOS), но не внутри вашего приложения (см. Раздел «Обсуждение» в документации по API). Следовательно, вам все равно придется вызывать соединение на периферийных устройствах, прежде чем вы сможете их правильно использовать. Вот соответствующая часть из документации API:

Список подключенных периферийных устройств может включать те, которые подключены другими приложениями и которые необходимо будет подключить локально с помощью метода connectPeripheral: options:, прежде чем их можно будет использовать.

Что касается кеширования сервисов: iOS кэширует любую обнаруженную услугу и соответствующую характеристику. Есть только способы заставить iOS обновлять кеш:

  • цикл питания BLE, например, выключение и включение BLE в приложении "Настройки" или перезагрузка устройства iOS.
  • отправить уведомление Services Changed через службу GAP с периферийной стороны (требуется активное соединение)

Примечание. Вы также можете активировать сообщения журнала из стека Bluetooth с помощью Профиль конфигурации Bluetooth. Они могут быть весьма полезны при отладке проблем, связанных с BLE, особенно с задействованным нестандартным оборудованием (даже несмотря на то, что журналы немного громоздки в использовании).

person Jens Meder    schedule 11.12.2017