URL Loading System 是一系列用來訪問經過 URL 來定位的資源的類和協議。這項技術的核心在於基於 NSURL
這個類來訪問資源,除了加載 URL 的類 NSURLSession
以外,咱們把其餘相關輔助類分爲 5 類(如圖所示):html
值得一提的是,iOS 7 之前的 Legacy URL Loading System 是一套基於
NSURLConnection
的體系。ios
URL Loading System 最經常使用的類就是根據 URL 請求數據的類 NSURLSession
。git
NSURLSession
的 API 支持三種類型的 session:github
基於 NSURLSession
,咱們能夠建立 3 種類型的 URL 加載任務:web
NSData
形式的數據。Data tasks 主要用來發送短暫的、有交互性的請求。Data tasks 能夠分次返回數據,也能夠一次性返回全部的數據。1.URL 請求編程
URL Loading System 中的 NSURLRequest
將 URL 和請求協議相關的屬性封裝了起來。api
支持 HTTP 協議的 NSURLRequest
/NSMutableURLRequest
類的就包括讀取/設置請求方式、請求體、請求頭等屬性的方法。緩存
2.響應安全
服務器返回的數據通常包括兩部分:服務器
URL Loading System 中 NSURLResponse
的做用就是將元數據和內容數據自己封裝起來。
有些協議,好比 HTTP,提供了一種重定向機制:當你發起一個請求時,而你請求的資源的 URL 已經發生改變了,服務器就會告訴客戶端你請求的資源已經被轉移到了新的 URL。
咱們能夠經過實現相關的代理方法 URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:
,來攔截重定向事件,並決定是否須要重定向到新的地址。
有些服務器會對某些特定的內容限制訪問權限,只對提供了信任證書經過認證的用戶提供訪問資格。對於 web 服務器來講,受保護的內容被彙集到一個須要憑證才能訪問的區域。在客戶端上,有時也須要根據憑證來肯定是否信任要訪問的服務器。
URL Loading System 提供了封裝憑證(credentials)、封裝保護區域(protected areas)和保存安全憑證(secure credential)的類:
NSURLCredential
:封裝一個含有認證信息(好比用戶名和密碼等)和持久化存儲行爲的憑證(credential)。NSURLProtectionSpace
:服務器上某個須要憑證才能訪問的區域。NSURLCredentialStorage
:管理憑證的存儲以及 NSURLCredential
和相應的 NSURLProtectionSpace
之間的映射關係。NSURLAuthenticationChallenge
:在客戶端向有限制訪問權限的服務器發起請求時,服務器會詢問憑證信息,包括憑證、保護空間、認證錯誤信息、認證響應等。這個類會將這些信息封裝起來。NSURLAuthenticationChallenge
實例一般被 NSURLProtocol
子類用來通知 URL Loading System 須要認證,以及在 NSURLSession
的代理方法中用來處理認證。URL Loading System 提供了 app 級別的 HTTP 響應緩存,在使用 NSURLSession
發起請求時,咱們能夠經過設置 NSURLRequest
和 NSURLSessionConfiguration
的緩存策略(cache policy)來決定是否緩存以及如何處理緩存。同時,咱們還能夠經過實現 URLSession:dataTask:willCacheResponse:completionHandler:
方法來針對特定的 URL 設置緩存策略。
實際上,不是全部請求的響應都能被緩存起來,URL Loading System 目前只支持對 http 和 https 請求的響應進行緩存。
URL Loading System 中提供的管理緩存的類有如下兩個:
NSURLCache
:經過這個類能夠設置緩存大小和位置,以及讀取和存儲各個請求的 NSCachedURLResponse
。NSCachedURLResponse
:封裝了請求元數據(一個 NSURLResponse
對象)和實際響應內容(一個 NSData
對象)。NSURLRequest
默認的 cache policy 是 NSURLRequestUseProtocolCachePolicy
,下圖就是一個採用了 NSURLRequestUseProtocolCachePolicy
的 HTTP 請求的緩存機制流程圖(來源):
URL Loading System 提供了 app 級別的 cookie 存儲機制。URL Loading System 中涉及到 cookie 操做的兩個類分別是:
NSHTTPCookieStorage
:這個類提供了管理 cookie 存儲的功能。NSHTTPCookie
:用來封裝 cookie 數據和屬性的類。NSURLRequest
提供了 HTTPShouldHandleCookies
屬性來設置請求發起時,是否須要 cookie manager 自動處理 cookie。在 UIWebView
中,系統會經過 cookie manager 自動將 cookie 緩存起來。
URL Loading System 自己只支持 http、https、file、ftp 和 data 協議。NSURLProtocol
是一個抽象類,提供了處理 URL 加載的基礎設施。經過實現自定義的 NSURLProtocol
子類,可讓咱們的 app 支持自定義的數據傳輸協議。
另外,對於 NSURLProtocol
核心功能,官方文檔中並無着重提到,可是倒是最重要的一點:藉助它,你沒必要改動應用在網絡調用上的其餘部分,就能夠改變 URL 加載行爲的所有細節。運用這一點,咱們能夠自由發揮,作不少想作的事情,好比:
URL Loading System 涵蓋了 iOS 網絡編程的方方面面,經過以上的梳理,相信咱們已經對 iOS 網絡編程有了一個總體的瞭解。