Alamofire-URLSession介绍
一.URLSesstion
- 基本用法
URLSession.shared.dataTask(with: url) { (data, response, error) in
if error == nil {
print("请求成功\(String(describing: response))" )
}
}.resume()
创建
session
会话对象
创建dataTask
网络任务
开启resume
任务
二. URLSessionConfiguration
1. 三种模式
open class URLSessionConfiguration : NSObject, NSCopying {
open class var `default`: URLSessionConfiguration { get }
open class var ephemeral: URLSessionConfiguration { get }
@available(iOS 8.0, *)
open class func background(withIdentifier identifier: String) -> URLSessionConfiguration
- 官方释义
Default sessions behave much like the shared session (unless you customize them further), but let you obtain data incrementally using a delegate. You can create a default session configuration by calling the default method on the URLSessionConfiguration class.
Ephemeral sessions are similar to default sessions, but they don’t write caches, cookies, or credentials to disk. You can create an ephemeral session configuration by calling the ephemeral method on the URLSessionConfiguration class.
Background sessions let you perform uploads and downloads of content in the background while your app isn’t running. You can create a background session configuration by calling the backgroundSessionConfiguration(_:) method on the URLSessionConfiguration class.
default
是最常用的默认模式,该模式下系统会创建一个持久化的缓存,同时将证书存储在用户的钥匙串中ephemeral
除了没有存储外,和default
差不多background
后台运行模式,可以使APP在没运行的时候,通过调用backgroundSessionConfiguration(_:)
,实现上传和下载
- 下载任务示例:
let configuration = URLSessionConfiguration.background(withIdentifier: self.createID())
let session = URLSession.init(configuration: configuration, delegate: self, delegateQueue: OperationQueue.main)
session.downloadTask(with: url).resume()
- 下载任务主要由两个代理方法,下载完成和下载进度
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL) {
print("下载完成 - \(location)")
}
func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didWriteData bytesWritten: Int64, totalBytesWritten: Int64, totalBytesExpectedToWrite: Int64) {
print(" bytesWritten \(bytesWritten)\n totalBytesWritten \(totalBytesWritten)\n totalBytesExpectedToWrite \(totalBytesExpectedToWrite)")
print("下载进度: \(Double(totalBytesWritten)/Double(totalBytesExpectedToWrite))\n")
}
- 要想实现后台下载,还需以下两个步骤:
- 开启后台下载权限
//用于保存后台下载的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
:应该下载后台URL会话中的文件的共享容器的标识符。 -
waitsForConnectivity
:一个布尔值,指示会话是否应等待连接变为可用或者立即失败
3. 设置Cookie
政策
-
httpCookieAcceptPolicy
:决定何时应该接受Cookie的策略常量 -
httpShouldSetCookies
:一个布尔值,用于确定请求是否应包含来自Cookie存储的Cookie。 -
httpCookieStorage
:管理cookie存储的单一对象(共享实例) -
HTTPCookie
:表示HTTP cookie的对象。它是一个不可变的对象,从包含cookie属性的字典中初始化
4. 设置安全策略
-
tlsMaximumSupportedProtocol
:在此会话中进行连接时客户端应请求的最大TLS协议版本。 -
tlsMinimumSupportedProtocol
:协议协商期间应该接受的最小TLS协议。 -
urlCredentialStorage
:提供身份验证凭据的凭证存储
5. 设置缓存策略
-
urlCache
:用于向会话中的请求提供缓存响应的URL缓存 -
requestCachePolicy
:一个预定义常量,用于确定何时从缓存中返回响应
6. 支持后台转移
-
sessionSendsLaunchEvents
:一个布尔值,指示在传输完成时是否应该在后台继续或启动应用程序 -
isDiscretionary
:一个布尔值,用于确定是否可以根据系统的判断来调度后台任务以获得最佳性能。
7. 支持自定义协议
-
protocolClasses
:在会话中处理请求的额外协议子类的数组 -
URLProtocol
:一个NSURLProtocol对象处理加载协议特定的URL数据。在NSURLProtocol类本身是一个抽象类,可以为与特定URL方案的URL处理基础设施。您可以为您的应用支持的任何自定义协议或URL方案创建子类
8. 支持多路径TCP
-
multipathServiceType
:指定用于通过Wi-Fi和蜂窝接口传输数据的多路径TCP连接策略的服务类型 -
URLSessionConfiguration.MultipathServiceType
:指定多路径TCP使用的服务类型的常量
9. 设置HTTP策略和代理属性
-
httpMaximumConnectionsPerHost
:同时连接到给定主机的最大数量。 -
httpShouldUsePipelining
:一个布尔值,用于确定会话是否应使用HTTP流水线 -
connectionProxyDictionary
:包含有关在此会话中使用的代理信息的字典
10. 支持连接变化
-
waitsForConnectivity
:一个布尔值,指示会话是否应等待连接变为可用或者立即失败。
三.NSURLRequestCachePolicy
-
NSURLRequestUseProtocolCachePolicy = 0
: 默认缓存策略
如果一个NSCachedURLResponse对于请求并不存在,数据将会从源端获取。如果请求拥有一个缓存的响应,那么URL加载系统会检查这个响应来决定,如果它指定内容必须重新生效的话。假如内容必须重新生效,将建立一个连向源端的连接来查看内容是否发生变化。假如内容没有变化,那么响应就从本地缓存返回数据。如果内容变化了,那么数据将从源端获取 -
NSURLRequestReloadIgnoringLocalCacheData = 1
:URL应该加载源端数据,不使用本地缓存数据 -
NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4
:本地缓存数据、代理和其他中介都要忽视他们的缓存,直接加载源数据
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData -
NSURLRequestReturnCacheDataElseLoad = 2
:指定已存的缓存数据应该用来响应请求,不管它的生命时长和过期时间。如果在缓存中没有已存数据来响应请求的话,数据从源端加载 -
NSURLRequestReturnCacheDataDontLoad = 3
:指定已存的缓存数据用来满足请求,不管生命时长和过期时间。如果在缓存中没有已存数据来响应URL加载请求的话,不去尝试从源段加载数据,此时认为加载请求失败。这个常量指定了一个类似于离线模式的行为 -
NSURLRequestReloadRevalidatingCacheData = 5
:指定如果已存的缓存数据被提供它的源段确认为有效则允许使用缓存数据响应请求,否则从源段加载数据。