0

我可以使用 ios 10 和 swift 3 的应用程序代码在后台成功下载 zip 文件。

我使用背景会话数据任务:

let backgroundSessionConfiguration = URLSessionConfiguration.background(withIdentifier: (prefix + postfix))
        let backgroundSession = Foundation.URLSession(configuration: backgroundSessionConfiguration, delegate: self, delegateQueue: OperationQueue.main)

        var request = URLRequest(url: dlUrl )
        request.httpMethod = "GET"
        request.cachePolicy = NSMutableURLRequest.CachePolicy.reloadIgnoringCacheData

        let task = backgroundSession.downloadTask(with: request)

        task.resume()

但我想知道下载完成后将一些特定元数据传递给委托方法的最佳做法是什么:

    func urlSession(_ session: URLSession,
    downloadTask: URLSessionDownloadTask,
    didFinishDownloadingTo location: URL){

我需要在这个委托中获取一些关于该下载的信息,这取决于用户之前所做的选择。我无法从服务器或 url 获取这些数据。

所以我想要一个变量或字典 downloadType 告诉我如何处理完成的下载,在委托中有这样的东西

if downloadType == "normal" ... do this
else ... do that

我不确定在应用程序挂起时是否可以安全地使用实现 URLSessionDownloadDelegate 协议的类的属性?当应用程序挂起时下载完成时,类实例本身是否会恢复,还是 ios 会创建该类的新实例?

所以这总是有效的:

class ServerCom: NSObject, URLSessionDownloadDelegate {
   var updateTypeStr = ""
  [...]
  func somePublic(setUpdateType: String) {
     self.updateTypeStr = setUpdateType

  [...]
    func urlSession(_ session: URLSession,
    downloadTask: URLSessionDownloadTask,
    didFinishDownloadingTo location: URL){
   [...] 

       if( self.updateTypeStr == "normal" ) { // do this
       else { // do that

该用例有更好的方法吗?

提前致谢!

4

1 回答 1

2

当应用程序挂起时下载完成时,类实例本身是否会恢复,还是 ios 会创建该类的新实例?

您有责任自己保存和恢复它。

在守护进程完成后台请求的期间,您的应用程序可能会完全终止(例如,已暂停,它可能由于内存压力而被抛弃),因此您必须能够将任何相关信息保存到持久存储中并被能够在应用程序重新启动时从存储中加载它。

在使用后台会话测试应用程序时,我发现调用exit(0)终止应用程序的代码很有用。您永远不会在生产应用程序中这样做,但在后台请求完成后重新启动应用程序时测试应用程序重新创建必要对象的能力时,它很有用。关键是,在进行此测试时,不应尝试使用“双击主页按钮并向上滑动”来杀死应用程序,因为这也会在设计上取消后台请求。您想要测试您的应用程序已在正常应用程序生命周期中终止并在后台请求完成后由网络守护程序重新启动的场景。

于 2017-05-10T00:31:51.140 回答