本指南描述了Foundation框架的一些類痊硕,它們可用于與URL交互咆槽,也可以與使用標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議的服務(wù)器進(jìn)行通信缸榛。這些類被統(tǒng)稱為URL加載系統(tǒng)按灶。
URL加載系統(tǒng)是一系列類和協(xié)議症革,它們允許app訪問URL指向的內(nèi)容。這個技術(shù)的核心就是NSURL類鸯旁,它讓app可以操作URL和它所指向的資源。
為了支持該類量蕊,F(xiàn)oundation框架提供了豐富的類铺罢,讓你可以加載URL的內(nèi)容、上傳數(shù)據(jù)到服務(wù)器残炮、管理cookie存儲韭赘、控制響應(yīng)緩存、處理證書存儲并以特定方式驗(yàn)證势就、以及編寫自定義的協(xié)議擴(kuò)展泉瞻。
URL加載系統(tǒng)提供對使用以下協(xié)議訪問資源的支持:
- File Transfer Protocol (ftp://)
- Hypertext Transfer Protocol (http://)
- Hypertext Transfer Protocol with encryption (https://)
- Local file URLs (file:///)
- Data URLs (data://)
當(dāng)然它還使用用戶系統(tǒng)首選項(xiàng)來支持代理服務(wù)器和SOCKS網(wǎng)關(guān)脉漏。
重要:在Apple平臺,有一個被稱為ATS(App Transport Security袖牙,應(yīng)用傳輸安全)的網(wǎng)絡(luò)安全功能侧巨,它可以用于應(yīng)用和應(yīng)用擴(kuò)展,默認(rèn)情況下它是開啟的鞭达。它通過確保app的網(wǎng)絡(luò)連接僅使用工業(yè)標(biāo)準(zhǔn)的協(xié)議司忱,以及使用無已知弱點(diǎn)的密碼,來提高隱私和數(shù)據(jù)完整性畴蹭。更多信息坦仍,參見NSAppTransportSecurity。
注意:除了URL加載系統(tǒng)之外叨襟,OS X和iOS提供了在其他應(yīng)用程序(例如Safari)中打開URL的API繁扎。這些API不在本文檔中描述。
更多關(guān)于在OS X中啟動服務(wù)器的信息糊闽,請閱讀Launch Services Programming Guide梳玫。
更多關(guān)于OS X中NSWorkSpace類的openURL:方法的信息,請閱讀NSWorkspace Class Reference墓怀。
更多關(guān)于iOS中UIApplication類的openURL:方法的信息月趟,請閱讀UIApplication Class Reference瑟枫。
概覽
URL加載系統(tǒng)包括很多類,這些類使用很多重要的輔助類來加載URL,而這些輔助類與那些URL加載類一起來使用可以改變它們的行為藏斩。主要的輔助類分為五大類:協(xié)議支持、驗(yàn)證和證書毁渗、cookie保存题暖、配置管理、以及緩存管理梆暮。
URL加載
在URL加載系統(tǒng)中最常用的是允許app從源中檢索URL的內(nèi)容服协。你可以使用NSURLSession來檢索內(nèi)容。你采用的具體方法很大程度上取決于你想把數(shù)據(jù)提取到內(nèi)存還是下載到磁盤啦粹。
提取內(nèi)容到內(nèi)存
在高層級偿荷,提取URL數(shù)據(jù)有兩種基本方法:
- 對于簡單的請求,使用NSURLSession API直接從NSURL對象中檢索內(nèi)容唠椭,結(jié)果可以是NSData對象跳纳,也可以是磁盤上的文件。
- 對于更加復(fù)雜的請求贪嫂,例如上傳數(shù)據(jù)的請求寺庄,要給NSURLSession提供一個NSURLRequest對象(或者它的可變子類,NSMutableURLRequest)。
無論你選擇哪種方法斗塘,你的app都可以以兩種方式來獲取響應(yīng)數(shù)據(jù):
- 提供完成處理程序代碼塊赢织。當(dāng)URL加載類從服務(wù)器接收數(shù)據(jù)完成之后,它調(diào)用這個代碼塊馍盟。
- 提供自定義委托于置。當(dāng)URL加載類從服務(wù)器接收到數(shù)據(jù)的時候調(diào)用自定義的委托方法。如有必要朽合,你的app負(fù)責(zé)累積這些數(shù)據(jù)俱两。
除了這些數(shù)據(jù)本身之外,URL加載類還把封裝的與請求相關(guān)的元數(shù)據(jù)(例如MIME類型以及內(nèi)容長度)曹步,提供給委托以及完成處理程序代碼塊宪彩。
相關(guān)章節(jié):Using NSURLSession。
把內(nèi)容下載為文件
在高級別上讲婚,有兩個基本的方法來把URL的內(nèi)容下載到文件:
- 對于簡單的請求尿孔,使用NSURLSession API直接從NSURL對象中檢索內(nèi)容,結(jié)果可以是NSData對象筹麸,也可以是磁盤上的文件活合。
- 對于更加復(fù)雜的請求,例如上傳數(shù)據(jù)的請求物赶,要給NSURLSession提供一個NSURLRequest對象(或者它的可變子類白指,NSMutableURLRequest)。
注意:通過NSURLSession實(shí)例啟動的下載不能緩存酵紫。如果你需要緩存結(jié)果告嘲,app必須在使用NSURLSession的同時,自己將數(shù)據(jù)寫入磁盤奖地。
相關(guān)章節(jié):Using NSURLSession
輔助類
URL加載類使用兩個輔助類來提供額外的元數(shù)據(jù)——一個是針對請求本身(NSURLRequest)橄唬、一個是針對服務(wù)器的響應(yīng)(NSURLResponse)。
URL請求
NSURLRequest對象會在一個獨(dú)立的協(xié)議管理器中封裝URL以及任何特定協(xié)議屬性参歹。
注意:當(dāng)客戶端app使用NSMutableURLRequest實(shí)例來啟動連接或下載時仰楚,會產(chǎn)生一個請求的深拷貝。在下載開始之后犬庇,改變初始請求對下載不會產(chǎn)生影響僧界。
一些協(xié)議支持特定的協(xié)議屬性。例如臭挽,HTTP協(xié)議添加一些方法到NSURLRequest捎泻,返回HTTP請求體、頭部埋哟、以及傳輸方法。它還添加了方法到NSMutableURLRequest,以便設(shè)置這些值赤赊。
響應(yīng)元數(shù)據(jù)
服務(wù)器對于請求的響應(yīng)可以通過兩種方式查看:元數(shù)據(jù)描述了內(nèi)容以及數(shù)據(jù)本身的內(nèi)容闯狱。大多數(shù)協(xié)議通常的元數(shù)據(jù)通過NSURLResponse類被封裝,它由MIME類型抛计、預(yù)期的內(nèi)容長度哄孤、文本編碼(如果適用)、以及提供響應(yīng)的URL組成吹截。NSURLResponse的協(xié)議特定子類瘦陈,可以提供額外的元數(shù)據(jù)。例如波俄,NSHTTPURLResponse web服務(wù)器返回的頭部和狀態(tài)嗎晨逝。
重要:只有響應(yīng)的元數(shù)據(jù)是存儲在NSURLResponse對象的。各種URL加載類提供給app的響應(yīng)數(shù)據(jù)懦铺,是通過完成處理程序代碼塊或者該對象的委托進(jìn)行的捉貌。
NSCachedURLResponse實(shí)例封裝NSURLResponse對象、URL內(nèi)容數(shù)據(jù)冬念、以及任何由app提供的額外數(shù)據(jù)趁窃。詳情參見 Cache Management。
本文檔介紹了使用URL響應(yīng)對象的詳細(xì)情況急前。
重定向和其他請求改變
一些協(xié)議醒陆,例如HTTP,為服務(wù)器提供一種方式來告訴app裆针,內(nèi)容已被移動到另一個URL上刨摩。當(dāng)內(nèi)容移動發(fā)生時,這個URL加載類可以通知他們的委托据块。如果app提供了合適的委托方法码邻,app就可以決定是否遵循重定向、從重定向處返回響應(yīng)體另假、或者返回一個錯誤像屋。
相關(guān)章節(jié):Handling Redirects and Other Request Changes
驗(yàn)證和證書
一些服務(wù)器對特定內(nèi)容限制訪問,要求用戶通過提供某種證書(客戶端證書边篮,用戶名和密碼等等)來進(jìn)行驗(yàn)證己莺,以此來獲取權(quán)限。在web服務(wù)器戈轿,限制內(nèi)容被分組為要求單獨(dú)證書系列的區(qū)域凌受,證書還經(jīng)常被用于確定重定向服務(wù)器是否可信。
URL加載系統(tǒng)提供制作證書模型以及提供安全的證書持久化保護(hù)區(qū)域的類思杯。你的app可以說明這些證書存儲于單一請求胜蛉、app啟動期間挠进、或者永久的在用戶的鑰匙串中。
注意:永久存儲的證書保存在用戶的鑰匙串中誊册,并在所有應(yīng)用中共享领突。
NSURLCredential類封裝一個包含驗(yàn)證信息(例如,用戶名和密碼)和持久化行為組成的證書案怯。NSURLProtectionSpace類表示需要特定證書的區(qū)域君旦。一個受保護(hù)空間可以限于一個URL、可以包含在web服務(wù)器的區(qū)域嘲碱、或者指向到一個代理金砍。
NSURLCredentialStorage對象管理會話的證書存儲,并提供NSURLCredential對象到對其提供身份驗(yàn)證的相關(guān)的 NSURLProtectionSpace對象的映射麦锯。只有在驗(yàn)證成功恕稠,證書才會被保存。
NSURLAuthenticationChallenge類封裝NSURLProtocol實(shí)現(xiàn)請求所需的信息來驗(yàn)證請求:建議的證書离咐、涉及的保護(hù)空間谱俭、用于決定驗(yàn)證要求的協(xié)議的錯誤或響應(yīng)、以及進(jìn)行驗(yàn)證的嘗試次數(shù)宵蛀。NSURLAuthenticationChallenge實(shí)例還指定初始化驗(yàn)證的對象昆著。被稱為發(fā)送方的初始化對象,必須符合NSURLAuthenticationChallengeSender協(xié)議术陶。
NSURLAuthenticationChallenge實(shí)例通過NSURLProtocol子類被用于通知需要驗(yàn)證的URL加載系統(tǒng)凑懂。它們還提供NSURLSession的委托方法,便于自定義認(rèn)證處理梧宫。
相關(guān)章節(jié):Authentication Challenges and TLS Chain Validation
緩存管理
URL加載系統(tǒng)提供一個磁盤和內(nèi)存復(fù)合的緩存接谨,它減少了app對于網(wǎng)絡(luò)連接的依賴,并且提供了更快的緩存響應(yīng)的周轉(zhuǎn)時間塘匣。緩存按每個app存儲脓豪。緩存依據(jù)緩存策略通過NSURLSession查詢,緩存策略是在初始化NSURLRequest 和 NSURLSessionConfiguration對象的時候被指定的忌卤。
NSURLCache類提供配置緩存尺寸以及在磁盤上的位置的方法扫夜。它還提供方法來管理NSCachedURLResponse對象的集合,該對象包含了緩存響應(yīng)驰徊。
NSCachedURLResponse對象封裝了NSURLResponse對象和URL內(nèi)容數(shù)據(jù)笤闯。NSCachedURLResponse還提供用戶信息字典,app可以使用該字典來緩存任何自定義數(shù)據(jù)棍厂。
不是所有的協(xié)議都支持響應(yīng)緩存】盼叮現(xiàn)在只有http 和 https請求可以被緩存。
NSURLSession對象通過URLSession:dataTask:willCacheResponse:completionHandler:委托方法來控制是否緩存響應(yīng)牺弹,以及是否僅將響應(yīng)緩存在內(nèi)存中浦马。
相關(guān)章節(jié):Understanding Cache Access
Cookie存儲
由于HTTP協(xié)議的無狀態(tài)时呀,客戶端經(jīng)常使用cookie來提供跨URL請求數(shù)據(jù)的持久化存儲。URL加載系統(tǒng)提供創(chuàng)建管理cookie的接口捐韩,可以把cookies作為HTTP請求的一部分進(jìn)行發(fā)送退唠,而在解析web服務(wù)器響應(yīng)的時候接收cookie。
OS X和iOS提供NSHTTPCookieStorage類荤胁,它還提供管理NSHTTPCookie對象集合的接口。在OS X中屎债,cookie 被所有app共享仅政;在iOS中,cookie屬于每個應(yīng)用自己的盆驹。
相關(guān)章節(jié):Cookie Storage圆丹。
協(xié)議支持
URL加載系統(tǒng)原生支持http, https, file, ftp, 和 data協(xié)議。盡管如此躯喇,URL加載系統(tǒng)還允許app注冊自己的類來支持額外的應(yīng)用層網(wǎng)絡(luò)協(xié)議辫封。你還可以想URL請求和URL響應(yīng)對象添加特定的協(xié)議屬性。
相關(guān)章節(jié):Cookies and Custom Protocols廉丽。
如何使用本文檔
通過閱讀Using NSURLSession這篇URL加載系統(tǒng)的概述開始倦微。然后閱讀Life Cycle of a URL Session來了解如何使用NSURLSession及其委托的詳情。關(guān)于URL加載系統(tǒng)的其他部分的跟進(jìn)一步信息正压,會在下面的幾章中提供:
- Encoding URL Data解釋了如何對任意字符串進(jìn)行編碼欣福,以便在URL中安全的使用它們。
- Handling Redirects and Other Request Changes描述了在響應(yīng)URL請求發(fā)生改變時你所擁有的選項(xiàng)焦履。
- Authentication Challenges and TLS Chain Validation描述了與安全服務(wù)器連接的驗(yàn)證過程拓劝。
- Understanding Cache Access描述了在請求期間連接如何使用緩存。
- Cookies and Custom Protocols解釋了可用于管理cookie存儲嘉裤、以及支持自定義應(yīng)用層協(xié)議的類郑临。