Невозможно вызвать код восстановления состояния для BLE на iOS
Я пытаюсь заставить мое приложение реагировать на повторный запуск в фоновом режиме - это отклик на обнаружение рекламного периферийного устройства.
Следующий код в настоящее время работает в моем приложении (на переднем плане + фон, даже после многих часов работы в фоновом режиме):
[self.centralManager scanForPeripheralsWithServices:self.services options:nil];
Обычно мое приложение не имеет ожидающих запросов на подключение, так как я хочу сканировать новые рекламные объявления в фоновом режиме. Следующая документация заставляет меня полагать, что это все еще возможно:
важно иметь в виду, что приложение будет перезапущено и восстановлено тогда и только тогда, когда оно ожидает определенного события или действия Bluetooth (например, сканирования, подключения или подписки на уведомление), и это событие произошло. (из https://developer.apple.com/library/content/qa/qa1962/_index.html)
а также
Система отслеживает... Службы, которые центральный менеджер сканировал (и любые параметры сканирования, указанные при запуске сканирования) (с https://developer.apple.com/library/content/documentation/NetworkingInternetWeb/Conceptual/CoreBluetooth_concepts/CoreBluetoothBackgroundProcessingForIOSApps/PerformingTasksWhileYourAppIsInTheBackground.html)
Реализация
Я следую инструкциям, указанным в этой последней ссылке ^ в разделе "Добавление поддержки сохранения и восстановления состояния", выполняя следующие действия:
Создание центрального менеджера в соответствии с указаниями:
self.centralManager = [[CBCentralManager alloc] initWithDelegate: собственная очередь:nil options:@{ CBCentralManagerOptionRestoreIdentifierKey:@"myCentralManagerIdentifier" }];
Восстановите ваши центральные и периферийные менеджеры
Здесь я на самом деле ничего не сделал, так как didFinishLaunchingWithOptions
вызывается, и центральный будет повторно инициализирован с тем же идентификатором. (Есть ли что-то еще, что я должен здесь сделать?)
Реализация функции восстановления:
(void) centralManager: (CBCentralManager *) central willRestoreState: (NSDictionary *) состояние { // Точка останова установлена здесь, но никогда не достигается... NSLog(@"..."); }
Как я проверяю состояние сохранения / восстановления
Я установил точку останова в функции восстановления (из шага 3), а также вставил NSLog
,
Нажав кнопку "Стоп", как было предложено в разделе " Как запустить сохранение и восстановление состояния ядра Bluetooth", я надеялся, что смогу запустить код, размещая рекламу на моем периферийном устройстве, как обычно, (этот процесс обнаружения / подключения работает отлично, когда приложение работает в фоновом режиме). Но на самом деле ничего не происходит, что я могу сказать.
Мой общий вопрос: почему не срабатывает точка останова / NSLogs не печатается? Есть ли предпочтительный способ отладки функции восстановления?
Наконец, в качестве проверки работоспособности, правильно ли я читаю документы, что обнаружение рекламного периферийного устройства должно инициировать повторный запуск приложения в фоновом режиме для обработки приложением?