Задача фоновой загрузки

Я застрял в этом с прошлой недели. Но я не получил решения.

Я хочу получить доступ ко всем фотографиям из фотопленки и хочу сохранить все фотографии на удаленном сервере с помощью NSURLSessionUploadTask. Для этого я использую следующий код:

 NSString *boundary = @"----WebKitFormBoundarycC4YiaUFwM44F6rT";
NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"%@.jpeg\"\r\n", @"upload",self.pictureName] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:self.imageData];
[body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"--%@--\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.HTTPMaximumConnectionsPerHost = 1;
config.HTTPAdditionalHeaders = @{
                                 @"api-key"       : @"55e76dc4bbae25b066cb",
                                 @"Accept"        : @"application/json",
                                 @"Content-Type"  : [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary]
                                 };
NSURLSession *upLoadSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
NSURL *url = self.uploadURL;
NSLog(@"URL=%@",url);
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod:@"PUT"];
[request setHTTPBody:body];

// 3

self.uploadTask = [upLoadSession uploadTaskWithRequest:request fromData:nil];
// self.uploadTask = [upLoadSession uploadTaskWithRequest:request fromFile:tmpFileUrl];
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];

// 5
[_uploadTask resume];

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


person Rox    schedule 03.09.2014    source источник


Ответы (2)


Конфигурация сеанса не предназначена для работы в фоновом режиме.

NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.test.backgroundSession"];

NSURLSession *upLoadSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];

Реализуйте, как указано выше.

person Woodstock    schedule 03.09.2014
comment
Теперь он перестал загружать изображения на сервер - person Rox; 03.09.2014
comment
+backgroundSessionConfiguration: уникален тем, что создает фоновый сеанс. Фоновые сеансы отличаются от обычных, заурядных сеансов тем, что они могут запускать задачи загрузки и скачивания, даже если приложение приостановлено, завершает работу или аварийно завершает работу. Идентификатор, указанный во время инициализации, используется для предоставления контекста любым демонам, которые могут возобновить фоновые передачи вне процесса. - person Woodstock; 03.09.2014
comment
@Rox, пожалуйста, прочтите это: raywenderlich.com/51127/nsurlsession-tutorial — если вы есть какие-либо дополнительные вопросы, которые подробно не освещены здесь, дайте мне знать. В основном вы должны вызывать фоновый сеанс в фоновой задаче. - person Woodstock; 03.09.2014
comment
@Woodstock Приложение находится в фоновом режиме, но не выполняет код. Система переводит приложения в это состояние автоматически и не уведомляет их перед этим. Во время приостановки приложение остается в памяти, но не выполняет никакого кода. - person Anurag Sharma; 06.06.2017

Чтобы задача загрузки работала в фоновом режиме, вы должны использовать uploadTaskWithRequest:fromFile: вместо uploadTaskWithRequest:fromData:

Если вы используете NSData для предоставления файлов, он будет работать, пока приложение активно, и остановится, когда приложение перейдет в фоновый режим.

person Suran    schedule 06.06.2017