iOS之URL加載系統(ios開發文檔簡譯)

簡述

URL加載系統是讓你的app通過相應的URL加載對應內容的類-classes和協議-protocols的集合。其中,核心的技術是NSURL類,NSURL類能夠讓你的app操縱你的URLs和它所對應的資源。為了支持URL類,Foundation框架提供了豐富的類讓你去加載一個URL、上傳數據、管理cookie存儲、控制response緩存、處理證書存儲和授權以及自定義協議擴展。

URL加載系統支持以下協議獲取資源

  • 文件傳輸協議:ftp://
  • 超文本傳輸協議:http://
  • 安全套接字層超文本傳輸協議:https://
  • 本地文本傳輸協議:file:///
  • Data URLs data://
    很明顯,URL加載系統也可以通過使用用戶的系統偏好設置支持代理服務器和SOCKS網關。
重要指出:在蘋果平臺上,被稱作“App Transport Security (ATS)”的網絡安全特性在默認情況下同樣適用于app和app extensions。它通過使用行業標準協議和無已知弱點計算方式提高了隱私和數據的安全性。

提示:除了URL加載系統,OS X和iOS還提供了一些開啟其他應用程序URLs的APIs,比如說Safari,這些APIs在本文檔不做詳述

一覽表

URL加載系統包括加載URLs的類以及許多和這些類一起起作用的一些重要的輔助類,它們共同去修改系統行為。主要的輔助類分為以下五類,分別是:協議支持、授權和證書、cookie存儲、配置管理以及緩存管理。

1-1.png

URL加載

URL加載系統中,最常用的是從一個URL所對應的地址獲取資源。你可以用NSURLSession獲取內容。而所使用的方法主要依賴于你是想把數據緩存還是想把數據儲到硬盤上。

Data方式獲取數據(緩存)

