NSURLSessionUploadTask

NSURLSessionUploadTask

我已经实现了一个在后台运行的NSURLSession(因此,即使该应用被暂停,它也可以使用系统守护进程来继续执行该任务)。问题是

-(void)URLSession:(NSURLSession *)session
       dataTask:(NSURLSessionDataTask *)dataTask
       didReceiveResponse:(NSURLResponse *)response
       completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler

从来没有被调用。我需要知道响应状态,以便可以正确处理上传失败。根据另一篇文章,一位苹果工程师告诉我们,当 session 为backgroundSession时,不会调用此委托(delegate)方法,以防止应用唤醒。关于如何解决这个问题有什么建议吗?我遇到的最后一个URLSession委托(delegate)方法是:
-(void)URLSession:(NSURLSession *)session
       dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data

最佳答案

上传完成后,应调用URLSession:task:didCompleteWithError:NSURLSessionTaskDelegate方法。请引用task.response对象,该对象应该是NSHTTPURLResponse对象。

我确定您正在执行此操作,但是标准的后台上传任务组件是:

  • 进行后台 session :
    NSURLSessionConfiguration *backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.domain.app"];
    NSURLSession *session = [NSURLSession sessionWithConfiguration:backgroundConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    
  • 使用NSURLSession方法uploadTaskWithRequest:fromFile:方法:
    NSURLSessionTask *task = [session uploadTaskWithRequest:request fromFile:fileURL];
    [task resume];
    

    在后台 session 中,您必须:
  • 使用NSURLSessionUploadTask;
  • 使用基于文件的格式(不能使用基于NSData的版本);
  • 使用基于委托(delegate)的再现
    无法使用数据任务; (b)NSDataNSURLSessionUploadTask呈现; (c)NSURLSessionUploadTask的完成块翻译。
  • 对于上传任务,请确保不要调用setHTTPBodyNSMutableRequest。使用上载任务时,请求的主体不能在请求本身中。
  • 确保实现适当的NSURLSessionDelegateNSURLSessionTaskDelegate方法。
  • 确保在您的应用程序委托(delegate)中实现application:handleEventsForBackgroundURLSession:(这样您就可以捕获completionHandler,它将在URLSessionDidFinishEventsForBackgroundURLSession中调用)。
  • 关于ios - 如何获取backgroundSession NSURLSessionUploadTask响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22487336/

    10-12 23:59