一、URLSession
URLSession.shared.dataTask(with: url) { (data, response, error) in
if error == nil {
print("请求成功\(String(describing: response))" )
}
}.resume()
- 创建
URLSessionConfiguration
对象 - 用之前创建的
URLSessionConfiguration
对象创建配置URLSession
对象 - 用
URLSession
对象创建对应的task
对象 并用resume
方法执行
- 用
delegate
方法或completion block
响应网络事件及数据
二、URLSessionConfiguration
1、模式
-
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已经关闭的时候仍然在传输数据的会话
let configuration = URLSessionConfiguration.background(withIdentifier: self.createID())
let session = URLSession.init(configuration: configuration, delegate: self, delegateQueue: OperationQueue.main)
session.downloadTask(with: url).resume()
开启后台下载权限。如果不开启的话,其实也是在后台下载,但是下载的最后完成是需要再次进入前台完成,因为再进入前台才会执行func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {}这个方法。开启之后,在后台下载,不需要进入前台就可以完成,因为会自己去执行func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {}这个方法,和在AppDelegate中有没有执行self.backgroundSessionCompletionHandler = completionHandler这个方法没关系。
//用于保存后台下载的completionHandler
var backgroundSessionCompletionHandler: (() -> Void)?
func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, [图片上传中...(completionHandler.png-663f63-1565866395910-0)]
completionHandler: @escaping () -> Void) {
self.backgroundSessionCompletionHandler = completionHandler
}
下面代码是苹果爸爸说要加的。回调系统回调,告诉系统及时更新屏幕
extension ViewController:URLSessionDownloadDelegate{
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:
指定如果已存的缓存数据被提供它的源段确认为有效则允许使用缓存数据响应请求,否则从源段加载数据。
- 使用
configuration.requestCachePolicy =