1、NSURLSession

NSURLSession簡介

HTTP Header 詳解


NSURLSession & NSURLConnection Delegate Methods

總體而言,NSURLSession的委托方法,是NSURLConnection的演化的十年中 ad-hoc 模式出現(xiàn)以來的一個(gè)顯著改善。對(duì)于一個(gè)完整的概述,可以查看此映射表。

以下是一些具體的觀察:

NSURLSession同時(shí)具有用來處理身份驗(yàn)證挑戰(zhàn)會(huì)話和任務(wù)委托方法。這個(gè)會(huì)話的委托方法處理連接級(jí)別的問題,如服務(wù)器信任和客戶端證書的評(píng)估,NTLM和Kerberos,而任務(wù)的委托處理以請(qǐng)求為基礎(chǔ)的挑戰(zhàn),如Basic, Digest, 或者代理身份驗(yàn)證。

NSURLConnection由兩個(gè)方法可以表明一個(gè)請(qǐng)求已經(jīng)完成(NSURLConnectionDataDelegate -connectionDidFinishLoading: 和 NSURLConnectionDelegate -connection:didFailWithError:),而NSURLSession只有一個(gè)委托方法(NSURLSessionTaskDelegate -URLSession:task:didCompleteWithError:)。

與NSURLConnection使用的 long long類型相比,委托方法指定在NSURLSession中一定數(shù)量的字節(jié)傳輸使用int64_t類型的參數(shù)。

NSURLSession在Foundation框架對(duì)于委托方法的completionHandler:參數(shù)使用上 ,引入了一種新的模式。這允許委托方法可以安全地在主線程以非阻塞方式運(yùn)行;委托可以簡單地在后臺(tái)運(yùn)行dispatch_async ,然后在完成時(shí)調(diào)用completionHandler。同時(shí),它可以有效地?fù)碛卸鄠€(gè)返回值,不需要使用笨拙的參數(shù)指針。就NSURLSessionTaskDelegate的URLSession:task:didReceiveChallenge:completionHandler:方法而言,completionHandler接受兩個(gè)參數(shù):身份驗(yàn)證質(zhì)詢的處理( the authentication challenge disposition)以及需用使用的證書(如果適用)。

想要查看更多關(guān)于會(huì)話任務(wù)的信息,可以查看 WWDC Session 705: “What’s New in Foundation Networking”

NSURLSessionConfiguration

NSURLSessionConfiguration對(duì)象用于初始化NSURLSession對(duì)象。展開請(qǐng)求級(jí)別中與NSMutableURLRequest相關(guān)的可供選擇的方案,我們可以看到NSURLSessionConfiguration對(duì)于會(huì)話如何產(chǎn)生請(qǐng)求,提供了相當(dāng)多的控制和靈活性。從網(wǎng)絡(luò)訪問性能,到cookie,安全性,緩存策略,自定義協(xié)議,啟動(dòng)事件設(shè)置,以及用于移動(dòng)設(shè)備優(yōu)化的幾個(gè)新屬性,你會(huì)發(fā)現(xiàn)你一直在尋找的,正是NSURLSessionConfiguration。

會(huì)話在初始化時(shí)復(fù)制它們的配置,NSURLSession有一個(gè)只讀的配置屬性,使得該配置對(duì)象上的變化對(duì)這個(gè)會(huì)話的政策無效。配置在初始化時(shí)被讀取一次,之后都是不會(huì)變化的。

Constructors

NSURLSessionConfiguration有三個(gè)類構(gòu)造函數(shù),這很好地說明了NSURLSession是為不同的用例而設(shè)計(jì)的。

+ defaultSessionConfiguration返回標(biāo)準(zhǔn)配置,這實(shí)際上與NSURLConnection的網(wǎng)絡(luò)協(xié)議棧是一樣的,具有相同的共享NSHTTPCookieStorage,共享NSURLCache和共享NSURLCredentialStorage。

+ ephemeralSessionConfiguration返回一個(gè)預(yù)設(shè)配置,沒有持久性存儲(chǔ)的緩存,Cookie或證書。這對(duì)于實(shí)現(xiàn)像秘密瀏覽功能的功能來說,是很理想的。

+ backgroundSessionConfiguration:獨(dú)特之處在于,它會(huì)創(chuàng)建一個(gè)后臺(tái)會(huì)話。后臺(tái)會(huì)話不同于常規(guī)的,普通的會(huì)話,它甚至可以在應(yīng)用程序掛起,退出,崩潰的情況下運(yùn)行上傳和下載任務(wù)。初始化時(shí)指定的標(biāo)識(shí)符,被用于向任何可能在進(jìn)程外恢復(fù)后臺(tái)傳輸?shù)氖刈o(hù)進(jìn)程提供上下文。

Properties

NSURLSessionConfiguration擁有20個(gè)屬性。熟練掌握這些屬性的用處,將使應(yīng)用程序充分利用其網(wǎng)絡(luò)環(huán)境。

General

HTTPAdditionalHeaders指定了一組默認(rèn)的可以設(shè)置出站請(qǐng)求的數(shù)據(jù)頭。這對(duì)于跨會(huì)話共享信息,如內(nèi)容類型,語言,用戶代理,身份認(rèn)證,是很有用的。

