關(guān)于URL加載系統(tǒng) <- URL會話編程指南

本指南描述了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保存题暖、配置管理、以及緩存管理梆暮。

The URL loading system class hierarchy
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é)議的類郑临。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市屑宠,隨后出現(xiàn)的幾起案子厢洞,更是在濱河造成了極大的恐慌,老刑警劉巖侨把,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犀变,死亡現(xiàn)場離奇詭異,居然都是意外死亡秋柄,警方通過查閱死者的電腦和手機(jī)获枝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骇笔,“玉大人省店,你說我怎么就攤上這事嚣崭。” “怎么了懦傍?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵雹舀,是天一觀的道長。 經(jīng)常有香客問我粗俱,道長说榆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任寸认,我火速辦了婚禮签财,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘偏塞。我一直安慰自己唱蒸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布灸叼。 她就那樣靜靜地躺著神汹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪古今。 梳的紋絲不亂的頭發(fā)上屁魏,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音沧卢,去河邊找鬼蚁堤。 笑死,一個胖子當(dāng)著我的面吹牛但狭,可吹牛的內(nèi)容都是我干的披诗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼立磁,長吁一口氣:“原來是場噩夢啊……” “哼呈队!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起唱歧,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤宪摧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后颅崩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體几于,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年沿后,在試婚紗的時候發(fā)現(xiàn)自己被綠了沿彭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡尖滚,死狀恐怖喉刘,靈堂內(nèi)的尸體忽然破棺而出瞧柔,到底是詐尸還是另有隱情,我是刑警寧澤造锅,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站哥蔚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏肺素。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一宇驾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧猴伶,春花似錦、人聲如沸他挎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筹淫。三九已至,卻和暖如春呢撞,著一層夾襖步出監(jiān)牢的瞬間损姜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工摧阅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绷蹲,地道東北人棒卷。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓比规,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蜒什。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容