Alamofire-URLSession介紹

一.URLSesstion

  • 基本用法
        URLSession.shared.dataTask(with: url) { (data, response, error) in
            if error == nil {
                print("請求成功\(String(describing: response))" )
            }
        }.resume()

創(chuàng)建session會話對象
創(chuàng)建dataTask網(wǎng)絡(luò)任務(wù)
開啟resume任務(wù)

二. 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是最常用的默認(rèn)模式庵楷,該模式下系統(tǒng)會創(chuàng)建一個持久化的緩存仔涩,同時將證書存儲在用戶的鑰匙串中
  • ephemeral除了沒有存儲外误趴,和default差不多
  • background后臺運行模式虐译,可以使APP在沒運行的時候均澳,通過調(diào)用backgroundSessionConfiguration(_:),實現(xiàn)上傳和下載
  • 下載任務(wù)示例:
        let configuration = URLSessionConfiguration.background(withIdentifier: self.createID())

        let session = URLSession.init(configuration: configuration, delegate: self, delegateQueue: OperationQueue.main)
        
        session.downloadTask(with: url).resume()
  • 下載任務(wù)主要由兩個代理方法,下載完成和下載進度
    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")
    }
  • 要想實現(xiàn)后臺下載,還需以下兩個步驟:
    1. 開啟后臺下載權(quán)限
      //用于保存后臺下載的completionHandler
      var backgroundSessionCompletionHandler: (() -> Void)?
      
      func application(_ application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: @escaping () -> Void) {
          self.backgroundSessionCompletionHandler = completionHandler
      }
    
    1. 調(diào)用系統(tǒng)回調(diào)宴偿,更新屏幕
      func urlSessionDidFinishEvents(forBackgroundURLSession session: URLSession) {
          print("后臺任務(wù)下載回來")
          DispatchQueue.main.async {
              guard let appDelegate = UIApplication.shared.delegate as? AppDelegate, let backgroundHandle = appDelegate.backgroundSessionCompletionHandler else { return }
              backgroundHandle()
          }
      }
    
2.常規(guī)屬性
  • identifier:配置對象的后臺會話標(biāo)識符含长。

  • httpAdditionalHeaders:與請求一起發(fā)送的附加頭文件的字典。

  • networkServiceType:網(wǎng)絡(luò)服務(wù)的類型

  • allowsCellularAccess:布爾值畔规,是否允許蜂窩網(wǎng)絡(luò)連接局扶。

  • timeoutIntervalForRequest:等待其他數(shù)據(jù)時使用的超時間隔。

  • timeoutIntervalForResource:資源請求應(yīng)該允許的最大時間量叁扫。

  • sharedContainerIdentifier:應(yīng)該下載后臺URL會話中的文件的共享容器的標(biāo)識符详民。

  • waitsForConnectivity:一個布爾值,指示會話是否應(yīng)等待連接變?yōu)榭捎没蛘吡⒓词?/p>

3. 設(shè)置Cookie政策
  • httpCookieAcceptPolicy:決定何時應(yīng)該接受Cookie的策略常量

  • httpShouldSetCookies:一個布爾值陌兑,用于確定請求是否應(yīng)包含來自Cookie存儲的Cookie。

  • httpCookieStorage:管理cookie存儲的單一對象(共享實例)

  • HTTPCookie:表示HTTP cookie的對象由捎。它是一個不可變的對象兔综,從包含cookie屬性的字典中初始化

4. 設(shè)置安全策略
  • tlsMaximumSupportedProtocol:在此會話中進行連接時客戶端應(yīng)請求的最大TLS協(xié)議版本。

  • tlsMinimumSupportedProtocol:協(xié)議協(xié)商期間應(yīng)該接受的最小TLS協(xié)議狞玛。

  • urlCredentialStorage:提供身份驗證憑據(jù)的憑證存儲

5. 設(shè)置緩存策略
  • urlCache:用于向會話中的請求提供緩存響應(yīng)的URL緩存

  • requestCachePolicy:一個預(yù)定義常量软驰,用于確定何時從緩存中返回響應(yīng)

6. 支持后臺轉(zhuǎn)移
  • sessionSendsLaunchEvents:一個布爾值,指示在傳輸完成時是否應(yīng)該在后臺繼續(xù)或啟動應(yīng)用程序

  • isDiscretionary:一個布爾值心肪,用于確定是否可以根據(jù)系統(tǒng)的判斷來調(diào)度后臺任務(wù)以獲得最佳性能锭亏。

7. 支持自定義協(xié)議
  • protocolClasses:在會話中處理請求的額外協(xié)議子類的數(shù)組

  • URLProtocol:一個NSURLProtocol對象處理加載協(xié)議特定的URL數(shù)據(jù)。在NSURLProtocol類本身是一個抽象類硬鞍,可以為與特定URL方案的URL處理基礎(chǔ)設(shè)施慧瘤。您可以為您的應(yīng)用支持的任何自定義協(xié)議或URL方案創(chuàng)建子類

