URLSessionDownloadTask 奇怪的行为

URLSessionDownloadTask weird behaviour

我创建了一个 class 以使用 URLSession 下载文件。

我注意到一个奇怪的行为,当设备处于调试模式时,它正在下载文件。但是,如果我手动删除设备和 运行 应用程序,则下载根本无法进行。 有时重新连接设备会开始下载。

这就是我创建 URLSession 的方式:

private lazy var urlSession: URLSession = {
     let config                      = URLSessionConfiguration.background(withIdentifier: "org.company.id")
     config.isDiscretionary          = true
     config.sessionSendsLaunchEvents = true
     config.allowsCellularAccess     = true
   return URLSession(configuration: config, delegate: self, delegateQueue: nil)
}()

这是我的请求下载功能:

func requestDownload(urlString: String){
    guard let url                = URL(string: urlString) else {return}
    downloadTask                 = urlSession.downloadTask(with: url)
    downloadTask.taskDescription = urlString
    downloadTask.resume()
}

这是一个 link 文件下载器 class : https://github.com/skdevil/PrakrstaFileDownloader

知道如何解决吗?

问题是当您 运行 它附加到您的调试器时,该应用程序永远不会暂停,而在设备上可以。

一些观察:

  • 您可能没有在 URLSessionDelegate 中实现 handleEventsForBackgroundURLSession in your app delegate or urlSessionDidFinishEvents(forBackgroundURLSession:)。它们是后台下载所必需的。我们需要查看这些实现以进一步发表评论。

    有关详细信息,请参阅 Downloading Files in the Background

    仅供参考,我已经在该存储库上发布了 pull request,显示了您需要做什么来支持后台会话。

  • 或者,如果您已正确完成所有这些操作,请注意您已经设置了自主模式。这意味着它将在连接到电源和 wifi 时下载。是这样吗?

  • 请注意,我鼓励您进行一些日志记录,以便您了解发生了什么。但是你不能为此使用 Xcode 的调试机制(因为,正如你所注意到的,附加到 Xcode 会改变应用程序的行为)。

    您可以改为使用 "unified logging" 进行记录,如 WWDC 2016 视频 Unified Logging and Activity Tracing. That way, you can watch log messages from your iOS device on your macOS console, and you don't have to write your own file logging system. See point 3 at 中所述,例如如何在 macOS 控制台上观察 iOS 日志消息。或者观看前面提到的 WWDC 视频。