1 iOS 7:NSURLSession 2 字面理解Session會話控制 3 而Connection是鏈接,顯然Session比這個Connection要更強大些 4 5 1、NSURLSession簡介(總體認知) 6 (1).出現 7 8 NSURLConnection做爲一個網絡基礎架構,它已經表現得至關好。它是伴隨着2003年Safari瀏覽器的原始發行版本誕生的,可是,這些年來,iPhone和iPad新興的用例,特別是有一些已經向NSURLConnection的幾個核心設想提出了挑戰,對其重構已經迫在眉睫。 9 在2013年的WWDC上,Apple揭開了NSURLConnection繼任者的面紗:NSURLSession。 10 PS:蘋果全球開發者大會,英文全稱是(Apple Worldwide Developers Conference)。簡稱爲「WWDC」。 11 12 (2).特色 13 NSURLSession與我們熟悉的NSURLConnection是並列的。在程序在前臺時,NSURLSession與NSURLConnection能夠互爲替代工做。注意,若是用戶強制將程序關閉,NSURLSession會斷掉。 14 15 (3).NSURLSession提供的功能: 16 1.經過URL將數據下載到內存 17 2.經過URL將數據下載到文件系統 18 3.將數據上傳到指定URL 19 4.在後臺完成上述功能 20 21 (4)NSURLSession帶來了這些新的好處: 22 後臺上傳和下載 23 能夠暫停和繼續鏈接網絡 24 保存配置 25 子類化和私有存儲 26 改良的認證處理 27 豐富的代理模型 28 經過文件系統上傳和下載 29 30 2、相關的類(組成部分) 31 1.NSURLConnection這個名字,實際上指的是一組構成Foundation框架中URL加載系統的相互關聯的組件:NSURLRequest,NSURLResponse,NSURLProtocol,NSURLCache,NSHTTPCookieStorage,NSURLCredentialStorage,以及和它同名的NSURLConnection。 32 33 34 2.NSURLSession也是一組相互依賴的類,它的大部分組件和NSURLConnection中的組件相同如NSURLRequest,NSURLCache等。而NSURLSession的不一樣之處在於,它將NSURLConnection替換爲NSURLSession和NSURLSessionConfiguration,以及3個NSURLSessionTask的子類:NSURLSessionDataTask, NSURLSessionUploadTask, 和NSURLSessionDownloadTask。 35 36 3.與NSURLConnection相比,NSURLSession最直接的改善就是提供了配置每一個會話的緩存,協議,cookie和證書政策(credential policies),甚至跨應用程序共享它們的能力。這使得框架的網絡基礎架構和部分應用程序獨立工做,而不會互相干擾。每個NSURLSession對象都是根據一個NSURLSessionConfiguration初始化的,該NSURLSessionConfiguration指定了上面提到的政策,以及一系列爲了提升移動設備性能而專門添加的新選項。 37 PS:cookie(小甜餅?)指某些網站爲了辨別用戶身份、進行session跟蹤而儲存在用戶本地終端上的數據(一般通過加密),好讓服務器用來辨認你的計算機(自動登陸、用戶習慣和關注等)。 38 39 4.NSURLSession的另外一重要組成部分是會話任務,它負責處理數據的加載,以及客戶端與服務器之間的文件和數據的上傳下載服務。NSURLSessionTask與NSURLConnection是及其類似的,由於它負責加載數據,而主要的區別在於,任務共享它們父類NSURLSession的共同委託(common delegate)。 40 41 42 43 3、NSURLSession新推出的類(詳細認知) 44 1.NSURLSessionConfiguration類 45 其中NSURLSessionConfiguration用於配置會話的屬性,能夠經過該類配置會話的工做模式 46 指定NSURLSession的配置信息。這些配置信息決定了NSURLSession的種類,HTTP的額外headers,請求的timeout時間,Cookie的接受策略等配置信息。更多的參見官方文檔。 47 48 2.NSURLSession類 49 獲取NSURLSession類對象有幾種方式 50 會話是基於NSURLSession網絡開發的核心組件。由上文的Configuration來配置,而後做爲工廠,建立NSURLSessionTask來進行實際的數據傳輸任務。 51 3.NSURLSessionTask 52 實際的Session任務,分爲三種 53 NSURLSessionTask是一個抽象類,它有三個具體的子類是能夠直接使用的:NSURLSessionDataTask,NSURLSessionUploadTask和NSURLSessionDownloadTask。這三個類封裝了現代應用程序的三個基本網絡任務:獲取數據,好比JSON或XML,以及上傳下載文件。 54 55 56 57 4、工做流程 58 利用NSURLSession進行數據傳輸咱們須要: 59 1.建立一個NSURLSessionConfiguration,用於第二步建立NSSession時設置工做模式和網絡設置: 60 61 工做模式分爲: 62 通常模式(default):工做模式相似於原來的NSURLConnection,可使用緩存的Cache,Cookie,鑑權。 63 + (NSURLSessionConfiguration *)defaultSessionConfiguration 64 defaultSession,使用基於硬盤的持久話Cache,保存用戶的證書到鑰匙串,使用共享cookie存儲 65 66 即時模式(ephemeral):不使用緩存的Cache,Cookie,鑑權。 67 + (NSURLSessionConfiguration *)ephemeralSessionConfiguration 68 配置信息和default大體相同。除了,不會把cache,證書,或者任何和Session相關的數據存儲到硬盤,而是存儲在內存中,生命週期和Session一致。好比瀏覽器無痕瀏覽等功能就能夠基於這個來作。 69 後臺模式(background):在後臺完成上傳下載,建立Configuration對象的時候須要給一個NSString的ID用於追蹤完成工做的Session是哪個(後面會講到)。 70 + (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier 71 建立一個能夠在後臺甚至APP已經關閉的時候仍然在傳輸數據的會話。注意,後臺Session必定要在建立的時候賦予一個惟一的identifier,這樣在APP下次運行的時候,可以根據identifier來進行相關的區分。若是用戶關閉了APP,IOS 系統會關閉全部的background Session。並且,被用戶強制關閉了之後,IOS系統不會主動喚醒APP,只有用戶下次啓動了APP,數據傳輸纔會繼續。 72 73 建立一個NSURLSession,系統提供了兩個建立方法: 74 75 sessionWithConfiguration: 76 根據剛纔建立的Configuration建立一個Session,系統默認建立一個新的OperationQueue處理Session的消息。 77 sessionWithConfiguration:delegate:delegateQueue: 78 能夠設定回調的delegate(注意這個回調delegate會被強引用),而且能夠設定delegate在哪一個OperationQueue回調,若是咱們將其設置爲[NSOperationQueue mainQueue]就能在主線程進行回調很是的方便。 79 80 81 2.建立一個NSURLRequest調用剛纔的NSURLSession對象提供的Task函數,建立一個NSURLSessionTask。 82 83 根據職能不一樣Task有三種子類: 84 NSURLSessionUploadTask:上傳用的Task,傳完之後不會再下載返回結果; 85 NSURLSessionDownloadTask:下載用的Task,下載內容到硬盤上; 86 NSURLSessionDataTask:能夠上傳內容,上傳完成後再進行下載,存儲爲NSData格式。 87 88 獲得的Task,調用resume開始工做。 89 90 91 3.若是是細粒度的Session調用,Session與Delegate會在指定的OperationQueue中進行交互。 92 93 4.當再也不須要鏈接調用Session的invalidateAndCancel直接關閉,或者調用finishTasksAndInvalidate等待當前Task結束後關閉。這時Delegate會收到URLSession:didBecomeInvalidWithError:這個事件。Delegate收到這個事件以後會被解引用。 94 95 5.若是是一個BackgroundSession,在Task執行的時候,用戶切到後臺,Session會和ApplicationDelegate作交互。當程序切到後臺後,在BackgroundSession中的Task還會繼續下載。 96 97 5、詳見代碼 98 99 100 101 6、拓展瞭解部分 102 103 1.NSURLSession 104 會話是基於NSURLSession網絡開發的核心組件。由上文的Configuration來配置,而後做爲工廠,建立NSURLSessionTask來進行實際的數據傳輸任務。 105 106 2.NSURLRequest 107 指定請求的URL和cache策略。 108 經過NSURLRequest能夠設置HTTPMethod,默認是GET 109 110 3.NSURLCache 111 cache URL請求返回的response。 112 //http://blog.sina.com.cn/s/blog_9693f61a01016t4w.html 113 114 4.NSURLResponse/NSHTTPURLResponse 115 經過REST API進行資源操做的時候,有request(請求)必然就有response(響應)。NSURLResponse中包含了metadata,例如返回的數據長度(expectedContentLength),MIME 類型,text編碼方式。 116 117 5.NSURLCredential 118 - 用來處理證書信息 119 好比用戶名密碼,好比服務器受權等等。 120 這個要根據不一樣的認證方式來處理, 121 例如如下就是初始化一個用戶名密碼的認證。 122 //http://blog.csdn.net/majiakun1/article/details/17013379 123 124 6.NSURLAuthenticationChallenge 125 在訪問資源的時候,可能服務器會返回須要受權(提供一個NSURLCredential對象)。那麼,URLSession:task:didReceiveChallenge:completionHandler:被調用。須要的受權信息會保存在這個類的對象裏。 126 127 7.NSURLProtectionSpace 128 這個類的對象表明了服務器上的一塊須要受權信息的區域,英文叫realm。經過這個對象的信息來響應Challenge。 129 好比,若是服務器須要一個基於用戶名密碼的認證,那麼應該先參考下NSURLProtectionSpace對象的host,port,realm,protocol等信息,而後依照這個信息提供證書。