AlamoFire在后台会话中下载

Las*_*ove 37 network-programming ios swift alamofire

我在一个新应用程序中使用Alamofire(基于Alamofire的下载管理器示例)我需要一些关于使用后台会话下载文件的说明.我需要覆盖SessionDelegate才能使它工作?还是只是backgroundCompletionHandler

通常使用Alamofire处理后台下载的步骤是什么?我如何处理我的应用程序相关的情况,下载量不断变化.

Józ*_*sza 31

更新

基于这个惊人的教程,我在GitHub上提供了一个示例项目.它有一个后台会话管理的例子.

根据Apple的URL加载系统编程指南:

在iOS和OS X中,当用户重新启动您的应用程序时,您的应用程序应立即创建后台配置对象,其标识符与上次运行应用程序时具有未完成任务的任何会话相同,然后为每个配置对象创建会话.这些新会话同样自动与正在进行的后台活动重新关联.

显然,通过使用适当的后台会话配置实例,您的下载永远不会"不断变化".

我也发现这个答案真有帮助.

原始答案

来自Alamofire的GitHub页面:

应用程序可以为后台和短暂会话创建管理器,以及自定义默认会话配置的新管理器,例如默认标头(HTTPAdditionalHeaders)或超时间隔(timeoutIntervalForRequest).

默认情况下,顶级方法使用Manager具有默认会话配置的共享实例.但是,您可以创建具有后台会话配置的经理,如下所示:

let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.example.app.background")
let manager = Alamofire.Manager(configuration: configuration)
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用此Manager实例发出请求.

manager.startRequestsImmediately = true
let request = NSURLRequest(URL: NSURL(string: "your.url.here")!)
manager.request(request)
Run Code Online (Sandbox Code Playgroud)

通过查看它的实现,它还有一个名为的属性backgroundCompletionHandler,因此您可以添加一个完成块:

manager.backgroundCompletionHandler = {
        // do something when the request has finished
    }
Run Code Online (Sandbox Code Playgroud)


Luc*_*lla 25

Alamofire实际上很容易:

1)您的Alamofire.Manager应配置后台会话标识符:

class NetworkManager {
    ...
    private lazy var backgroundManager: Alamofire.SessionManager = {
        let bundleIdentifier = ...
        return Alamofire.SessionManager(configuration: URLSessionConfiguration.background(withIdentifier: bundleIdentifier + ".background"))
    }()
    ...
}
Run Code Online (Sandbox Code Playgroud)

2)在App Delegate实现application(_:handleEventsForBackgroundURLSession:completionHandler:并传递完成处理程序Alamofire.SessionManager.backgroundCompletionHandler.

在我的情况下,app委托方法看起来像

func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
    NetworkManager.default.backgroundCompletionHandler = completionHandler
}
Run Code Online (Sandbox Code Playgroud)

我的网络管理器有一个这样的计算属性来设置Manager属性:

var backgroundCompletionHandler: (() -> Void)? {
    get {
        return backgroundManager.backgroundCompletionHandler
    }
    set {
        backgroundManager.backgroundCompletionHandler = newValue
    }
}
Run Code Online (Sandbox Code Playgroud)


Nal*_*ene 9

我一直在寻找解决方案.直到阅读上面提到的文章.对我来说问题是 - 我必须启用外部附件通信

在此输入图像描述

其他一切都如上所述完成.AppDelegate中:

func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
        BackendAPIManager.sharedInstance.backgroundCompletionHandler = completionHandler
    }
Run Code Online (Sandbox Code Playgroud)

辛格尔顿:

import Alamofire

class BackendAPIManager: NSObject {
    static let sharedInstance = BackendAPIManager()

    var alamoFireManager : Alamofire.SessionManager!

    var backgroundCompletionHandler: (() -> Void)? {
        get {
            return alamoFireManager?.backgroundCompletionHandler
        }
        set {
            alamoFireManager?.backgroundCompletionHandler = newValue
        }
    }

    fileprivate override init()
    {
        let configuration = URLSessionConfiguration.background(withIdentifier: "com.url.background")
        configuration.timeoutIntervalForRequest = 200 // seconds
        configuration.timeoutIntervalForResource = 200
        self.alamoFireManager = Alamofire.SessionManager(configuration: configuration)
    }
}
Run Code Online (Sandbox Code Playgroud)

呼叫按以下方式完成:

BackendAPIManager.sharedInstance.alamoFireManager.upload(multipartFormData: { (multipartFormData) in ...
Run Code Online (Sandbox Code Playgroud)

  • 当你告诉人们勾选“魔法框”而不解释原因或它如何影响应用商店的接受度时,这是一个非常糟糕的解决方案。 (2认同)