簡述
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
存儲、配置管理以及緩存管理。
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 type
和content 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加載系統提供了一個復合的磁盤和內存緩存,減少了應用程序對網絡連接的依賴性,并為先前緩存的響應提供更快的往返時間。緩存基于每個應用程序存儲。根據由NSURLRequest和NSURLSessionConfiguration對象指定的緩存策略,NSURLSession查詢緩存。NSURLCache類提供了配置緩存大小及其在磁盤上的位置的方法。它還提供了管理包含緩存響應的NSCachedURLResponse對象的集合的方法。NSCachedURLResponse
對象封裝了NSURLResponse對象和URL
內容數據。NSCachedURLResponse
還提供了一個用戶信息字典(dictionary
),您的應用程序可用于緩存任何自定義數據。并非所有協議實現都支持響應緩存。 目前只有http
和https
請求可以緩存。NSURLSession對象可以通過實現URLSession:dataTask:willCacheResponse:completionHandler:delegate方法來控制是否緩存響應以及響應是否應僅緩存在內存中。
Cookie存儲
由于HTTP
協議的無狀態性,客戶端經常使用cookie來提供跨URL
請求的數據的持久存儲。URL
加載系統提供了創建和管理Cookie
的接口,作為HTTP
請求的一部分發送cookies
,并在解譯Web服務器響應時接收cookie
。OS X
和iOS
提供了NSHTTPCookieStorage類,它們又提供用于管理NSHTTPCookie對象集合的接口。 在OS X
中,Cookie
存儲在所有應用程序之間共享; 在iOS中,Cookie只存儲是每個應用程序中。
相關章節:
Cookie
存儲
協議支持
URL加載系統本身支持http
,https
,file
,ftp
和數據協議。 然而,URL
加載系統還允許您的應用程序注冊自己的類以支持其他應用層網絡協議。 您還可以向URL
請求和URL
響應對象添加特定于協議的屬性。
相關章節:Cookies 和自定義協議
如何使用文檔
首先通過閱讀使用NSURLSession了解URL
加載系統的概述。 然后閱讀URL
會話的生命周期,詳細了解NSURLSession
如何與其代理進行交互。 有關URL加載系統的其他方面的更多信息,請參見以下章節:
- 編碼URL數據解釋了如何編碼任意字符串,使其安全地用于URL
- 處理重定向和其他請求更改描述了您對URL請求的更改進行響應的選項。
- 身份驗證挑戰和TLS鏈驗證描述了對安全服務器進行身份驗證的過程。
- 理解緩存訪問描述了在請求期間連接如何使用緩存。
-
Cookies
和定制協議解釋了可用于管理Cookie
存儲和支持自定義應用層協議的類。