【问题标题】:iOS 7 background upload and POST requestsiOS 7 后台上传和 POST 请求
【发布时间】:2014-03-11 07:49:23
【问题描述】:

我需要在每次上传之前和之后通过其他 HTTP POST 请求在后台上传文件。

以前我使用 beginBackgroundTaskWithExpirationHandler,它在 iOS 6 之前运行良好,但从 IOS 7 开始,它被限制为大约 180 秒,这是一个问题。

我已经阅读了关于 NSURLSession 的文档,我们有后台传输服务。但问题是它只允许在后台上传和下载。它不允许我在后台每次上传后发出 POST 请求。

那么有什么方法可以在后台上传的同时发出 POST 请求?

任何正确方向的提示都将受到高度赞赏。

【问题讨论】:

    标签: ios objective-c file-upload ios7 nsurlsession


    【解决方案1】:

    我认为你可以使用 NSURLSessionDownloadTask 来发送 POST。

    IMO,下载任务并不意味着它用于下载。这意味着您的 POST 请求(json/xml)的响应将被下载到本地文件。然后您可以打开该文件并对其进行解析以获取请求。

    如果您愿意,您甚至可以使用 NSURLSessionDownloadTask 将文件上传到 S3。并且 s3 响应将被“下载”到本地文件..

    更多信息,请查看苹果开发者论坛https://devforums.apple.com/thread/210515?tstart=0中的这个问题

    【讨论】:

      【解决方案2】:

      在后台任务的回调期间,我在生产代码中成功地往返了原版 http 调用。 callback 是:

      -[id<NSURLSessionTaskDelegate> URLSession:task:didCompleteWithError:]
      

      你有大约 30 秒的时间来做你需要做的事情。 在此期间进行的任何异步调用都必须用

      括起来
      -[UIApplication beginBackgroundTaskWithName:expirationHandler:]
      

      以及that 的“结束任务”版本。否则,iOS 将在您弹出堆栈时终止您的进程(当您等待异步进程时)。

      顺便说一句,不要混淆UIApplication 任务(我称它们为“应用程序任务”)和NSURLSession 任务(“会话任务”)。

      【讨论】:

      • 不幸的是,当后台传输的代理启动应用程序时创建后台任务不会增加您的 30 秒窗口
      • 否,但每个任务都有一个回调,它为您提供另一个时间增量,在此期间您可以排队更多任务。因此,您可以将无限数量的任务链接在一起。我在生产中运行了这个,可以说,完全在后台上传 1000 张照片。
      • @Clay 没有测试过,但听起来很天才。你能放一些源代码吗?谢谢。
      • @Sasho 我有,点点滴滴。也许有一天我会在 github 上放一些完整的东西。同时,here 是我所做的每个 NSURLSession 答案。
      • Clay Bridges 你能解释一下你是怎么做到的吗?它也适用于 Amazon S3 吗?
      【解决方案3】:

      如果您使用uploadTaskWithRequest:fromData:completionHandler:,您可以从完成处理程序块发出您的 HTTP POST 请求:

      [backgroundSession uploadTaskWithRequest:request fromData:data completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
          NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
          if (httpResponse.statusCode == 200) {
              NSMutableURLRequest *postRequest = [NSMutableURLRequest requestForURL:[NSURL URLWithString:@"http://somethingorother.com/"]];
              request.HTTPMethod = @"POST";
              .
              .
              .
              NSURLResponse *postResponse;
              NSError *postError;
              NSData *postResponseData = [NSURLConnection sendSynchronousRequest:postRequest returningResponse:&postResponse error:&postError]; 
              // Check postResponse and postError to ensure that the POST succeeded
          }
      }];
      

      【讨论】:

      • 这仅对前台调用有效。对于后台任务,我们只能使用委托
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-29
      • 2012-08-05
      • 1970-01-01
      • 2021-08-10
      • 2017-06-18
      • 2015-06-17
      • 2016-09-26
      相关资源
      最近更新 更多