BLE Восстановление / Сохранение неожиданного эффекта
Я реализовал функцию восстановления для CoreBluetooth
и работает нормально, за исключением одного - после недели (+/- - не уверен на 100%) в фоновом режиме, без открытия приложение закрывается и больше не восстанавливается ни при каких событиях на основе BLE (тестировалось несколько раз).
Я также добавляю логирование ко всем задачам, связанным с BLE, добавляю аналитику для захвата сбоев, отслеживаю восстановление процесса / событий в дополнительном - и после проверки этих журналов / информации / отчетов - не найдено никаких исключений или чего-то, что может завершить работу моего приложения.
Вопрос в том, может ли кто-нибудь объяснить мне причину такого поведения?
2 ответа
Проблемы, связанные с Bluetooth, очень сложно определить. Мы сталкивались с несколькими необъяснимыми ошибками в прошлом. Единственный способ определить, почему BLE больше не работает или плохо себя ведет, - это посмотреть журналы CoreBluetooth на устройстве.
Если вы еще не попробовали это, вы можете включить эти журналы через профиль конфигурации, который вы можете загрузить со страниц разработчика Apple (найдите Bluetooth и следуйте инструкциям).
Как только вы включите ведение журнала, вы можете загрузить полный журнал из базового стека BLE, который сообщит вам, что пошло не так. Они даже скажут вам, если вы каким-то образом неправильно использовали API. Надеюсь, это поможет.
Из моего опыта с CoreBluetooth Сохранение и восстановление состояния я пришел к выводу, что он не работает надежно. Вы можете заставить его работать вроде "хорошо", но вы никогда не получите надежного переподключения при использовании длительных ожидающих соединений в фоновом режиме.
Я сообщил о нескольких ошибках, связанных с этим, но наиболее серьезная, на мой взгляд, заключается в том, что если менеджер bluetooth переключает состояние во время завершения приложения, то все ожидающие соединения будут потеряны (так как они не запоминаются модулем или стеком iOS), Поскольку переключатели состояния Bluetooth не будут вызывать перезапуск приложения, это просто означает, что в любой момент времени ожидающее соединение может быть потеряно, и вы об этом не узнаете. Это само по себе означает, что государственное восстановление довольно бесполезно. Можно сказать, что это не ошибка, а скорее неудачный выбор дизайна…
Другая причина заключается в том, что иногда фреймворк "застревает" в плохом состоянии (возможно, из-за внутреннего состояния гонки или тому подобного). Это может происходить случайным образом, но вы можете довольно легко воспроизвести это, вызвав connectPeripheral немедленно в обратном вызове didFailToConnect или didDisconnect. Когда это произойдет, для connectionState будет установлено соединение, хотя на самом деле это не так.
И так далее…
/ Антон