AlamoFire下载后台会话

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

通常情况下,使用Alamofire处理后台下载的步骤是什么? 而且我该如何处理我的应用程序重新启动的情况,以及不断下载的情况。 感谢致敬。

更新

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

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

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

所以显然通过使用适当的后台会话configuration实例,您的下载将永远不会“变幻莫测”。

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

原始答案

从Alamofire的GitHub页面 :

应用程序可以为后台和临时会话创buildpipe理器,也可以为自定义默认会话configuration的新pipe理器(例如默认标头(HTTPAdditionalHeaders)或超时间隔(timeoutIntervalForRequest))创buildpipe理器。

默认情况下,顶级方法使用具有默认会话configuration的共享Manager实例。 你可以创build一个带有后台会话configuration的pipe理器,如下所示:

 let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.example.app.background") let manager = Alamofire.Manager(configuration: configuration) 

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

 manager.startRequestsImmediately = true let request = NSURLRequest(URL: NSURL(string: "your.url.here")!) manager.request(request) 

通过查看它的实现,它也有一个名为backgroundCompletionHandler的属性,所以你可以添加一个完成块:

 manager.backgroundCompletionHandler = { // do something when the request has finished } 

Alamofire实际上非常简单:

1)你的Alamofire.Manager应该configuration一个后台会话标识符:

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

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

在我的情况下,应用程序委托方法看起来像

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

而我的networkingpipe理员有这样的计算属性来设置Manager属性:

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

我正在寻找解决scheme很长。 直到阅读上面提到的文章。 我的问题是 – 我必须启用外部配件通信

在这里输入图像说明

其他的一切都按照上面的描述完成。 AppDelegate中:

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

辛格尔顿:

 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) } } 

通话按以下方式完成:

 BackendAPIManager.sharedInstance.alamoFireManager.upload(multipartFormData: { (multipartFormData) in ...