NSString *userPasswordString = [NSString stringWithFormat:@"%@:%@", user, password];

NSData * userPasswordData = [userPasswordString dataUsingEncoding:NSUTF8StringEncoding];

NSString *base64EncodedCredential = [userPasswordData base64EncodedStringWithOptions:0];

NSString *authString = [NSString stringWithFormat:@"Basic: %@", base64EncodedCredential];

NSString *userAgentString = @"AppName/com.example.app (iPhone 5s; iOS 7.0.2; Scale/2.0)";

configuration.HTTPAdditionalHeaders = @{@"Accept": @"application/json",

@"Accept-Language": @"en",

@"Authorization": authString,

@"User-Agent": userAgentString};

networkServiceType對(duì)標(biāo)準(zhǔn)的網(wǎng)絡(luò)流量,網(wǎng)絡(luò)電話,語音,視頻,以及由一個(gè)后臺(tái)進(jìn)程使用的流量進(jìn)行了區(qū)分。大多數(shù)應(yīng)用程序都不需要設(shè)置這個(gè)。

allowsCellularAccess 和 discretionary 被用于節(jié)省通過蜂窩連接的帶寬。建議在使用后臺(tái)傳輸?shù)臅r(shí)候,使用discretionary屬性,而不是allowsCellularAccess屬性,因?yàn)樗鼤?huì)把WiFi和電源可用性考慮在內(nèi)。


timeoutIntervalForRequest 和 timeoutIntervalForResource指定了請(qǐng)求以及該資源的超時(shí)時(shí)間間隔。許多開發(fā)人員試圖使用timeoutInterval去限制發(fā)送請(qǐng)求的總時(shí)間,但這誤會(huì)了timeoutInterval的意思:報(bào)文之間的時(shí)間。timeoutIntervalForResource實(shí)際上提供了整體超時(shí)的特性,這應(yīng)該只用于后臺(tái)傳輸,而不是用戶實(shí)際上可能想要等待的任何東西。

HTTPMaximumConnectionsPerHost 是 Foundation 框架中URL加載系統(tǒng)的一個(gè)新的配置選項(xiàng)。它曾經(jīng)被用于NSURLConnection管理私人連接池。現(xiàn)在有了NSURLSession,開發(fā)者可以在需要時(shí)限制連接到特定主機(jī)的數(shù)量。

HTTPShouldUsePipelining 也出現(xiàn)在NSMutableURLRequest,它可以被用于開啟HTTP管道,這可以顯著降低請(qǐng)求的加載時(shí)間,但是由于沒有被服務(wù)器廣泛支持,默認(rèn)是禁用的。

sessionSendsLaunchEvents 是另一個(gè)新的屬性,該屬性指定該會(huì)話是否應(yīng)該從后臺(tái)啟動(dòng)。

connectionProxyDictionary指定了會(huì)話連接中的代理服務(wù)器。同樣地,大多數(shù)面向消費(fèi)者的應(yīng)用程序都不需要代理,所以基本上不需要配置這個(gè)屬性。

Cookie Policies

HTTPCookieStorage 是被會(huì)話使用的cookie存儲(chǔ)。默認(rèn)情況下,NSHTTPCookieShorage的+ sharedHTTPCookieStorage會(huì)被使用,這與NSURLConnection是相同的。

HTTPCookieAcceptPolicy 決定了該會(huì)話應(yīng)該接受從服務(wù)器發(fā)出的cookie的條件。

HTTPShouldSetCookies 指定了請(qǐng)求是否應(yīng)該使用會(huì)話HTTPCookieStorage的cookie。

Security Policies

URLCredentialStorage 是會(huì)話使用的證書存儲(chǔ)。默認(rèn)情況下,NSURLCredentialStorage 的+ sharedCredentialStorage 會(huì)被使用使用,這與NSURLConnection是相同的。

TLSMaximumSupportedProtocol 和 TLSMinimumSupportedProtocol 確定是否支持SSLProtocol版本的會(huì)話。

Caching Policies

URLCache 是會(huì)話使用的緩存。默認(rèn)情況下,NSURLCache 的+ sharedURLCache 會(huì)被使用,這與NSURLConnection是相同的。

requestCachePolicy 指定了一個(gè)請(qǐng)求的緩存響應(yīng)應(yīng)該在什么時(shí)候返回。這相當(dāng)于NSURLRequest 的-cachePolicy方法。

Custom Protocols

protocolClasses是注冊(cè)NSURLProtocol類的特定會(huì)話數(shù)組。

總結(jié)

iOS 7 和 Mac OS X 10.9 Mavericks 中URL加載系統(tǒng)的變化,是NSURLConnection的一個(gè)深思熟慮而自然的進(jìn)化??傮w而言,F(xiàn)oundation框架團(tuán)隊(duì)做出了令人驚訝的工作,他們研究并預(yù)測(cè)了移動(dòng)開發(fā)者現(xiàn)有的和新興的用例,創(chuàng)造了能夠滿足日常任務(wù)的, 真正有用的APIs。

就可組合性和可擴(kuò)展性而言,盡管在會(huì)話任務(wù)的體系結(jié)構(gòu)中,某些決定是一種倒退,NSURLSession仍然可以很好地作為更高級(jí)別的網(wǎng)絡(luò)功能的一個(gè)基礎(chǔ)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容