詳細解析幾個和網(wǎng)絡(luò)請求有關(guān)的類(五) —— 關(guān)于NSURL加載系統(tǒng)(一)

版本記錄

版本號 時間
V1.0 2018.03.10

前言

我們做APP發(fā)起網(wǎng)絡(luò)請求婉陷,一般都是使用框架牺丙,這些框架的底層也都是蘋果的API,接下來幾篇就一起來看一下和網(wǎng)絡(luò)有關(guān)的幾個類。感興趣的可以看上面幾篇文章孩锡。
1. 詳細解析幾個和網(wǎng)絡(luò)請求有關(guān)的類 (一) —— NSURLSession
2. 詳細解析幾個和網(wǎng)絡(luò)請求有關(guān)的類(二) —— NSURLRequest和NSMutableURLRequest
3. 詳細解析幾個和網(wǎng)絡(luò)請求有關(guān)的類(三) —— NSURLConnection
4. 詳細解析幾個和網(wǎng)絡(luò)請求有關(guān)的類(四) —— NSURLSession和NSURLConnection的區(qū)別

關(guān)于URL加載系統(tǒng)

本指南介紹了可用于與URL進行交互以及使用標準Internet協(xié)議與服務(wù)器進行通信的Foundation框架類。這些類一起被稱為URL加載系統(tǒng)周拐。

URL加載系統(tǒng)是一組允許您的應(yīng)用訪問由URL引用的內(nèi)容的類和協(xié)議涡戳。這項技術(shù)的核心是NSURL類,它可以讓你的應(yīng)用程序操縱URL和它們引用的資源或听。

為了支持這個類涕俗,F(xiàn)oundation框架提供了豐富的類集合,讓您可以加載URL的內(nèi)容神帅,上傳數(shù)據(jù)到服務(wù)器再姑,管理cookie存儲,控制響應(yīng)緩存找御,以APP指定的方式處理憑??證存儲和認證元镀,并編寫自定義協(xié)議擴展。