在較高層面(非底層)而言,下載一個URL所對應的文件內容有兩種基本方式

  • 1 對于簡單的請求,利用NSURLSession直接從一個NSURL請求內容,或者從本地硬盤上獲取對應的NSData或者文件(file) (這里相當于請求本地數據)
  • 2 對于復雜的上傳數據請求,例如,我們可以為NSURLSession提供NSURLRequest對象(或者它的子類NSMutableURLRequest

無論你選擇哪種方式,你的app獲取返回數據的方式只有兩種:

  • 1 提供一個完成處理的block,當從服務器獲取數據后,URL加載類去調用這個block
  • 2 提供一個自定義代理方法,當從服務器接受到元數據后,URL加載類會周期性的調用這個代理方法。如果需要,你的app可以拼接返回的數據

相關章節:使用NSURLSession

除了數據本身外,URL加載類還為代理或者block提供了包裝了元數據的請求返回值,比如MIME typecontent length

以文件file的形式下載內容

在高層面上,有兩個基本方法可以下載一個URL對應的內容。

  • 1 對于簡單的請求,用NSURLSession API直接從一個NSURL對象請求內容,或者從本地硬盤上獲取對應的NSData或者文件(file)
  • 2 對于更加復雜的請求,如上傳請求,可以為NSURLSession提供NSURLRequest對象(或者它的子類NSMutableURLRequest)

提示:通過NSURLSession實例對象初始化的下載不會進行緩存。如果你需要對結果進行緩存,你的app需要使用NSURLSession寫數據到磁盤上。
相關章節:使用NSURLSession

輔助類(Helper Classes)

URL加載類用了兩個提供元數據的輔助類,一個是用于請求自身的(NSURLRequest),一個是用于服務器相應的(NSURLResponse

1.URL請求(URL Requests)

一個NSURLRequest對象以獨立于協議的方式包裝了一個URL和協議指定的所有屬性(properties)。

提示:當客戶端app使用NSMutableURLRequest初始化一個連接或下載時,就會產生一個請求(request)的深拷貝。在下載對象初始化后,再改變這個request對于下載操作不會產生影響。

一些協議支持協議指定屬性,例如,HTTP協議將方法添加到NSURLRequest上,返回HTTP的請求體,請求頭和傳輸方法。它也可以添加到NSMutableURLRequest上設置那些值。關于使用URL對象的細節介紹都在本書闡述了。

2. 響應元數據(Response Metadata

服務器的響應可視為兩部分:元數據描述的內容和數據本身的內容。對于大多數協議,元數據都是由NSURLResponse類包裝(或封裝)的。包含MIME類型,預期的content length,text encoding以及響應的URL。指定協議的NSURLResponse的子類可以提供額外的元數據。例如 NSHTTPURLResponse可以儲存web服務器返回的請求頭和狀態碼。

重要信息:只有響應的元數據存儲在NSURLResponse對象中。各種URL加載類提供自身的響應數據給你的app,要么通過block回調,要么通過代理。一個NSCachedURLResponse實例封裝了一個NSURLResponse對象、URL內容數據(URL content data)以及一些你的app提供的額外信息。更詳細的,可以看下面的緩存管理

重定向和其他的請求改變(Redirection and Other Request Changes

一些協議(例如HTTP)為服務器提供了一種告訴您的應用程序內容已轉移到其他URL的方法。 URL加載類可以在發生這種情況時通知他們的代理。 如果您的應用程序提供了適當的委托方法,您的應用程序可以決定是否遵循重定向,從重定向返回響應正文,或返回錯誤。

相關章節:處理重定向以及其他的請求變化

認證和證書(Authentication and Credentials

一些服務器對某些內容的獲取是有限制的,它需要用戶提供一些認證信息——一個客戶端證書、用戶的姓名、密碼等等進行認證。就web服務器而言,限制內容被分成一塊一塊,每一塊都需要單獨的一套認證信息(credentials)。認證信息,尤其是證書也是用來確定是否可以信任另一方的——去評估你的app是否可以信任服務器。
URL加載系統提供了一些類,包括model credentials,保護區域(protected areas)和安全證書持久化(secure credential persistence)。您的應用可以指定這些證書(憑據)在應用啟動期間持續存在,也可以永久保存在用戶的鑰匙串中。

提示:以持久化的方式存儲認證信息,認證信息會存儲在用戶的鑰匙鏈中(keychain),并且所有的app可以共享。

NSURLCredential類封裝了一個包含用戶認證信息(例如,用戶姓名和密碼)和持久性行為的證書。NSURLProtectionSpace類表示需要特定憑據的區域,一個保護空間可以限制在一個URL上,一個保護空間包含一個web服務器上的區域或指一個代理服務器(A protection space can be limited to a single URL, encompass a realm on a web server, or refer to a proxy)。一個NSURLCredentialStorage對象管理一個會話的證書(credential)存儲并且提供'NSURLCredential'對象到其提供身份驗證的相應'NSURLProtectionSpace'對象的映射。只有驗證挑戰(authentication challenge)成功,才會存儲證書。NSURLAuthenticationChallenge類封裝了一個認證請求的NSURLProtocol實現所需要的信息:一個建議的憑證,涉及的保護空間,用協議確定需要驗證的錯誤或響應以及嘗試認證的次數。NSURLAuthenticationChallenge實例還指定了開啟認證的的對象。初始化對象,也稱為發送者,必須符合NSURLAuthenticationChallengeSender協議。NSURLProtocol的子類需要用NSURLAuthenticationChallenge實例告知URL加載系統需要身份認證。他們也為NSURLSession代理方法提供了自定義認證處理。

相關章節:身份驗證挑戰和TLS鏈的認證(Authentication Challenges and TLS Chain Validation)

緩存管理(Cache Management

URL加載系統提供了一個復合的磁盤和內存緩存,減少了應用程序對網絡連接的依賴性,并為先前緩存的響應提供更快的往返時間。緩存基于每個應用程序存儲。根據由NSURLRequestNSURLSessionConfiguration對象指定的緩存策略,NSURLSession查詢緩存。NSURLCache類提供了配置緩存大小及其在磁盤上的位置的方法。它還提供了管理包含緩存響應的NSCachedURLResponse對象的集合的方法。NSCachedURLResponse對象封裝了NSURLResponse對象和URL內容數據。NSCachedURLResponse還提供了一個用戶信息字典(dictionary),您的應用程序可用于緩存任何自定義數據。并非所有協議實現都支持響應緩存。 目前只有httphttps請求可以緩存。NSURLSession對象可以通過實現URLSession:dataTask:willCacheResponse:completionHandler:delegate方法來控制是否緩存響應以及響應是否應僅緩存在內存中。

相關章節:理解緩存的訪問(Understanding Cache Access)

Cookie存儲

由于HTTP協議的無狀態性,客戶端經常使用cookie來提供跨URL請求的數據的持久存儲。URL加載系統提供了創建和管理Cookie的接口,作為HTTP請求的一部分發送cookies,并在解譯Web服務器響應時接收cookieOS XiOS提供了NSHTTPCookieStorage類,它們又提供用于管理NSHTTPCookie對象集合的接口。 在OS X中,Cookie存儲在所有應用程序之間共享; 在iOS中,Cookie只存儲是每個應用程序中。

相關章節:Cookie存儲

協議支持

URL加載系統本身支持httphttpsfileftp和數據協議。 然而,URL加載系統還允許您的應用程序注冊自己的類以支持其他應用層網絡協議。 您還可以向URL請求和URL響應對象添加特定于協議的屬性。

相關章節:Cookies 和自定義協議

如何使用文檔

首先通過閱讀使用NSURLSession了解URL加載系統的概述。 然后閱讀URL會話的生命周期,詳細了解NSURLSession如何與其代理進行交互。 有關URL加載系統的其他方面的更多信息,請參見以下章節:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • iOS開發系列--網絡開發 概覽 大部分應用程序都或多或少會牽扯到網絡開發,例如說新浪微博、微信等,這些應用本身可...
    lichengjin閱讀 3,705評論 2 7
  • 本指南描述了Foundation框架的一些類,它們可用于與URL交互,也可以與使用標準網絡協議的服務器進行通信。這...
    raingu24閱讀 343評論 0 2
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 概覽 緩存組件應該說是每個客戶端程序必備的核心組件,試想對于每個界面的訪問都必須重新請求勢必降低用戶體驗。但是如何...
    默默_David閱讀 1,959評論 1 9
  • 原文地址:http://refined-x.com/2017/07/10/Hexo自定義頁面的方法/。 Hexo是...
    tower1229閱讀 2,511評論 1 2