【问题标题】:How to get backgroundSession NSURLSessionUploadTask response如何获取 backgroundSession NSURLSessionUploadTask 响应
【发布时间】:2014-03-19 06:08:43
【问题描述】:

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

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

永远不会被调用。我需要知道响应状态,以便正确处理上传失败。根据另一篇文章,一位苹果工程师告诉当会话为 backgroundSession 时不会调用此委托方法,以防止应用程序唤醒。关于如何解决这个问题的任何建议?在我的情况下调用的最后一个 URLSession 委托方法是:

-(void)URLSession:(NSURLSession *)session 
       dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data

【问题讨论】:

    标签: ios ios7 nsurlsession


    【解决方案1】:

    上传完成后应该调用NSURLSessionTaskDelegateURLSession:task:didCompleteWithError: 方法。参考task.response对象,应该是NSHTTPURLResponse对象。


    我确定您正在这样做,但标准的后台上传任务组件是:

    1. 创建一个后台会话:

      NSURLSessionConfiguration *backgroundConfiguration = [NSURLSessionConfiguration backgroundSessionConfiguration:@"com.domain.app"];
      NSURLSession *session = [NSURLSession sessionWithConfiguration:backgroundConfiguration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
      
    2. 使用NSURLSession方法uploadTaskWithRequest:fromFile:方法:

      NSURLSessionTask *task = [session uploadTaskWithRequest:request fromFile:fileURL];
      [task resume];
      

      使用后台会话,您必须:

      • 使用NSURLSessionUploadTask

      • 使用基于文件的再现(不能使用基于NSData的版本);

      • 使用基于委托的再现 不能使用数据任务; (b) NSDataNSURLSessionUploadTask 的演绎;也不是 (c) NSURLSessionUploadTask 的完成块再现。

    3. 对于上传任务,请确保不要调用 setHTTPBodyNSMutableRequest。对于上传任务,请求正文不能在请求本身中。

    4. 确保您实现了适当的NSURLSessionDelegateNSURLSessionTaskDelegate 方法。

    5. 确保在您的应用委托中实现application:handleEventsForBackgroundURLSession:(这样您就可以捕获completionHandler,您将在URLSessionDidFinishEventsForBackgroundURLSession 中调用它)。

    【讨论】:

    • 我已经完成了这一切,但我需要服务器响应的状态码。而且我找不到在后台会话中获取它的方法。有什么想法吗?
    • @NikosM。你只需要NSURLResponse吗?当didCompleteWithError 被调用时,您可以检查 (a) NSError 对象(例如,它无法解析 URL 的主机名); (b) task.response 对象将包含 NSHTTPURLResponse 信息。
    • 但是,我必须在后台上传的响应中提供 JSON 数据。有没有办法得到这个 JSON 数据?
    • @AndrewPaulSimmons 我看到你在my other answer 下发表了评论,我在其中回答了这个问题,所以我会推荐你​​。
    • @Rob : 在尝试了所有这些之后,对我来说,当我使用 NSURLSessionUploadTaskbackgroundSessionConfigurationWithIdentifier 时,委托方法仍然没有调用,请查看我的代码 stackoverflow.com/questions/32717350/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多