URL Loading System 概覽

URL Loading System 是一系列用來訪問經過 URL 來定位的資源的類和協議。這項技術的核心在於基於 NSURL 這個類來訪問資源,除了加載 URL 的類 NSURLSession 以外,咱們把其餘相關輔助類分爲 5 類(如圖所示):html

  • 協議支持(protocol support)
  • 認證和證書(authentication and credentials)
  • cookie 存儲(cookie storage)
  • 請求配置(configuration management)
  • 緩存管理(cache management)

值得一提的是,iOS 7 之前的 Legacy URL Loading System 是一套基於 NSURLConnection 的體系。ios

1、URL 加載

URL Loading System 最經常使用的類就是根據 URL 請求數據的類 NSURLSessiongit

NSURLSession 的 API 支持三種類型的 session:github

  • Default sessions:其行爲跟 Foundation 中提供的其餘 URL 加載方式相似,支持磁盤緩存,而且會把憑證(credentials)保存到 keychain 中。
  • Ephemeral sessions:不會存儲任何數據到磁盤上,全部的緩存、憑證都只會隨着 session 保存在內存中,並且一旦這個 session 被清除了,這些緩存同時也會被清除。
  • Background sessions:跟 default sessions 的行爲基本相似,可是還支持後臺駐留進程的數據傳輸,也就是說,當 app 被掛起時,還能夠在後臺繼續傳輸數據。

基於 NSURLSession,咱們能夠建立 3 種類型的 URL 加載任務:web

  • Data tasks:發送和接收 NSData 形式的數據。Data tasks 主要用來發送短暫的、有交互性的請求。Data tasks 能夠分次返回數據,也能夠一次性返回全部的數據。
  • Download tasks:獲取文件形式的數據,下載文件到本地,支持後臺下載。
  • Upload tasks:以文件的形式發送數據給服務器,也支持後臺下載。

2、輔助類

1.URL 請求編程

URL Loading System 中的 NSURLRequest 將 URL 和請求協議相關的屬性封裝了起來。api

支持 HTTP 協議的 NSURLRequest/NSMutableURLRequest 類的就包括讀取/設置請求方式、請求體、請求頭等屬性的方法。緩存

2.響應安全

服務器返回的數據通常包括兩部分:服務器

  • 描述內容數據的元數據:描述內容數據的元數據每每是請求協議定義的,大部分協議的元數據包括 MIME type、 expected content length、text encoding (where applicable)以及這個響應對應的 URL。
  • 內容數據自己:也就是要請求的數據

URL Loading System 中 NSURLResponse 的做用就是將元數據和內容數據自己封裝起來。

3、重定向(改變請求)

有些協議,好比 HTTP,提供了一種重定向機制:當你發起一個請求時,而你請求的資源的 URL 已經發生改變了,服務器就會告訴客戶端你請求的資源已經被轉移到了新的 URL。

咱們能夠經過實現相關的代理方法 URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:,來攔截重定向事件,並決定是否須要重定向到新的地址。

4、權限認證

有些服務器會對某些特定的內容限制訪問權限,只對提供了信任證書經過認證的用戶提供訪問資格。對於 web 服務器來講,受保護的內容被彙集到一個須要憑證才能訪問的區域。在客戶端上,有時也須要根據憑證來肯定是否信任要訪問的服務器。

URL Loading System 提供了封裝憑證(credentials)、封裝保護區域(protected areas)和保存安全憑證(secure credential)的類:

  • NSURLCredential:封裝一個含有認證信息(好比用戶名和密碼等)和持久化存儲行爲的憑證(credential)。
  • NSURLProtectionSpace:服務器上某個須要憑證才能訪問的區域。
  • NSURLCredentialStorage:管理憑證的存儲以及 NSURLCredential 和相應的 NSURLProtectionSpace 之間的映射關係。
  • NSURLAuthenticationChallenge:在客戶端向有限制訪問權限的服務器發起請求時,服務器會詢問憑證信息,包括憑證、保護空間、認證錯誤信息、認證響應等。這個類會將這些信息封裝起來。NSURLAuthenticationChallenge 實例一般被 NSURLProtocol 子類用來通知 URL Loading System 須要認證,以及在 NSURLSession 的代理方法中用來處理認證。

5、緩存管理

URL Loading System 提供了 app 級別的 HTTP 響應緩存,在使用 NSURLSession 發起請求時,咱們能夠經過設置 NSURLRequestNSURLSessionConfiguration 的緩存策略(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 請求的緩存機制流程圖(來源):

6、cookie 存儲

URL Loading System 提供了 app 級別的 cookie 存儲機制。URL Loading System 中涉及到 cookie 操做的兩個類分別是:

  • NSHTTPCookieStorage:這個類提供了管理 cookie 存儲的功能。
  • NSHTTPCookie:用來封裝 cookie 數據和屬性的類。

NSURLRequest 提供了 HTTPShouldHandleCookies 屬性來設置請求發起時,是否須要 cookie manager 自動處理 cookie。在 UIWebView 中,系統會經過 cookie manager 自動將 cookie 緩存起來。

7、協議支持

URL Loading System 自己只支持 http、https、file、ftp 和 data 協議。NSURLProtocol 是一個抽象類,提供了處理 URL 加載的基礎設施。經過實現自定義的 NSURLProtocol 子類,可讓咱們的 app 支持自定義的數據傳輸協議。

另外,對於 NSURLProtocol 核心功能,官方文檔中並無着重提到,可是倒是最重要的一點:藉助它,你沒必要改動應用在網絡調用上的其餘部分,就能夠改變 URL 加載行爲的所有細節。運用這一點,咱們能夠自由發揮,作不少想作的事情,好比:

小結

URL Loading System 涵蓋了 iOS 網絡編程的方方面面,經過以上的梳理,相信咱們已經對 iOS 網絡編程有了一個總體的瞭解。

參考:

相關文章
相關標籤/搜索