前言:iOS開(kāi)發(fā)從業(yè)這幾年來(lái)都沒(méi)有好好總結(jié)下?,F(xiàn)在把知識(shí)梳理一下,助人助己~
NSURLSession講的是什么
學(xué)習(xí)NSURLSession時(shí)到底在學(xué)習(xí)什么?通常情況我們會(huì)從網(wǎng)上找一篇教程,拷一段簡(jiǎn)易代碼去執(zhí)行,比如:
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration];
NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.baidu.com"]];
[task resume];
但是為什么這么寫(xiě)?每個(gè)類(lèi)的作用是什么?想要深入探究時(shí),會(huì)發(fā)現(xiàn)繁多復(fù)雜的方法不知道如何開(kāi)始。有種老虎吃天的感覺(jué)。
慌亂后會(huì)發(fā)現(xiàn),NSURLSession就是客戶(hù)端如何與服務(wù)器交換數(shù)據(jù)。也就是客戶(hù)端如何生產(chǎn)數(shù)據(jù)、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)、處理服務(wù)器返回的數(shù)據(jù)。當(dāng)找到一個(gè)現(xiàn)實(shí)中的物理模型時(shí)就輕松多了。可以理解為NSURLSession是一個(gè)工廠(chǎng),它生產(chǎn)數(shù)據(jù)、發(fā)送數(shù)據(jù)、處理收到的數(shù)據(jù)。
NSURLConfiguration是工廠(chǎng)的設(shè)計(jì)圖,NSURLSession就是具體工廠(chǎng)。每個(gè)Session對(duì)象都要有一個(gè)Configuration設(shè)計(jì)圖來(lái)指導(dǎo)建成。工廠(chǎng)建成后就可以生產(chǎn)不同的產(chǎn)品,即NSURLSessionTask對(duì)象。當(dāng)然產(chǎn)品有多種,具體什么產(chǎn)品由當(dāng)時(shí)的業(yè)務(wù)決定。
NSURLSessionConfiguration
在發(fā)送請(qǐng)求前必須要?jiǎng)?chuàng)建一張NSURLSessionConfiguration作為“設(shè)計(jì)圖”。
創(chuàng)建NSURLSessionConfiguration
要?jiǎng)?chuàng)建一張“設(shè)計(jì)圖”,NSURLSessionConfiguration給我們了三個(gè)便捷的類(lèi)方法:
+defaultSessionConfiguration
創(chuàng)建一個(gè)標(biāo)準(zhǔn)的 configuration。這個(gè)配置與 NSURLConnection是一樣的,會(huì)共享NSHTTPCookieStorage、 NSURLCache和NSURLCredentialStorage。+ephemeralSessionConfiguration
創(chuàng)建一個(gè)不會(huì)對(duì)cache、cookie和證書(shū)進(jìn)行持久性的存儲(chǔ)的configuration。其功能就像chrome的無(wú)痕瀏覽。+backgroundSessionConfiguration:(NSString *)identifier
創(chuàng)建一個(gè)用于后臺(tái)session的configuration。后臺(tái) session可以在應(yīng)用程序掛起,甚至是退出或者崩潰的情況下運(yùn)行上傳和下載任務(wù)。初始化時(shí)指定的標(biāo)識(shí)符,被用于向任何可能在進(jìn)程外恢復(fù)后臺(tái)傳輸?shù)氖刈o(hù)進(jìn)程(daemon)提供上下文。
配置NSURLSessionConfiguration
NSURLSessionConfiguration共有22個(gè)屬性。cache、cookie和證書(shū)的相關(guān)屬性是我們經(jīng)常用到的,其他的暫不分析。
cookie策略
與cookie相關(guān)的有三個(gè)屬性,如下:
- HTTPCookieStorage
該屬性是一個(gè)NSHTTPCookieStorage對(duì)象,存儲(chǔ)所有經(jīng)過(guò)該session請(qǐng)求的cookie。默認(rèn)使用NSHTTPCookieShorage的+sharedHTTPCookieStorage 這個(gè)單例對(duì)象,也就是說(shuō)所有用該默認(rèn)配置的session其cookie是共享的。這與NSURLConnection是相同的。 - HTTPCookieAcceptPolicy
該屬性是一個(gè)NSHTTPCookieAcceptPolicy枚舉類(lèi)型。有三個(gè)可選值,決定了什么情況下接受從服務(wù)器發(fā)出的cookie。 - HTTPShouldSetCookies
該屬性是BOOL值,指定了請(qǐng)求是否應(yīng)該cookie。默認(rèn)是YES,如果設(shè)為NO,則需要用HTTPAdditionalHeaders或自定義的NSURLRequest來(lái)指定HTTP請(qǐng)求頭里的cookie字段。
緩存策略
與緩存相關(guān)的有兩個(gè)屬性,如下:
- URLCache
該屬性是一個(gè)NSURLCache對(duì)象,存儲(chǔ)經(jīng)過(guò)該session請(qǐng)求所使用的緩存。與cookie類(lèi)似,NSURLCache也有一個(gè)默認(rèn)的+sharedURLCache單例對(duì)象,默認(rèn)使用該單例對(duì)象。因此,默認(rèn)情況下所有session的cache是共享的。這與 NSURLConnection 是相同的。 - requestCachePolicy
該屬性是一個(gè)NSURLRequestCachePolicy枚舉類(lèi)型。指定通過(guò)該session的請(qǐng)求如何處理緩存,比如忽略本地緩存,或強(qiáng)制使用本地緩存等。NSURLRequest的-cachePolicy方法也會(huì)影響緩存,不過(guò)它只影響單個(gè)請(qǐng)求。
安全策略
- URLCredentialStorage
該屬性是一個(gè)NSURLCredentialStorage對(duì)象,存儲(chǔ)了經(jīng)過(guò)該session請(qǐng)求所使用的證書(shū)。與cookie和cache類(lèi)似,默認(rèn)情況下使用NSURLCredentialStorage的 +sharedCredentialStorage單例對(duì)象。 - TLSMaximumSupportedProtocol
該屬性是一個(gè)SSLProtocol枚舉類(lèi)型,決定SSL支持的最高版本 - TLSMinimumSupportedProtocol
與TLSMaximumSupportedProtocol類(lèi)似,該屬性決定SSL支持的最低版本
關(guān)于cookie、cache和證書(shū)相關(guān)的內(nèi)容會(huì)在后續(xù)文章中詳細(xì)說(shuō)明,比如URLCache對(duì)象或HTTPCookieStorage對(duì)象設(shè)置為nil會(huì)如何;NSURLRequest中也會(huì)影響這些屬性,哪個(gè)優(yōu)先級(jí)更高等問(wèn)題。