CoreBluetooth и сохранение состояния и восстановление, когда периферийное устройство нуждается в специальном ACK - PullRequest
0 голосов
/ 07 мая 2019

Я работаю с периферийным устройством Bluetooth, которое после подключения к нему выполняет ACK туда-сюда, прежде чем он действительно сможет отправить мне нужные мне данные.

Поток выглядит так:

  1. Обнаружение периферийных устройств
  2. Подключение к периферийным устройствам
  3. Обнаружение услуг и характеристик
  4. Прослушивание обновлений по определенной характеристике
  5. Периферийные отправкиспециальное сообщение с этой характеристикой
  6. Затем приложение отправляет ACK на периферийное устройство
  7. Периферийное устройство отправляет мне данные, необходимые для приложения

Я реализовалнеобходимая логика в методе протокола для сохранения и восстановления состояния centralManager(_ central: CBCentralManager, willRestoreState dict: [String : Any])

Вопрос 1:

Когда приложение находится в фоновом режиме, а iOS решает захватить Bluetoothобщение (по соображениям ресурсов), как iOS сможет выполнить шаги 5, 6 и 7?

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

Вопрос 2:

В документации я читал, что iOS может запустить ваше приложение на несколько секунд.Будет ли в этом случае выполняться метод viewDidLoad моего корневого ViewController?Вот где я создаю экземпляр CBCentralManager


Некоторые из многих онлайн-ресурсов, которые я нашел:

Базовая обработка фона Bluetooth для приложений iOS

от нуля до BLE на iOS - часть третья

1 Ответ

0 голосов
/ 07 мая 2019

Эти два комментария от Paulw11 помогли мне понять, что происходит:

Нет, этого не происходит.Если у вас есть ожидающее обнаружение, ожидающее «соединение» или у вас есть активное уведомление о характеристике, то iOS перезапустит ваше приложение, чтобы оно могло обработать обнаружение, соединение или уведомление.iOS не может сделать это от вашего имени;он не знает, что вы хотите сделать.- Paulw11


Присоединение объекта Bluetooth к контроллеру представления - плохая идея, если вы хотите выполнять операции в фоновом режиме.Я предлагаю одноэлементный объект или объект, принадлежащий делегату вашего приложения - Paulw11


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

Наконец, неверная логика в viewDidLoad моего ViewController.Я создал класс BluetoothManager и создал его в методе application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool моего AppDelegate

...