URL加載系統(tǒng)為使用以下協(xié)議訪問資源提供支持:

  • 文件傳輸協(xié)議(ftp://)
  • 超文本傳輸??協(xié)議(http://)
  • 帶加密的超文本傳輸??協(xié)議(https://)
  • 本地文件網(wǎng)址(file:///)
  • 數(shù)據(jù)網(wǎng)址(data://)

它還使用用戶的系統(tǒng)偏好明顯的支持代理服務(wù)器和SOCKS網(wǎng)關(guān)霎桅。

重要:在Apple平臺上栖疑,名為App Transport Security(ATS)的網(wǎng)絡(luò)安全功能可用于應(yīng)用和應(yīng)用擴展,并且默認情況下處于啟用狀態(tài)滔驶。 它通過確保您的應(yīng)用程序的網(wǎng)絡(luò)連接僅使用行業(yè)標準協(xié)議和沒有已知弱點的密碼來提高隱私和數(shù)據(jù)完整性遇革。有關(guān)更多信息,請參閱NSAppTransportSecurity揭糕。

注意:除了URL加載系統(tǒng)之外萝快,OS X和iOS還提供了用于在其他應(yīng)用程序(如Safari)中打開URL的API。 這些API在文檔中沒有描述著角。


概覽

URL加載系統(tǒng)包括加載URL的類以及與這些URL加載類一起工作以修改其行為的許多重要幫助類昂勒。 主要的幫助類分為五類:協(xié)議支持蜀细,認證和憑證,cookie存儲戈盈,配置管理和緩存管理protocol support, authentication and credentials, cookie storage, configuration management, cache management奠衔。

1. URL Loading - URL 加載

URL加載系統(tǒng)中最常用的類允許您的應(yīng)用從源中檢索URL的內(nèi)容。 您可以使用NSURLSession檢索該內(nèi)容奕谭。 您使用的具體方法很大程度上取決于您是要將數(shù)據(jù)提取到內(nèi)存還是將其下載到磁盤涣觉。

Fetching Content as Data (In Memory) - 獲取內(nèi)容作為數(shù)據(jù)(在內(nèi)存中)

在較高層次上,有兩種基本的方法來獲取URL數(shù)據(jù):

  • 對于簡單的請求血柳,可以使用NSURLSession API直接從NSURL對象中檢索內(nèi)容官册,既可以作為NSData對象,也可以作為磁盤上的文件难捌。

  • 對于更復(fù)雜的請求 - 例如上傳數(shù)據(jù)的請求 - 向NSURLSession提供NSURLRequest對象(或其可變子類膝宁,NSMutableURLRequest)。

無論您選擇哪種方式根吁,您的應(yīng)用程序都可以通過兩種方式獲取響應(yīng)數(shù)據(jù):

  • 提供完成處理程序塊员淫。 URL加載類在完成從服務(wù)器接收數(shù)據(jù)時調(diào)用該塊。

  • 提供一個自定義代理击敌。 URL加載類會在接收源數(shù)據(jù)時定期調(diào)用您的委托方法介返。 如果需要,您的應(yīng)用程序負責積累該數(shù)據(jù)沃斤。

除了數(shù)據(jù)本身之外圣蝎,URL加載類還為您的代理或完成處理程序塊提供了封裝與請求關(guān)聯(lián)的元數(shù)據(jù)(例如MIME類型和內(nèi)容長度)的響應(yīng)對象。

相關(guān)章節(jié):Using NSURLSession

Downloading Content as a File - 將內(nèi)容作為文件下載

在較高層次上衡瓶,有兩種基本方法可將URL的內(nèi)容下載到文件中:

  • 對于簡單的請求徘公,可以使用NSURLSession API直接從NSURL對象中檢索內(nèi)容,既可以作為NSData對象哮针,也可以作為磁盤上的文件关面。

  • 對于更復(fù)雜的請求 - 例如上傳數(shù)據(jù)的請求 - 向NSURLSession提供NSURLRequest對象(或其可變子類,NSMutableURLRequest)十厢。

注意:由NSURLSession實例啟動的下載不會被緩存等太。 如果您需要緩存結(jié)果,您的應(yīng)用程序必須使用NSURLSession并將數(shù)據(jù)寫入磁盤本身寿烟。

相關(guān)章節(jié):Using NSURLSession

2. Helper Classes - 輔助類

URL加載類使用兩個輔助類澈驼,它們提供附加的元數(shù)據(jù) - 一個用于請求本身(NSURLRequest),另一個用于服務(wù)器的響應(yīng)(NSURLResponse)筛武。

URL Requests - URL請求

NSURLRequest對象以獨立于協(xié)議的方式封裝URL和任何協(xié)議特定的屬性缝其。

注意:當客戶端應(yīng)用程序使用NSMutableURLRequest的實例啟動連接或下載時,會對請求進行深層復(fù)制徘六。 初始化下載后内边,對啟動請求所做的更改不起作用。

一些協(xié)議支持協(xié)議指定的屬性待锈。 例如漠其,HTTP協(xié)議將方法添加到NSURLRequest中,以返回HTTP請求正文竿音,頭和請求方法和屎。 它還向NSMutableURLRequest添加方法來設(shè)置這些值。

本書通篇描述了使用URL請求對象的細節(jié)春瞬。

Response Metadata - 響應(yīng)元數(shù)據(jù)

從服務(wù)器到請求的響應(yīng)可以被看作兩部分:描述內(nèi)容和內(nèi)容數(shù)據(jù)本身的元數(shù)據(jù)柴信。 大多數(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加載類通過完成處理程序塊或?qū)ο蟠韺㈨憫?yīng)數(shù)據(jù)本身提供給您的應(yīng)用程序枣察。
NSCachedURLResponse實例封裝NSURLResponse對象,URL內(nèi)容數(shù)據(jù)以及您的應(yīng)用程序提供的任何其他信息燃逻。 詳情請參閱Cache Management序目。

本書通篇描述了使用URL響應(yīng)對象的細節(jié)。

3. Redirection and Other Request Changes - 重定向和其他請求更改

某些協(xié)議(如HTTP)為服務(wù)器提供了一種方式唆樊,告訴您的應(yīng)用程序內(nèi)容已移至不同的URL宛琅。 URL加載類可以在發(fā)生這種情況時通知他們的代理。 如果您的應(yīng)用程序提供了適當?shù)奈蟹椒ǘ号裕瑒t您的應(yīng)用程序可以決定是否遵循重定向嘿辟,從重定向返回響應(yīng)主體,或返回錯誤片效。

相關(guān)章節(jié):Handling Redirects and Other Request Changes

4. Authentication and Credentials - 身份驗證和憑證

某些服務(wù)器限制對特定內(nèi)容的訪問红伦,要求用戶通過提供某種證書(客戶端證書,用戶名和密碼等)進行身份驗證才能獲得訪問權(quán)限淀衣。在Web服務(wù)器的情況下昙读,受限制的內(nèi)容被分組到需要一組憑證的領(lǐng)域。憑證(特別是證書)也用于確定另一方向的信任 - 評估您的應(yīng)用是否應(yīng)該信任服務(wù)器膨桥。

URL加載系統(tǒng)提供模型憑證和受保護區(qū)域的類以及提供安全的憑證持久性蛮浑。您的應(yīng)用可以指定這些憑據(jù)在單個請求唠叛,應(yīng)用啟動期間或永久保存在用戶的鑰匙串中時保留。

注意:存儲在持久性存儲中的憑證保存在用戶的鑰匙串中沮稚,并在所有應(yīng)用程序中共享艺沼。

NSURLCredential類封裝由認證信息(例如用戶名和密碼)和持久性行為組成的憑證。 NSURLProtectionSpace類表示需要特定憑證的區(qū)域蕴掏。保護空間可以限制為單個URL障般,包含Web服務(wù)器上的領(lǐng)域或引用代理。

NSURLCredentialStorage對象管理會話的憑證存儲盛杰,并提供NSURLCredential對象與其提供身份驗證的相應(yīng)NSURLProtectionSpace對象的映射挽荡。只有身份驗證質(zhì)詢成功時才會存??儲憑證。

NSURLAuthenticationChallenge類封裝了NSURLProtocol實現(xiàn)為驗證請求所需的信息:建議的憑證即供,涉及的保護空間定拟,協(xié)議用于確定需要驗證的錯誤或響應(yīng),以及已完成的驗證嘗試次數(shù)募狂。 NSURLAuthenticationChallenge實例還指定啟動身份驗證的對象办素。發(fā)起對象(稱為發(fā)送者)必須符合NSURLAuthenticationChallengeSender協(xié)議。

NSURLAuthenticationChallenge實例被NSURLProtocol子類用于通知URL加載系統(tǒng)需要認證祸穷。它們也提供給NSURLSession的委托方法性穿,以方便定制認證處理。

相關(guān)章節(jié):Authentication Challenges and TLS Chain Validation

5. Cache Management - 內(nèi)存管理

URL加載系統(tǒng)提供了一個磁盤和內(nèi)存中緩存雷滚,允許應(yīng)用程序減少對網(wǎng)絡(luò)連接的依賴需曾,并為以前緩存的響應(yīng)提供更快的周轉(zhuǎn)時間呆万。緩存存儲在每個應(yīng)用程序的基礎(chǔ)上。 NSURLSession根據(jù)啟動NSURLRequestNSURLSessionConfiguration對象指定的緩存策略來查詢緩存。

NSURLCache類提供了一些方法來配置緩存大小及其在磁盤上的位置严就。它還提供了管理包含緩存響應(yīng)的NSCachedURLResponse對象集合的方法器罐。

NSCachedURLResponse對象封裝NSURLResponse對象和URL內(nèi)容數(shù)據(jù)。 NSCachedURLResponse還提供了一個用戶信息字典铸董,您的應(yīng)用可以使用它來緩存任何自定義數(shù)據(jù)旁理。

并非所有的協(xié)議實現(xiàn)都支持響應(yīng)緩存。目前只有http和https請求被緩存。

NSURLSession對象可以通過實現(xiàn)URLSession:dataTask:willCacheResponse:completionHandler:delegate方法來控制是否緩存響應(yīng)以及是否應(yīng)該僅在內(nèi)存中緩存響應(yīng)。

相關(guān)章節(jié):Understanding Cache Access

6. Cookie Storage - Cookie存儲

由于HTTP協(xié)議的無狀態(tài)特性豌习,客戶端通常使用Cookie來提供跨URL請求的持久數(shù)據(jù)存儲。 URL加載系統(tǒng)提供接口來創(chuàng)建和管理cookie,發(fā)送cookie作為HTTP請求的一部分,并在解釋web服務(wù)器的響應(yīng)時接收cookie矾屯。

OS X和iOS提供了NSHTTPCookieStorage類件蚕,該類又提供了管理NSHTTPCookie對象集合的接口。 在OS X中拌夏,所有應(yīng)用程序共享cookie存儲; 在iOS中,Cookie存儲是按應(yīng)用程序進行的栅迄。

相關(guān)章節(jié):Cookie Storage

7. Protocol Support - 協(xié)議支持

URL加載系統(tǒng)本身支持http,https,file作瞄,ftp和data協(xié)議。 但是析二,URL加載系統(tǒng)還允許您的應(yīng)用程序注冊您自己的類以支持其他應(yīng)用程序?qū)泳W(wǎng)絡(luò)協(xié)議粉洼。 您還可以將協(xié)議指定的屬性添加到URL請求和URL響應(yīng)對象。

相關(guān)章節(jié):Cookies and Custom Protocols


如何使用本文檔

首先閱讀Using NSURLSession概述URL加載系統(tǒng)叶摄。 然后閱讀Life Cycle of a URL Session以詳細了解NSURLSession如何與其代理進行交互属韧。 有關(guān)URL加載系統(tǒng)其他方面的更多信息將在以下章節(jié)中提供:

后記

本篇主要介紹了關(guān)于URL系統(tǒng)這個蘋果框架的概覽和描述锅棕,包括URL加載系統(tǒng)的各個組成部分。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淌山,一起剝皮案震驚了整個濱河市裸燎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泼疑,老刑警劉巖德绿,帶你破解...
    沈念sama閱讀 206,839評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡移稳,警方通過查閱死者的電腦和手機蕴纳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來个粱,“玉大人古毛,你說我怎么就攤上這事《夹恚” “怎么了稻薇?”我有些...
    開封第一講書人閱讀 153,116評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長梭稚。 經(jīng)常有香客問我颖低,道長,這世上最難降的妖魔是什么弧烤? 我笑而不...
    開封第一講書人閱讀 55,371評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蹬敲,結(jié)果婚禮上暇昂,老公的妹妹穿的比我還像新娘。我一直安慰自己伴嗡,他們只是感情好急波,可當我...
    茶點故事閱讀 64,384評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瘪校,像睡著了一般澄暮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上阱扬,一...
    開封第一講書人閱讀 49,111評論 1 285
  • 那天泣懊,我揣著相機與錄音,去河邊找鬼麻惶。 笑死馍刮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的窃蹋。 我是一名探鬼主播卡啰,決...
    沈念sama閱讀 38,416評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼警没!你這毒婦竟也來了匈辱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評論 0 259
  • 序言:老撾萬榮一對情侶失蹤杀迹,失蹤者是張志新(化名)和其女友劉穎亡脸,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡梗掰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,007評論 2 325
  • 正文 我和宋清朗相戀三年嵌言,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片及穗。...
    茶點故事閱讀 38,117評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡摧茴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出埂陆,到底是詐尸還是另有隱情苛白,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評論 4 324
  • 正文 年R本政府宣布焚虱,位于F島的核電站购裙,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鹃栽。R本人自食惡果不足惜躏率,卻給世界環(huán)境...
    茶點故事閱讀 39,324評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望民鼓。 院中可真熱鬧薇芝,春花似錦、人聲如沸丰嘉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽饮亏。三九已至耍贾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間路幸,已是汗流浹背荐开。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留劝赔,地道東北人誓焦。 一個月前我還...
    沈念sama閱讀 45,578評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像着帽,于是被迫代替她去往敵國和親杂伟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,877評論 2 345

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