Alamofire-URLSession必备技能
2013 年 7 月 25 日
Alamofire是一个为 iOS
和 macOS
打造的并基于 Swift
的网络库 .它在 Apple
的基础网络架构上提供了 更加优雅的接口来简化繁重而常用的网络请求任务。 Alamofire
提供了链式的 request/response
方法, JSON
的传参和响应序列化,身份认证和其他特性。 Alamofire
的优雅之处在于它完完全全是由 Swift
写成的,并且没有从它的 Objective-C
版本- AFNetworking
那继承任何特性。
因为我们的 Alamofire
是对苹果 URLSession
的封装,所以在探索 Alamofire
之前,我们来看看 URLSession
的必备基础
一、请求网络的基本格式
URLSession.shared.dataTask(with: url) { (data, response, error) in if error == nil { print("请求成功\(String(describing: response))" ) } }.resume() 复制代码
-
URLSession.shared
提供了一个共享的单例会话对象,它为创建任务提供了一个合理的默认行为。使用共享会话仅用几行代码将URL的内容获取到内存中。 -
dataTask
创建一个网络会话数据任务。 -
resume
默认网络任务是挂起的,调用执行开始连接请求网络:三次握手...
- 请求成果或者失败都会回来闭包
- 其实闭包只是一层封装,真正来的是
URLSession
的代理 - 其实在这个过程中,我们省略一个重要的东西:
URLSessionConfiguration
二、URLSessionConfiguration
1.模式

URLSessionConfiguration
初始化有三种模式:
-
default
:默认模式,通常我们用这种模式就足够了。default
模式下系统会创建一个持久化的缓存并在用户的钥匙串中存储证书 -
ephemeral
: 系统没有任何持久性存储,所有内容的生命周期都与session
相同,当session
无效时,所有内容自动释放。
let configuration1 = URLSessionConfiguration.default let configuration2 = URLSessionConfiguration.ephemeral print("沙盒大小: \(String(describing: configuration1.urlCache?.diskCapacity))") print("内存大小: \(String(describing: configuration1.urlCache?.memoryCapacity))") print("沙盒大小: \(String(describing: configuration2.urlCache?.diskCapacity))") print("内存大小: \(String(describing: configuration2.urlCache?.memoryCapacity))") 打印结果: 沙盒大小: Optional(10000000) 内存大小: Optional(512000) 沙盒大小: Optional(0) 内存大小: Optional(512000) 复制代码
-
background
创建一个可以在后台甚至APP已经关闭的时候仍然在传输数据的会话。background
模式与default
模式非常相似,不过background
模式会用一个独立线程来进行数据传输。background
模式可以在程序挂起,退出,崩溃的情况下运行task。也可以利用标识符来恢复进。注意,后台Session
一定要在创建的时候赋予一个唯一的identifier,这样在APP下次运行的时候,能够根据identifier
来进行相关的区分。 如果用户关闭了APP,IOS 系统会关闭所有的background Session。而且,被用户强制关闭了以后,IOS系统不会主动唤醒APP,只有用户下次启动了APP,数据传输才会继续
// 初始化一个后台的模式的会话配置 let configuration = URLSessionConfiguration.background(withIdentifier: self.createID()) // 初始化session会话 let session = URLSession.init(configuration: configuration, delegate: self, delegateQueue: OperationQueue.main) // 传入url开启下载 session.downloadTask(with: url).resume() 复制代码
- 初始化一个后台的模式的会话配置
- 初始化
session
会话 - 传入
url
开启下载resume
- 下载进度监控
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) 复制代码
- 下载完成之后就回调
URLSessionDownloadDelegate
代理
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) 复制代码
易错易忽略点
上面这么设置,还不能达到后台下载!还需要设置下面两步
- 开启后台下载权限
//用于保存后台下载的completionHandler var backgroundSessionCompletionHandler: (() -> Void)? func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) { self.backgroundSessionCompletionHandler = completionHandler } 复制代码
- 回调系统回调,告诉系统及时更新屏幕
func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) { print("后台任务下载回来") DispatchQueue.main.async { guard let appDelegate = UIApplication.shared.delegate as? AppDelegate, let backgroundHandle = appDelegate.backgroundSessionCompletionHandler else { return } backgroundHandle() } } 复制代码
为什么这么处理,苹果爸爸说的算

2. 常规属性
identifier: httpAdditionalHeaders: networkServiceType: allowsCellularAccess: timeoutIntervalForRequest: timeoutIntervalForResource: sharedContainerIdentifier: waitsForConnectivity:
3. 设置Cookie政策
-
httpCookieAcceptPolicy:
决定何时应该接受Cookie
的策略常量 -
httpShouldSetCookies:
一个布尔值,用于确定请求是否应包含来自Cookie
存储的Cookie
。 -
httpCookieStorage:
管理cookie
存储的单一对象(共享实例) -
HTTPCookie:
表示HTTP cookie
的对象。它是一个不可变的对象,从包含cookie
属性的字典中初始化
4. 设置安全策略
-
tlsMaximumSupportedProtocol:
在此会话中进行连接时客户端应请求的最大TLS协议
版本。 -
tlsMinimumSupportedProtocol:
协议协商期间应该接受的最小TLS协议
。 -
urlCredentialStorage:
提供身份验证凭据的凭证存储
5. 设置缓存策略
-
urlCache:
用于向会话中的请求提供缓存响应的URL
缓存 -
requestCachePolicy:
一个预定义常量,用于确定何时从缓存中返回响应
7. 支持后台转移
sessionSendsLaunchEvents: isDiscretionary:
7. 支持自定义协议
-
protocolClasses:
在会话中处理请求的额外协议子类的数组 -
URLProtocol:
一个NSURLProtocol
对象处理加载协议特定的URL
数据。在NSURLProtocol
类本身是一个抽象类,可以为与特定URL
方案的URL
处理基础设施。您可以为您的应用支持的任何自定义协议或URL
方案创建子类
8. 支持多路径TCP
multipathServiceType: URLSessionConfiguration.MultipathServiceType:
9. 设置HTTP策略和代理属性
httpMaximumConnectionsPerHost: httpShouldUsePipelining: connectionProxyDictionary:
10. 支持连接变化
-
waitsForConnectivity:
一个布尔值,指示会话是否应等待连接变为可用或者立即失败。