Как запустить сохранение и восстановление состояния Core Bluetooth

Сохранение и восстановление состояния Поскольку сохранение и восстановление состояния встроено в Core Bluetooth, ваше приложение может выбрать эту функцию, чтобы попросить систему сохранить состояние центральных и периферийных диспетчеров вашего приложения и продолжить выполнение определенных задач, связанных с Bluetooth, на их от имени, даже если ваше приложение больше не работает. Когда одна из этих задач завершается, система повторно запускает ваше приложение в фоновом режиме и дает вашему приложению возможность восстановить свое состояние и соответствующим образом обработать событие. В случае описанного выше приложения домашней безопасности: система будет отслеживать запрос на подключение и перезапускать приложение для обработки обратного вызова centralManager: didConnectPeripheral: delegate, когда пользователь возвращается домой и запрос на подключение завершается.

Как я могу вызвать это и проверить код?

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

A - kill the app from Xcode

B - kill the app manually

C - power off the phone

D - something else

Во всех этих вариантах я попытался перейти в Xcode -> устройство и посмотреть журналы, но не увидел журналов восстановления состояния.

Спасибо


person mm24    schedule 14.10.2015    source источник


Ответы (2)


NB Спасибо user1785784 за то, что поделился QA1962 - Условия, при которых восстановление состояния Bluetooth приведет к перезапуску приложения, в котором описывается новое поведение Bluetooth в iOS 11. Этот документ должен быть рассмотрел ответ на этот вопрос, хотя я думаю, что он неверно утверждает, что iOS 10 будет перезапустить приложение, которое было принудительно завершено. (Я не тестировал это на устройстве iOS 10, но это было бы отклонением от iOS 9. Кто-нибудь может подтвердить?).

Удаление приложения вручную (B) из переключателя задач гарантирует, что ваше приложение не будет запускаться автоматически, пока пользователь явно не откроет его снова.

C тоже не работает, думаю, только приложения VOIP запускаются автоматически после перезагрузки, а то только после разблокировки устройства.

Я не знаю ни одного Д.

Я использую A.

Во-первых, чтобы реализовать восстановление состояния Bluetooth, убедитесь, что вы

  1. Кофейник, который одновременно является клеткой Фарадея

    person Rhythmic Fistman    schedule 15.10.2015
    comment
    @RhytmicFistman Большое спасибо за ответ .. Я использую ваш подход. Однако я не уверен, правильно ли я реализовал код восстановления состояния. Нужно ли мне создавать экземпляр нового объекта CBCentralManager в AppDelegate didFinishLaunchingWithOptions? Не могли бы вы поделиться простым примером кода? - person mm24; 15.10.2015
    comment
    PS: Также всякий раз, когда я использую NSLog, я не вижу зарегистрированных сообщений в журналах устройства (когда приложение убито). Я могу видеть только такие вещи, как включенный сканер BTLE и т. Д. - person mm24; 15.10.2015
    comment
    извините, я забыл упомянуть, что вам нужно добавить фоновый режим в ваш Info.plist. ответ обновлен. - person Rhythmic Fistman; 16.10.2015
    comment
    Обратите внимание, что по ссылке , предоставленной ниже, @ user1785784 переключение < b> Bluetooth Power не запускает перезапуск приложения, в отличие от переключения режима полета. - person bcattle; 08.11.2017
    comment
    Что вы имеете в виду под этим моментом? взаимодействие с устройством, например нажатием кнопки / имея пульс - person yusufonderd; 19.12.2017
    comment
    Если на устройстве есть кнопка, нажмите ее - если это носимое устройство, которое отслеживает вашу частоту сердечных сокращений / пульс и обновляет характеристическое значение каждый раз, когда ваше сердце бьется, наденьте его. Другими словами, использовать устройство по прямому назначению и заставлять его что-то делать. - person Rhythmic Fistman; 19.12.2017
    comment
    @RhythmicFistman У меня подключено периферийное устройство, я отключаю блютуз. Через некоторое время, когда приложение приостановлено, я включаю его, в идеале оно должно вызывать мой метод восстановления. Это не так, когда я запускаю приложение вручную, вызывается метод восстановления и периферийное устройство находится в состоянии подключения. Однако, если я не выключу Bluetooth и не вернусь в зону действия даже через 8–9 часов, мое приложение запускается в фоновом режиме и подключается. Нужно ли мне делать что-то другое при включении и выключении Bluetooth? - person Saleh; 04.01.2018
    comment
    Это должно сработать. Работает ли с режимом авиалинии? Какую версию iOS вы используете? - person Rhythmic Fistman; 04.01.2018
    comment
    Я как бы опаздываю на вечеринку. Однако вы также можете убить приложение программно, выполнив следующую команду: exit (0). Это должно имитировать, как ОС убивает приложение. Если после этого ваше устройство обнаруживает периспергал, который он сканировал до того, как был уничтожен, его следует перезапустить. Для просмотра журналов я использую os.log (Unified Logging). Это позволяет мне просматривать журналы в приложении Mac Console. Вы можете присвоить журналам тег, который можно будет фильтровать в консоли. - person cbbcloud; 10.05.2019
    comment
    Чтобы войти в журнал с использованием журнала ОС, сначала необходимо импортировать os.log, а затем вызвать следующее: let log = OSLog (subsystem: Bundle.main.bundleIdentifier !, category: background-scan) os_log (Ваше сообщение, журнал: журнал) категория - это то, по чему вы фильтруете в Консольном приложении - person cbbcloud; 10.05.2019
    comment
    centralManager (_ central: CBCentralManager, willRestoreState dict: [String: Any]) Я получил массив CBPeripheral. как сканировать новые устройства в заднем режиме - person sarit bahuguna; 09.06.2020

Только недавно выяснил это с помощью Apple Tech. Также дан / есть хорошая ссылка, которая показывает различные способы вызвать приложение для перезапуска без вмешательства пользователя.

Я сделал это, вызвав внезапный сбой приложения с помощью следующего фрагмента быстрого кода. Это приводит к перезапуску приложения и вызову обратного вызова willRestoreState.

DispatchQueue.main.asyncAfter(deadline: .now() + 5)
        {
            print("Killing app")
            // CRASH
            if ([0][1] == 1){
                exit(0)
            }
            exit(1)
        }
person user1785784    schedule 15.10.2017
comment
Спасибо за эту очень важную ссылку! - person Rhythmic Fistman; 08.11.2017
comment
Это действительно безумно важное звено. Спасибо вам. - person Ben; 19.11.2018