Как BLE устройство будет вызывать приложение, когда приложение будет закрыто - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть одно устройство BLE (периферийное) и приложение для iOS, которые взаимодействуют друг с другом с помощью CoreBluetooth.framework (подключайтесь, отключайтесь, подписывайтесь, уведомляйте службы).Вот несколько сценариев:

  1. Приложение на переднем плане -> Я очень легко подключен к устройству BLE.
  2. Приложение находится вbackground -> Я получаю обратный вызов и подключаюсь к устройству BLE
  3. Приложение удалено из фона (Убить приложение) -> Я не получаю никакого обратного вызова, даже если яподключите устройство через iPhone Device-> Settings-> Bluetooth on -> Select Ble Device -> Connect.

Я гуглю и получаю Сохранение состояния и восстановление будет вызвано приложение,После глубокой езды: enter image description here enter image description here enter image description here

Это также показывает принудительное завершение приложения пользователем, приложение не будетвозобновить или активировать, используя сохранение состояния и восстановление.

Я прочитал из это , это и это , есть некоторые пункты:

"Если вам нужно выполнить код, когда ваше приложение не запущено, вам будет предложено несколько вариантов в зависимости от того, что вы пытаетесь сделать. - Фоновая выборка позволит вашему приложению работать вфон в течение примерно 30 секунд с запланированным интервалом.Целью этого является получение данных и подготовка вашего пользовательского интерфейса к следующему запуску приложения. - Push-уведомления позволяют вашему приложению получать свежие данные с вашего сервера.если хотите, на устройстве появляется сообщение, но оно не требуется - тихие push-уведомления позволяют пропустить эту часть. - Локальные уведомления позволяют отображать предупреждениепользователю, а также любые медиа-вложения, которые выхочу и некоторые опции для пользователя на выбор.Если они выберут эти параметры, то ваше приложение может быть запущено на переднем плане или в фоновом режиме для их обработки. "

Я пробовал с Background Fetch, но он также не проснулся, когда приложение было прекращено.

Моя единственная цель - "Когда приложение завершается или уничтожается пользователем, при подключении устройства BLE приложение должно вызываться на переднем плане / фоне, чтобы я выполнял некоторые операции, такие как получение данных.из устройства BLE и сохраните его "

Использование фоновых режимов в проекте: enter image description here

Другие фоновые режимы также не дают никакой подсказки: enter image description here

Как этого добиться без использования push-уведомлений или тихих уведомлений? Если что-то в CoreBluetooth Framework, где приложение просыпается после завершения, дайте мне знать?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Это абстрактный код для выделения решения.Возможно, вам придется настроить несколько вещей.

1> Создать CLBeaconRegion с контролем запуска UUID для этого маяка

locationManager.requestAlwaysAuthorization()
    locationManager.delegate = self
    locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
    locationManager.allowsBackgroundLocationUpdates = true
    locationManager.startUpdatingLocation()
    locationManager.startMonitoringSignificantLocationChanges()
    if let uuid = UUID(uuidString: "B9407F30-F5F8-466E-AFF9-25556B57FE6D") {
           let beaconRegion = CLBeaconRegion(proximityUUID: uuid,identifier:"iBeacon")
           beaconRegion.notifyOnExit = true
           beaconRegion.notifyOnEntry = true
           locationManager.startMonitoring(for: beaconRegion)                       
    }

2> Согласно документу

ЕслиВы начинаете мониторинг региона, и ваше приложение впоследствии закрывается, система автоматически перезапускает его в фоновом режиме, если граница региона пересекается

Ссылка

3>Ваше периферийное устройство должно передавать как ibeacon, который передает тот же UUID (тот же UUID, для которого вы создали CLBeaconRegion)

Возможно, вам придется поиграть с несколькими параметрами CLLocationManager и CLBeaconRegion, но это должно работать в моеммнение, потому что в прошлом мои приложения были успешно выведены из завершенного состояния при обнаружении iBeacon ....

0 голосов
/ 08 января 2019

Короткий ответ: Вы не можете .
В документации четко указано, что ваше приложение не будет перезапущено, если оно явно убито пользователем.
Это верно для тихогоуведомления также - они не разбудят ваше приложение, если пользователь принудительно прервал ваше приложение (или состояние батареи устройства ниже 20%, кстати).
Ваши возможности для этого ограничены и могут включать в себя уведомление пользователя непринудительно убить ваше приложение или использовать обнаружение региона на основе местоположения для повторного запуска приложения.
В одном из учебных пособий, которые вы связали , показан пример iBeacon для обнаружения входа и выхода из диапазона iBeacons.и в сочетании с фоновым разрешением может перезапустить ваше приложение, но, опять же, это не совсем то, о чем вы просили, и не является реальным решением описываемой проблемы.
Логика Apple проста - если пользователь убиваетваше приложение, пользователь не хочет, чтобы оно запускалось снова, что имеет смысл.
Дело в том, что многие пользователи считают, что приложение убиваетs это стандартный способ сделать их устройство более отзывчивым, по этому поводу идут большие споры (что хуже?имея приложения холодного запуска ОС или позволяя приложениям делать смешные вещи в фоновом режиме с тихими уведомлениями и т. д.) Я не буду вдаваться в эти дебаты, это просто так.

...