Задача за качване във фонов режим

Бях заклещен в това от миналата седмица. Но не разбрах решението.

Искам да получа достъп до всички снимки от ролката на камерата и искам да запазя всички снимки на отдалечен сървър с помощта на 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