2013-10-13 1 views
6

Мое приложение требует загрузки видеофайлов с телефона пользователя, который затем будет обрабатываться на сервере. Проблема заключается в том, что размер файла может достигать 200 МБ плюс, и пользователь не будет держать приложение открытым, чтобы дождаться загрузки файла. Поскольку apple не позволяет приложениям работать в фоновом режиме в течение более чем ограниченного времени. Как я могу обеспечить загрузку моих файлов. Я использую afnetworking для настройки задачи загрузки, указанной в библиотеке ios 7.Как работать с большими файловыми загрузками в ios?

Пожалуйста, если кто-нибудь может указать мне в правильном направлении или иметь какое-либо решение, было бы весьма полезно. Я слишком долго стучал головой об этом. Благодарю.

 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration]; 


    [manager setTaskDidSendBodyDataBlock:^(NSURLSession *session,NSURLSessionTask *task ,int64_t bytesSent, int64_t totalBytesSent,int64_t totalBytesExpectedToSend){ 
     CGFloat progress = ((CGFloat)totalBytesSent/(CGFloat)sensize); 

     NSLog(@"Uploading files %lld -- > %lld",totalBytesSent,totalBytesExpectedToSend); 
     [self.delegate showingProgress:progress forIndex:ind]; 
    }]; 



    dataTask = [manager uploadTaskWithStreamedRequest:request progress:nil completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { 
     if (error) { 
      NSLog(@"Error: %@", error); 
     } else { 

     } 

     }]; 

Мой запрос является обычным многопрофильным запросом формы.

ответ

-1

Вы должны использовать background session configuration вместо конфигурации сеанса по умолчанию. Это гарантирует, что передача данных будет продолжена в фоновом режиме после выхода пользователя из приложения.

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

Обязательно включить фона принести возможности настроек проекта:

Capabilities http://www.migueldiazrubio.com/wp-content/uploads/2013/10/sendoa02.png

Background fetch http://www.migueldiazrubio.com/wp-content/uploads/2013/10/sendoa03.png

Затем реализовать application:handleEventsForBackgroundURLSession:completionHandler: в вашем App Делегат быть информированным, когда передача данных заканчивается и выполняет все, что вам нужно (обновление пользовательского интерфейса ...) внутри вашего приложения с принятым/отправленным файлом. Не забудьте позвонить по телефону completionHandler, чтобы сообщить системе, что вы закончили свои задачи. Затем iOS сделает снимок экрана активного экрана вашего приложения и обновит его на экране многозадачности iOS 7.

+5

Я не уверен, что для этого API требуется 'Background fetch'. –

6

Использование:

NSURLSessionConfiguration:backgroundSessionConfiguration: 

вместо

NSURLSessionConfiguration:defaultSessionConfiguration 

Из NSURLSessionConfiguration:backgroundSessionConfiguration: documentation:

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

Так что в вашем случае изменения:

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; 

к:

NSString *appID = [[NSBundle mainBundle] bundleIdentifier]; 
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:appID]; 

Реализация application:handleEventsForBackgroundURLSession:completionHandler: на ваше приложение делегата позволит ваше приложение будет разбужен (т.е. не-приостанавливаться или. не завершен в фоновом режиме), когда загрузка завершена (успешно ли она выполнена или нет).

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

+0

@aradhya, это решило вашу проблему? вы можете загружать большие видеофайлы в фоновом режиме? – user3562283

+0

@gavdotnet Спасибо! Я использую пример ура, это крутая работа! –

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