Загрузка видеофайлов, когда приложение iOS находится в фоновом режиме?

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

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

В настоящее время вы записываете видео, оно хранится как MP4 в файловой системе, а фоновый поток загружает файл на сервер. Все это происходит, когда приложение открыто, что приводит к появлению экрана, который, по сути, говорит вам подождать, пока процесс не завершится.

Если вы нажмете кнопку "Домой", чтобы "свернуть" приложение (я не владею терминологией iOS, простите меня), в настоящее время все процессы загрузки приостановлены. Клиент хочет иметь его, чтобы вы могли свести к минимуму и сделать что-то совершенно другое, поскольку этот процесс продолжается, при этом уведомление отображается после завершения загрузки.

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

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

Я могу думать о хакерских способах злоупотребления вышеуказанными функциями, но я не уверен, что Apple может обнаружить это во время процесса подачи iTunes. Действительно, я ищу более чистый метод - как я могу продолжать загружать видео, пока приложение сведено к минимуму?

Я предполагаю, что есть решение - Dropbox может справиться с этой ситуацией?

Ответ 1

Удивительно, но я кое-что с этим поделал, несмотря на то, что несколько гидов предложили, что это было практически невозможно, и даже Dropbox признает, что он должен делать хакерскую вещь на основе местоположения.

В коде использовался класс NSURLSession, а для загрузки вы использовали метод uploadTaskWithStreamedRequest(), передавая HTTP-запрос и возвращая экземпляр NSURLSessionUploadTask.

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

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

Трюк заключается в следующих двух методах:

uploadTaskID = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({})

и

UIApplication().sharedApplication().endBackgroundTask(uploadTaskID)

с их помощью любой код после функции "начать" будет выполняться независимо от того, будет ли приложение сведено к минимуму и будет делать это до тех пор, пока не будет вызвана функция "end". С небольшим количеством настроек я смог получать файлы для загрузки последовательно и отправлять уведомления, когда процесс завершен.

Я не видел, чтобы это решение было намечено, так что это может быть плохая идея, но, похоже, это работает.