2016-04-20 2 views
10

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

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

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

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

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

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

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

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

+0

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

ответ

12

Удивительно, но я получил что-то с этим, несмотря на то, что было несколько руководств, предполагающих, что это было практически невозможно и даже Dropbox admitting it has to do a hacky location-based thing.

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

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

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

Хитрость эти два метода:

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

и

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

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

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

+0

Это деньги. Работает лучше, чем другие «решения», которые я нашел. – brycejl

+0

Этот ответ чистый жемчуг, шляпы выключены: D –

+0

Использование задач загрузки URLSession с настройкой фона похоже на то, что это будет путь. Но это действительно не сработало для вас, верно? И наоборот, документация (https://developer.apple.com/documentation/uikit/uiapplication/1623031-beginbackgroundtaskwithexpiratio) указывает, что использование вашего метода предоставляет ограниченное время для вашей задачи и «Если вы не вызываете endBackgroundTask: для каждая задача до истечения времени истекает, система убивает приложение ». Вам просто повезло? Или это «настройка», которую вы упомянули, чтобы обойти это ограничение? Можете ли вы уточнить? – biomiker

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