Как запустить сохранение и восстановление состояния ядра Bluetooth
Сохранение и восстановление состояния Поскольку в Core Bluetooth встроено сохранение и восстановление состояния, ваше приложение может включить эту функцию, чтобы попросить систему сохранить состояние центральных и периферийных менеджеров вашего приложения и продолжить выполнение определенных задач, связанных с Bluetooth на их от имени, даже когда ваше приложение больше не работает. Когда одна из этих задач завершается, система перезапускает ваше приложение в фоновом режиме и дает вашему приложению возможность восстановить его состояние и соответствующим образом обработать событие. В случае приложения домашней безопасности, описанного выше, система будет отслеживать запрос на подключение и перезапускать приложение для обработки обратного вызова centralManager: didConnectPeripheral: делегата, когда пользователь вернется домой и запрос на подключение будет завершен.
Как я могу вызвать это и проверить код?
У меня есть аксессуар с услугой. У меня есть приложение, которое сканирует сервис, и я выбрал сохранение состояния. Однако я не уверен, как логически проверить это, поскольку я не знаю, что мне нужно для его запуска. Вот варианты, которые я попытался безуспешно:
A - kill the app from Xcode
B - kill the app manually
C - power off the phone
D - something else
Во всех этих вариантах я пытался перейти на Xcode -> device и посмотреть журналы, но не видел журналов восстановления состояния.
Спасибо
2 ответа
NB. Спасибо пользователю user1785784 за предоставление Apple QA1962 - условий, при которых восстановление состояния Bluetooth перезапустит приложение, описывающее новое поведение Bluetooth в iOS 11. Этот документ следует считать ответом на этот вопрос, хотя я думаю, что он неправильно утверждает, что iOS 10 будет перезапущен приложение, которое было принудительно завершено. (Я не проверял это на устройстве iOS 10, но это было бы отклонением от iOS 9. Кто-нибудь может подтвердить?).
Уничтожение приложения вручную (B) из переключателя задач гарантирует, что ваше приложение не запустится автоматически, пока пользователь не откроет его снова явно.
C тоже не работает, я думаю, что только приложения VOIP запускаются автоматически после перезапуска, а затем только после разблокировки устройства.
Я не знаю ни одного D.
Я использую А.
Во-первых, чтобы реализовать восстановление состояния Bluetooth, убедитесь, что вы
- добавленной
bluetooth-central
какUIBackgroundModes
в ваш Info.plist - установить
CBCentralManagerOptionRestoreIdentifierKey
при инициации вашегоCBCentralManager
- реализовал
-(void)centralManager:willRestoreState:
обратный звонок в вашемCBCentralManager
делегировать.
Тогда вы готовы проверить состояние восстановления:
- переведите приложение в известное состояние (например, Bluetooth включен, подключено / подключено некоторое устройство)
- убить приложение в Xcode
- смотреть логи или установить точку останова при запуске
- внести изменения в состояние Bluetooth, например,
- переключение режима авиакомпании
- вывод устройства Bluetooth из зоны действия (чтобы не ходить, я кладу свое в проводник / клетку Фарадея / кофейник)
- вернуть устройство в зону действия
- взаимодействие с устройством, например, нажатием кнопки / пульса
- смотреть, как вызывается код восстановления вашего состояния
NB: application:didFinishLaunchingWithOptions:
будет вызван первым, и вы должны немедленно CBCentralManager
как описано выше. затем centralManager:willRestoreState:
будет называться.
Только недавно выяснил это с помощью Apple Tech. Также приведена / есть хорошая ссылка, которая показывает различные способы перезапуска приложения без вмешательства пользователя.
Я сделал это, вызвав внезапное падение приложения со следующим фрагментом кода swift. Это приводит к перезапуску приложения и вызову обратного вызова willRestoreState.
DispatchQueue.main.asyncAfter(deadline: .now() + 5)
{
print("Killing app")
// CRASH
if ([0][1] == 1){
exit(0)
}
exit(1)
}