2015-01-06 4 views
6

надеюсь получить здесь несколько входных данных.iOS CoreBluetooth: сохранение и восстановление состояния

В моем текущем проекте iOS я использую CoreBluetooth с быстрым. Приложение имеет возможность общаться с использованием CoreBluetooth в фоновом режиме, который в основном работает, вроде. Для работы периферийного устройства требуется активное подключение к устройству iOS для работы, как ожидалось. Всякий раз, когда соединение ломается, периферийное устройство останавливает его текущее действие. Это также происходит, когда приложение закрывается из-за давления памяти. В этом случае периферийное устройство не должно перестать работать, поэтому возникает проблема. Для того, чтобы решить эту проблему, я последовал apples core bluetooth programming guide реализовать фоновый режим состояния сохранения и восстановления, которое в основном говорит:

  1. Инициализировать CentralManager с идентификатором восстановления. Делегат = сам.
  2. Внедрите метод делегата willRestoreState. NSLog something
  3. Проверьте запускОпции для специального ключа. NSLog что-то.

Я заставляю iOS закрывать приложение, когда он находится в фоновом режиме, используя этот общий проект: BackgroundKill. Конечно, приложение больше не работает в режиме отладки, поэтому я добавил некоторые инструкции NSLog в важные моменты, которые нужно искать в консоли устройства. Хорошая новость: соединение больше не отменяется, когда приложение прекращается, iOS теперь действует, как ожидается, поддерживать соединение, поэтому периферийное устройство не перестанет работать. Удар! В течение этого времени нет связи между центральным и периферийным оборудованием, за исключением службы батареи, на которую подписано приложение. Единственная причина для активного подключения - предотвратить работу периферийного устройства.

При перезагрузке приложения вручную, ни один из указанных NSLogs не появляется. Делегатор willRestoreState никогда не вызывается, а startOptions равны нулю. Я пытался использовать очередь «DISPATCH_QUEUE_CONCURRENT» вместо nil при создании экземпляра CentralManager. Без эффекта.

Как я могу использовать сохраненное соединение при повторном запуске приложения? Почему делегат willRestoreState никогда не звонил? Я что-то упустил? Обязательно ли получать данные во время фонового/принудительного закрытия системы, чтобы использовать сохранение и восстановление состояния?

Спасибо за помощь. :)

+0

willRestoreState следует вызывать сразу после восстановления вашего приложения в фоновом режиме. Запуск приложения после, из значка, может ничего особенного не делать, поскольку он уже запущен.Также в соответствии с документами, если ничего не восстановить - методы didUpdateState будут вызываться первым, а не willRestoreState – KoCMoHaBTa

ответ

8

Наконец-то сделали некоторые тесты и получили результаты. Оказывается, приложение запускается в фоновом режиме, когда необходимо, что означает всякий раз, когда периферийное устройство отправляет данные на сохраненное соединение. iOS запускает приложение через didFinishLaunchingWithOptions в этом случае, поэтому у вас есть ~ 10 секунд, чтобы проверить параметры запуска и сделать что-то. Таким образом, моя проблема была связана с тем фактом, что не было данных, отправленных по соединению, кажется, теперь нам нужно изменить прошивку нашего периферийного устройства, чтобы разобраться в этом.

Делегат willRestoreState вызывается при перезагрузке приложения вручную. На данный момент iOS предоставляет не только недавно используемый центральный, но и список подключенных периферийных устройств и даже недавно подписанных сервисов. Поэтому мне просто нужно было восстановить мои объекты и снова получить полностью признанный признак от правильной службы подключенного периферийного устройства.

+3

Привет, STEX. Не могли бы вы помочь мне узнать: «Мне просто нужно было восстановить мои объекты и получить подписанную характеристику из правильной службы подключенное периферийное устройство будет полностью функционировать снова ». Я сталкиваюсь с аналогичной проблемой и не могу сделать свое приложение работоспособным снова, поскольку я получаю свой объект периферийных устройств, но мне нужно снова отправить команду соединения, чтобы установить соединение, или мне просто нужно установить метод делегирования. Спасибо заранее. – Nik

Смежные вопросы