Cómo get una respuesta de NSURLSessionDownloadTask downloadTaskWithRequest

Algunos antecedentes primero: se supone que la aplicación captura files del server AWS S3. Para hacer eso, el primer paso de ese process es ir al server local y get el nombre del file y otra información de él. Después de ese paso, tenemos una URLMutableRequest completa.

NOTA : Estoy configurando el NSURLSession como una session de background:

- (NSURLSession *)backgroundSession { static NSURLSession *session = nil; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"identifier"]; session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil]; }); return session; } 

Esta es la tarea para download los files del server AWS S3:

Para esta tarea , quiero usar los delegates para ejecutarse en modo de background.

 @property (nonatomic, strong) NSURLSessionDownloadTask *downloadTask; @property (nonatomic, strong) NSURLSession *defaultSession; self.defaultSession = [self backgroundSession]; self.downloadTask = [self.defaultSession downloadTaskWithRequest:request]; [self.downloadTask resume]; 

¿Cómo obtengo un formulario de RESPUESTA a esta SOLICITUD?

La documentation de Apple dice que no puede tener un bloque como completionHandler cuando usa una backgroundSessionConfiguration .

NSURLSessionDownloadTask tiene una propiedad de response (parte de su class base, NSURLSessionTask ) que debe establecerse en la respuesta. Vea aquí

En caso de que alguien que se pregunte cómo get la respuesta de descarga antes de que se complete la descarga, intente esto: dispare dataTask en su lugar, obtenga la respuesta y luego convierta dataTask para download si es necesario.

 NSURLSessionTask *task = [session dataTaskWithRequest:request]; [task resume]; 

NSURLSessionDataDelegate

 - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { // use response, convert data task to download task completionHandler(NSURLSessionResponseBecomeDownload); } - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didBecomeDownloadTask:(NSURLSessionDownloadTask *)downloadTask { // downloadTask converted from dataTask } 

NSURLSessionDownloadDelegate

 - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite { // update progress } - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)location { // copy downloaded file from location } 

NSURLSessionDownloadDelegate implementar el protocolo NSURLSessionDownloadDelegate en su class (ya que especificó las sesiones delegadas como self ).

Debe verificar los documentos para los methods disponibles, pero va a implementar al less lo siguiente:

 - (void)URLSession:(NSURLSession *)session didBecomeInvalidWithError:(NSError *)error - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data