URLSession.shared.dataTask(with: url) { (data, response, error) in if error == nil { print("請求成功\(String(describing: response))" ) } }.resume() 複製代碼
建立
session
會話對象 建立dataTask
網絡任務 開啓resume
任務swift
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() } } 複製代碼
identifier
:配置對象的後臺會話標識符。api
httpAdditionalHeaders
:與請求一塊兒發送的附加頭文件的字典。數組
networkServiceType
:網絡服務的類型緩存
allowsCellularAccess
:布爾值,是否容許蜂窩網絡鏈接。安全
timeoutIntervalForRequest
:等待其餘數據時使用的超時間隔。bash
timeoutIntervalForResource
:資源請求應該容許的最大時間量。markdown
sharedContainerIdentifier
:應該下載後臺URL會話中的文件的共享容器的標識符。cookie
waitsForConnectivity
:一個布爾值,指示會話是否應等待鏈接變爲可用或者當即失敗網絡
Cookie
政策httpCookieAcceptPolicy
:決定什麼時候應該接受Cookie的策略常量session
httpShouldSetCookies
:一個布爾值,用於肯定請求是否應包含來自Cookie存儲的Cookie。
httpCookieStorage
:管理cookie存儲的單一對象(共享實例)
HTTPCookie
:表示HTTP cookie的對象。它是一個不可變的對象,從包含cookie屬性的字典中初始化
tlsMaximumSupportedProtocol
:在此會話中進行鏈接時客戶端應請求的最大TLS協議版本。
tlsMinimumSupportedProtocol
:協議協商期間應該接受的最小TLS協議。
urlCredentialStorage
:提供身份驗證憑據的憑證存儲
urlCache
:用於向會話中的請求提供緩存響應的URL緩存
requestCachePolicy
:一個預約義常量,用於肯定什麼時候從緩存中返回響應
sessionSendsLaunchEvents
:一個布爾值,指示在傳輸完成時是否應該在後臺繼續或啓動應用程序
isDiscretionary
:一個布爾值,用於肯定是否能夠根據系統的判斷來調度後臺任務以得到最佳性能。
protocolClasses
:在會話中處理請求的額外協議子類的數組
URLProtocol
:一個NSURLProtocol對象處理加載協議特定的URL數據。在NSURLProtocol類自己是一個抽象類,能夠爲與特定URL方案的URL處理基礎設施。您能夠爲您的應用支持的任何自定義協議或URL方案建立子類
multipathServiceType
:指定用於經過Wi-Fi和蜂窩接口傳輸數據的多路徑TCP鏈接策略的服務類型
URLSessionConfiguration.MultipathServiceType
:指定多路徑TCP使用的服務類型的常量
httpMaximumConnectionsPerHost
:同時鏈接到給定主機的最大數量。
httpShouldUsePipelining
:一個布爾值,用於肯定會話是否應使用HTTP流水線
connectionProxyDictionary
:包含有關在此會話中使用的代理信息的字典
waitsForConnectivity
:一個布爾值,指示會話是否應等待鏈接變爲可用或者當即失敗。NSURLRequestUseProtocolCachePolicy = 0
: 默認緩存策略 若是一個NSCachedURLResponse對於請求並不存在,數據將會從源端獲取。若是請求擁有一個緩存的響應,那麼URL加載系統會檢查這個響應來決定,若是它指定內容必須從新生效的話。假如內容必須從新生效,將創建一個連向源端的鏈接來查看內容是否發生變化。假如內容沒有變化,那麼響應就從本地緩存返回數據。若是內容變化了,那麼數據將從源端獲取
NSURLRequestReloadIgnoringLocalCacheData = 1
:URL應該加載源端數據,不使用本地緩存數據
NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4
:本地緩存數據、代理和其餘中介都要忽視他們的緩存,直接加載源數據 NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData
NSURLRequestReturnCacheDataElseLoad = 2
:指定已存的緩存數據應該用來響應請求,無論它的生命時長和過時時間。若是在緩存中沒有已存數據來響應請求的話,數據從源端加載
NSURLRequestReturnCacheDataDontLoad = 3
:指定已存的緩存數據用來知足請求,無論生命時長和過時時間。若是在緩存中沒有已存數據來響應URL加載請求的話,不去嘗試從源段加載數據,此時認爲加載請求失敗。這個常量指定了一個相似於離線模式的行爲
NSURLRequestReloadRevalidatingCacheData = 5
:指定若是已存的緩存數據被提供它的源段確認爲有效則容許使用緩存數據響應請求,不然從源段加載數據。