Могу ли я заставить iOS 7 отправлять изображения в фоновом режиме при установленном сетевом соединении?

Я создаю приложение для iOS 7, которое позволяет пользователю выбирать изображения и загружать их на сервер. В идеальном мире пользователь выберет изображения, нажмет «Загрузить» и сможет закрыть приложение. Я заглянул в NSURLSession, чтобы установить это, но, похоже, он берет только файл. Есть ли способ отправить свои NSData, как в NSURLRequest? Кроме того, когда я не подключен к Интернету, могу ли я как-то сделать опрос приложения для подключения к Интернету в фоновом режиме и заставить его отправлять изображения при установлении соединения? Я не думаю, что это было возможно с более ранними версиями iOS, но в iOS 7, похоже, есть несколько новых опций, касающихся фоновых задач. Заранее благодарю за любую помощь!


person FreekHelm    schedule 03.02.2014    source источник


Ответы (2)


Пара мыслей:

  1. Вы правы, что фоновые загрузки должны использовать файл. Поэтому просто сохраните NSData в файл (например, с помощью метода writeToFile), а затем используйте этот путь к файлу.

  2. Что касается проверки подключения к Интернету, фон NSURLSession позаботится об этом за вас, так что нет, вам не нужно этого делать.

  3. Что касается фоновых загрузок в более ранних версиях iOS, вы могли инициировать загрузку, но явно запросить немного больше времени для выполнения этой задачи конечной длины, пока приложение работает в фоновом режиме с UIBackgroundTaskIdentifier. См. Выполнение задачи конечной продолжительности в фоновом режиме обсуждается в разделе Состояния приложения и многозадачность в Руководстве по программированию приложений для iOS.

    Это не так надежно, как новая фоновая функциональность NSURLSession (которая более умна в применении дискреционной логики, чтобы ваше приложение не оказывало существенного неблагоприятного воздействия на приложения переднего плана, контролируя, разрешена ли загрузка через сотовое соединение, позволяя более длинные запросы, работающие, даже если ваше приложение было остановлено (например, из-за нехватки памяти) и т. д.). Но UIBackgroundTaskIdentifier — это возможное решение для версий iOS до 7, где вы хотите дать возможность выполнить запрос на загрузку, даже если пользователь покинул ваше приложение.

person Rob    schedule 03.02.2014
comment
Спасибо за разъяснения! Запись в файл может оказаться сложной, потому что я использую фреймворк, который помещает приложение в безопасный контейнер. Фреймворк, вероятно, не позволяет мне помещать файлы за пределы безопасного контейнера или NSURLSession, чтобы взять файл изнутри. Хорошие новости по второму пункту: если мне удастся создать файл, NSURLSession будет выбран и отложен до тех пор, пока не будет доступно подключение к Интернету. Могу ли я принудительно загружать через мобильное соединение, или iOS решает за меня? - person FreekHelm; 04.02.2014
comment
@FreekHelm Сожалею об ограничениях вашего фреймворка. Если вы действительно правы, возможно, вы не сможете использовать фоновый сеанс. Кроме того, если безопасность так важна, вы можете рассмотреть возможность использования эфемерного NSURLSessionConfiguration вместо стандартного. Что касается второго пункта, то это плохие новости для вас, потому что это относится только к фоновым сеансам (которые, как мы пришли к выводу, вы не можете использовать). Используя стандартные сеансы, вы должны самостоятельно проверять доступность через Доступность. - person Rob; 04.02.2014
comment
Что касается вопроса о подключении к сотовой сети, NSURLSessionConfiguration этого не делает. У него есть возможность подключения через сотовую связь, но это противоположная проблема. Если вам действительно нужно принудительно подключиться к сотовому соединению, используйте Reachability, чтобы определить тип соединения, а затем действуйте соответствующим образом. - person Rob; 04.02.2014
comment
Что означает поместить приложение в безопасный контейнер? Каждый .ipa является безопасным контейнером. А папка с документами и т. д. существуют вне приложения. - person Clay Bridges; 10.02.2014
comment
@ClayBridges Я предположил, что его требования были таковы, что он не мог ничего хранить в постоянном хранилище (например, выполнение бизнес-требований, аналогичных тем, которые были достигнуты ephemeralSessionConfiguration, гарантируя, что, если устройство когда-либо будет скомпрометировано, конфиденциальная информация не останется). Понятно, что если бы он мог сохранить файл в папку «Документы» или куда-то еще, то использование NSURLSessionUploadTask сработало бы нормально. Но вы правы в том, что, возможно, мне не стоило воспринимать комментарий за пределами безопасного контейнера как должное. - person Rob; 10.02.2014
comment
@FreekHelm Можете ли вы уточнить, что это за фреймворк, который якобы не позволяет вам сохранять файлы вне безопасного контейнера? Понятно, что, хотя вы не можете сохранять файлы в набор приложений, вы обычно сохраняете файлы в изолированной программной среде приложения (например, в папке «Документы» приложения) без каких-либо инцидентов. Что это за безопасный фреймворк, на который вы ссылаетесь? - person Rob; 10.02.2014
comment
@Rob: Я так и думал, и вы сделали разумные предположения; Я решил, что все равно спрошу. Отличный ответ, кстати. +1! - person Clay Bridges; 10.02.2014
comment
Роб, ваши предположения верны, вы используете GOOD Dynamics SDK. Это похоже на корпоративный сервер Blackberry. @ClayBridges, вы правы, внешний защищенный контейнер, вероятно, недостаточно конкретен, но это терминология, с которой я столкнулся в сообществе Good. Я не смог провести больше исследований, но я обязательно буду следить за этим. - person FreekHelm; 11.02.2014

Re: Ваш комментарий по поводу "GOOD Dynamics SDK", я его быстро просмотрел. Он позволяет обмениваться документами между приложениями на основе SDK. Я не знаю, означает ли это, что он записывает один зашифрованный файл на диск в процессе или использует зашифрованную папку для хранения всего. Если бы у вас был доступ iOS к этому файлу и способ расшифровать его на сервере, у вас был бы шанс использовать магию фоновой загрузки на основе файлов.

person Clay Bridges    schedule 11.02.2014