Как обмениваться данными между приложениями в фоновом режиме?

Боюсь, я уже знаю ответ на свой вопрос, но все же решил спросить, прежде чем терять надежду.

У меня есть следующий вариант использования: приложение записывает несколько байтов в «общий» ресурс (скажем, в файл), а другое приложение считывает данные и отправляет их на внешнее устройство через BLE в фоновом режиме. К сожалению, я знаю, что такие понятия, как общий ресурс и фон, ограничены в iOS. Что я пробовал до сих пор:

Использование группы приложений для обмена данными между двумя приложениями

Это нормально работает даже в фоновом режиме, но оба приложения должны быть созданы одной и той же командой разработчиков (т. е. идентификатор команды должен быть одинаковым). Это проблема, потому что одно приложение не создано моей командой разработчиков.

Копирование данных в монтажный стол

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

...и конечно есть...

Фоновые ограничения

Несмотря на то, что я выбираю решение группы приложений, единственный способ, которым я могу читать данные и отправлять их на устройство BLE в фоновом режиме, — это запускать фоновую задачу. Это, очевидно, предостережение: у задачи есть время истечения срока действия (из выполненных мной тестов она продолжается около 3 минут, прежде чем ОС приостанавливает ее). Мне не нужно запускать длительную задачу, но я не могу гарантировать, что ее можно полностью выполнить за 3 минуты или около того.

Вот вопрос: Есть ли какое-то другое решение для этого варианта использования или мне следует, наконец, сдаться?


person Dree    schedule 12.07.2017    source источник
comment
Одной из идей может быть диплайкинг. Ознакомьтесь с этим документом Apple: разработчику .apple.com/library/content/documentation/iPhone/, раздел Использование схем URL для связи с приложениями   -  person mag_zbc    schedule 12.07.2017
comment
@mag_zbc Использование схем URL-адресов не вариант, потому что таким образом приложения будут постоянно переключаться с одного на другое, а это неудобно для пользователя.   -  person Dree    schedule 12.07.2017


Ответы (1)


Если вы используете CoreBluetooth для отправки файлов на устройство Bluetooth, попробуйте добавить bluetooth-central в качестве ключа UIBackgroundMode в Info.plist вашего приложения.

Apple упомянула об этом в своем руководство по программированию:

Связь с аксессуаром Bluetooth Приложения, работающие с периферийными устройствами Bluetooth, могут запрашивать активацию, если периферийное устройство доставляет обновление, когда приложение приостановлено. Эта поддержка важна для аксессуаров Bluetooth-LE, которые передают данные через регулярные промежутки времени, таких как пульсометр Bluetooth. Вы включаете поддержку использования аксессуаров Bluetooth в разделе «Фоновые режимы» на вкладке «Возможности» в вашем проекте Xcode. (Вы также можете включить эту поддержку, включив ключ UIBackgroundModes со значением bluetooth-central в файле Info.plist вашего приложения.) Когда вы включаете этот режим, платформа Core Bluetooth сохраняет открытыми все активные сеансы для соответствующего периферийного устройства. Кроме того, новые данные, поступающие с периферийного устройства, заставляют систему активировать приложение, чтобы оно могло обработать данные. Система также активирует приложение для обработки уведомлений о подключении и отключении аксессуара.

В iOS 6 приложение также может работать в периферийном режиме с аксессуарами Bluetooth. Чтобы действовать как аксессуар Bluetooth, вы должны включить поддержку этого режима в разделе «Фоновые режимы» на вкладке «Возможности» в вашем проекте Xcode. (Вы также можете включить эту поддержку, включив ключ UIBackgroundModes со значением bluetooth-peripheral в файле Info.plist вашего приложения.) Включение этого режима позволяет платформе Core Bluetooth ненадолго разбудить приложение в фоновом режиме, чтобы оно могло обрабатывать вспомогательные устройства. сопутствующие запросы. Приложения, разбуженные для этих событий, должны обрабатывать их и возвращаться как можно быстрее, чтобы приложение можно было снова приостановить.

person Puneet Sharma    schedule 12.07.2017
comment
Конечно, я использую CoreBluetooth, но это не меняет того факта, что задача все равно будет приостановлена ​​на неопределенное время. Допустим, мне нужно около 5 минут, чтобы выполнить мою задачу: как я могу быть уверен, что моя задача будет выполнена? - person Dree; 12.07.2017
comment
@Dree: приложение получает время в три минуты, если вы использовали beginBackgroundTaskWithName:, но если ваше приложение относится к категории долго работающих приложений, таких как использование Bluetooth LE Accessory, тогда ему разрешено работать в фоновом режиме в течение более длительного времени. - person Puneet Sharma; 12.07.2017
comment
Я знаю. Здесь проблема в том, что мне нужно прочитать данные, когда приложение работает в фоновом режиме. Эта операция не является частью обмена сообщениями через CoreBluetooth и рано или поздно будет остановлена. - person Dree; 12.07.2017
comment
@Dree: Допустим, вы начинаете читать данные только тогда, когда ваш аксессуар Bluetooth запрашивает данные. Я предполагаю, что чтение данных должно быть разрешено в этом случае. - person Puneet Sharma; 12.07.2017
comment
Откуда приложению знать, что оно должно считывать данные, если оно работает в фоновом режиме? - person Dree; 12.07.2017
comment
Я мало работал с CoreBluetooth и не знаю тонкостей, но похоже, что здесь есть учебник по тому же самому: community.estimote.com/hc/en-us/articles/ - person Puneet Sharma; 12.07.2017