8. 支持多路徑TCP
  • multipathServiceType:指定用于通過Wi-Fi和蜂窩接口傳輸數(shù)據(jù)的多路徑TCP連接策略的服務(wù)類型

  • URLSessionConfiguration.MultipathServiceType:指定多路徑TCP使用的服務(wù)類型的常量

9. 設(shè)置HTTP策略和代理屬性
  • httpMaximumConnectionsPerHost:同時連接到給定主機的最大數(shù)量。

  • httpShouldUsePipelining:一個布爾值固该,用于確定會話是否應(yīng)使用HTTP流水線

  • connectionProxyDictionary:包含有關(guān)在此會話中使用的代理信息的字典

10. 支持連接變化
  • waitsForConnectivity:一個布爾值锅减,指示會話是否應(yīng)等待連接變?yōu)榭捎没蛘吡⒓词 ?/li>

三.NSURLRequestCachePolicy

  • NSURLRequestUseProtocolCachePolicy = 0: 默認(rèn)緩存策略
    如果一個NSCachedURLResponse對于請求并不存在,數(shù)據(jù)將會從源端獲取伐坏。如果請求擁有一個緩存的響應(yīng)怔匣,那么URL加載系統(tǒng)會檢查這個響應(yīng)來決定,如果它指定內(nèi)容必須重新生效的話桦沉。假如內(nèi)容必須重新生效每瞒,將建立一個連向源端的連接來查看內(nèi)容是否發(fā)生變化金闽。假如內(nèi)容沒有變化,那么響應(yīng)就從本地緩存返回數(shù)據(jù)剿骨。如果內(nèi)容變化了代芜,那么數(shù)據(jù)將從源端獲取

  • NSURLRequestReloadIgnoringLocalCacheData = 1:URL應(yīng)該加載源端數(shù)據(jù),不使用本地緩存數(shù)據(jù)

  • NSURLRequestReloadIgnoringLocalAndRemoteCacheData =4:本地緩存數(shù)據(jù)懦砂、代理和其他中介都要忽視他們的緩存蜒犯,直接加載源數(shù)據(jù)
    NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData

  • NSURLRequestReturnCacheDataElseLoad = 2:指定已存的緩存數(shù)據(jù)應(yīng)該用來響應(yīng)請求,不管它的生命時長和過期時間荞膘。如果在緩存中沒有已存數(shù)據(jù)來響應(yīng)請求的話罚随,數(shù)據(jù)從源端加載

  • NSURLRequestReturnCacheDataDontLoad = 3:指定已存的緩存數(shù)據(jù)用來滿足請求,不管生命時長和過期時間羽资。如果在緩存中沒有已存數(shù)據(jù)來響應(yīng)URL加載請求的話淘菩,不去嘗試從源段加載數(shù)據(jù),此時認(rèn)為加載請求失敗屠升。這個常量指定了一個類似于離線模式的行為

  • NSURLRequestReloadRevalidatingCacheData = 5:指定如果已存的緩存數(shù)據(jù)被提供它的源段確認(rèn)為有效則允許使用緩存數(shù)據(jù)響應(yīng)請求凝化,否則從源段加載數(shù)據(jù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末偏陪,一起剝皮案震驚了整個濱河市铡恕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脏答,老刑警劉巖糕殉,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異殖告,居然都是意外死亡阿蝶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門黄绩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羡洁,“玉大人,你說我怎么就攤上這事爽丹≈螅” “怎么了?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵习劫,是天一觀的道長咆瘟。 經(jīng)常有香客問我,道長诽里,這世上最難降的妖魔是什么袒餐? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上灸眼,老公的妹妹穿的比我還像新娘卧檐。我一直安慰自己,他們只是感情好焰宣,可當(dāng)我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布霉囚。 她就那樣靜靜地躺著,像睡著了一般匕积。 火紅的嫁衣襯著肌膚如雪盈罐。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天闪唆,我揣著相機與錄音盅粪,去河邊找鬼。 笑死悄蕾,一個胖子當(dāng)著我的面吹牛票顾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帆调,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼奠骄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了番刊?” 一聲冷哼從身側(cè)響起含鳞,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芹务,沒想到半個月后民晒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡锄禽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了靴姿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沃但。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖佛吓,靈堂內(nèi)的尸體忽然破棺而出宵晚,到底是詐尸還是另有隱情,我是刑警寧澤维雇,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布淤刃,位于F島的核電站,受9級特大地震影響吱型,放射性物質(zhì)發(fā)生泄漏逸贾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铝侵。 院中可真熱鬧灼伤,春花似錦、人聲如沸咪鲜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疟丙。三九已至颖侄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間享郊,已是汗流浹背览祖。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拂蝎,地道東北人穴墅。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像温自,于是被迫代替她去往敵國和親玄货。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內(nèi)容