【问题标题】:iOS: Perform upload task while app is in backgroundiOS:在应用程序处于后台时执行上传任务
【发布时间】:2014-07-12 19:58:12
【问题描述】:

真的没有办法在 iOS 应用程序在后台运行 UPLOAD 任务吗?这是荒唐的。一直在查看NSURLSessionUploadTaskdispatch_after 甚至NSTimer 之类的各种内容,但应用程序在被置于后台后的短短 10 秒内没有任何效果。

其他具有上传功能的应用如何工作?比如说,将图片上传到 Facebook 并将应用置于后台,这会取消上传吗?

为什么 iOS 不能像 Android 和 Windows Phone 那样拥有后台服务或代理?

这是我的应用程序的一个关键功能,在其他平台上也可以完美运行。

任何帮助表示赞赏:(

【问题讨论】:

  • 如果您能够创建和调用 Web 服务为您执行任务,这似乎可以使用服务器端编程。检查链接:stackoverflow.com/questions/25725811/…。不确定,如果它与你相关。

标签: ios background upload


【解决方案1】:

您可以通过“后台会话”在后台继续上传。在Downloading Files in the Background 中概述了使用background(withIdentifier:) 创建背景URLSessionConfiguration 的基本过程。该文档侧重于下载,但同样的基本流程也适用于上传任务。

注意:


顺便说一句,如果你不想使用后台NSURLSession,但你想在应用离开后台后继续运行有限长度的任务超过几秒钟,你可以使用@请求更多时间987654340@ 方法beginBackgroundTask。即使用户离开应用程序,这也会给您一点时间(以前为 3 分钟,在 iOS 13 及更高版本中仅为 30 秒)完成您正在处理的任何任务。

Extending Your App's Background Execution Time。他们的代码 sn-p 有点过时了,但现代版本可能看起来像:

func initiateBackgroundRequest(with data: Data) {
    var backgroundTaskID: UIBackgroundTaskIdentifier = .invalid

    // Request the task assertion and save the ID.
    backgroundTaskID = UIApplication.shared.beginBackgroundTask(withName: "Finish Network Tasks") {
        // End the task if time expires.
        if backgroundTaskID != .invalid {
            UIApplication.shared.endBackgroundTask(backgroundTaskID)
            backgroundTaskID = .invalid
        }
    }

    // Send the data asynchronously.
    performNetworkRequest(with: data) { result in
        // End the task assertion.
        if backgroundTaskID != .invalid {
            UIApplication.shared.endBackgroundTask(backgroundTaskID)
            backgroundTaskID = .invalid
        }
    }
}

请不要迷失在此处的详细信息中。关注基本模式:

  • 开始后台任务;
  • 提供一个超时子句,在你碰巧用完时间时清理后台任务;
  • 即使用户离开应用程序,也可以启动您需要继续的任何操作;和
  • 在网络请求的完成处理程序中,结束后台任务。

【讨论】:

  • 你确定completionHandler?我在uploadTaskWithRequest:fromFile:completionHandler: 方法文档中没有发现任何提及它不能用于后台上传任务。
  • 查看documentation for URLSession,上面写着“因为您的应用可能会在传输过程中退出并重新启动,所以不支持完成处理程序块。”
  • 参考background类方法的注释,它们是否仍然适用或有任何更新?
  • @hannojg - 曾经在他们的旧“URL 编程指南”中进行了概述,随后他们用新的文档替换了该文档,该文档未能清楚地概述后台上传要求。描述这一点的 2015 年之前的原始视频似乎也消失了。但是,只需在后台会话中尝试uploadTask(with:from:),您将收到一个明确的异常报告,“后台会话不支持从 NSData 上传任务”。这证实了这些对后台上传的限制仍然适用。
  • FWIW,这个“不支持 NSData”用于后台上传是一个完全可以理解的限制,恕我直言。他们真的不想让他们的后台守护进程不得不在内存中保留巨大的Data/NSData 对象。如果资源太大以至于您需要后台上传(而不是在用户离开应用程序后仅请求额外的 30 秒来完成标准 URLSession),那么无论如何,基于文件的上传将是首选(即使对于非-背景URLSession)。
猜你喜欢
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多