IOS網路開發NSURLSession詳解(一)概述,iosnsurlsession
原創blog,轉載請註明出處blog.csdn.net/hello_hwc
我的IOS-SDK詳解專欄,歡迎關注
http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html
前言:
這個IOS網路編程的系列計劃6篇文章,NSURLSession3篇(一篇概述,一篇詳細闡述三種task和delegate的使用,一篇闡述授權,認證等內容),網路的基礎知識兩篇(一篇REST API講解已經寫完了,一篇我會把寫部落格的過程中遇到的概念總結出來),AFNetWorking庫的使用寫一篇。這是初步的計劃,如果寫的過程的當中,發現內容涵蓋不完整,適當再加幾篇。
這篇文章可能有點枯燥,不過,我想對後續內容的理解還是蠻重要的,所以,先寫出來了。
一 概述
NSURLSession是IOS SDK提供的一組相對容易使用的網路API。它包括幾個部分NSURLRequest,NSURLCache,NSURLSession,NSURLSessionConfiguration,NSURLSessionTask。IOS的網路編程除了NSURLSession,也可以使用NSURLConnection,只不過後者的易用性較差。網路開發的整體包括五個部分
支援的協議(例如http)
授權和認證(例如伺服器要求提供使用者名稱密碼)
cookie 儲存(例如不儲存cookie)
cache 管理(例如只在記憶體cache,不cache到硬碟)
組態管理(例如http headers等配置資訊)
二 簡單介紹下NSURLSession的幾個核心類
知道有這些類,大概是做什麼的就行。
1.1NSURLSessionConfiguration
指定NSURLSession的配置資訊。這些配置資訊決定了NSURLSession的種類,HTTP的額外headers,請求的timeout時間,Cookie的接受策略等配置資訊。更多的參見官方文檔。
這裡詳細講解下三種NSURLSessionConfiguration,這決定了NSURLSession種類。
+ (NSURLSessionConfiguration *)defaultSessionConfiguration
defaultSession,使用基於硬碟的持久話Cache,儲存使用者的認證到鑰匙串,使用共用cookie儲存
+ (NSURLSessionConfiguration *)ephemeralSessionConfiguration
配置資訊和default大致相同。除了,不會把cache,認證,或者任何和Session相關的資料存放區到硬碟,而是儲存在記憶體中,生命週期和Session一致。比如瀏覽器無痕瀏覽等功能就可以基於這個來做。
+ (NSURLSessionConfiguration *)backgroundSessionConfigurationWithIdentifier:(NSString *)identifier
建立一個可以在後台甚至APP已經關閉的時候仍然在傳輸資料的會話。注意,後台Session一定要在建立的時候賦予一個唯一的identifier,這樣在APP下次啟動並執行時候,能夠根據identifier來進行相關的區分。如果使用者關閉了APP,IOS 系統會關閉所有的background Session。而且,被使用者強制關閉了以後,IOS系統不會主動喚醒APP,只有使用者下次啟動了APP,資料轉送才會繼續。
1.2 NSURLSessionTask
實際的Session任務,分為三種,繼承關係
其中,
DataTask-用來請求資源,然後伺服器返回資料,再記憶體中儲存為NSData格式。default,ephemeral,shared Session支援data task。background session不支援。
Upload Task-和DataTask類似,只不過在請求的時候提供了request body。並且background Session支援 upload task。
Download Task-下載內容到硬碟上,所有類型的Session都支援。
注意,建立的task都是掛起狀態,需要resume才能執行。
1.3 NSURLSession
會話是基於NSURLSession網路開發的核心組件。由上文的Configuration來配置,然後作為工廠,建立NSURLSessionTask來進行實際的資料轉送任務。
一個初始化的例子,
self.session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
建立一個task
NSURLSessionDataTask * dataTask = [self.session dataTaskWithURL:[NSURL URLWithString:imageURL] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { }];
開始一個task
[dataTask resume];
1.4 NSURLRequest
指定請求的URL和cache策略。
例如,如下這個初始化函數
(instancetype)requestWithURL:(NSURL *)theURL
cachePolicy:(NSURLRequestCachePolicy)cachePolicy
timeoutInterval:(NSTimeInterval)timeoutInterval
就是在初始化的時候指定url,cachePolicy以及 timeoutInterval.
通過NSURLRequest可以設定HTTPMethod,預設是GET
1.5 NSURLCache
cache URL請求返回的response。
實現的方式是把NSURLRequest對象映射到NSCachedURLResponse對象。可以設定在記憶體中緩衝的大小,以及在磁碟中緩衝的大小和路徑。
不是特別需要的話,使用Shared Cached足矣,如果有特別需要,建立一個NSURLCache對象,然後通過+ setSharedURLCache 來設定。
當然,通過這個類也可以獲得到當前cache的使用方式。
1.6 NSURLResponse/NSHTTPURLResponse
通過REST API進行資源操作的時候,有request(請求)必然就有response(響應)。NSURLResponse中包含了metadata,例如返回的資料長度(expectedContentLength),MIME 類型,text編碼方式。
NSHTTPURLResponse是NSURLResponse的子類,由於絕大部分的REST都是HTTP的,所以,通常遇到的都是NSHTTPURLResponse對象。通過這個對象可以獲得:HTTP的headers,status Code等資訊。
其中:HTTP headers包含的資訊較多,不懂的可以看看wiki上http headers的內容。
status code會返回請求的狀況:例如404是not found。
WWW-Authenticate: Basic realm=“nmrs_m7VKmomQ2YM3:”是Server需要Client進行HTTP BA授權。
1.7 NSURLCredential - 用來處理認證資訊
比如使用者名稱密碼,比如伺服器授權等等。
這個要根據不同的認證方式來處理,
例如以下就是初始化一個使用者名稱密碼的認證。
(NSURLCredential *)credentialWithUser:(NSString *)user
password:(NSString *)password
persistence:(NSURLCredentialPersistence)persistence
基於認證的
+credentialWithIdentity:certificates:persistence:.
這裡的
typedef NS_ENUM(NSUInteger, NSURLCredentialPersistence) { NSURLCredentialPersistenceNone, //不儲存 NSURLCredentialPersistenceForSession,//按照Session生命週期儲存 NSURLCredentialPersistencePermanent,//儲存到鑰匙串 NSURLCredentialPersistenceSynchronizable//儲存到鑰匙串,根據相同的AppleID分配到其他裝置。};
1.8 NSURLAuthenticationChallenge
在訪問資源的時候,可能伺服器會返回需要授權(提供一個NSURLCredential對象)。那麼,URLSession:task:didReceiveChallenge:completionHandler:被調用。需要的授權資訊會儲存在這個類的對象裡。
幾個常用的屬性
error
最後一次授權失敗的錯誤資訊
failureResponse
最後一次授權失敗的錯誤資訊
previousFailureCount
授權失敗的次數
proposedCredential
建議使用的認證
protectionSpace
NSURLProtectionSpace對象,包括了地址連接埠等資訊,接下來會講解這個對象。
1.9 NSURLProtectionSpace
這個類的對象代表了伺服器上的一塊需要授權資訊的地區,英文叫realm。通過這個對象的資訊來響應Challenge。
比如,如果伺服器需要一個基於使用者名稱密碼的認證,那麼應該先參考下NSURLProtectionSpace對象的host,port,realm,protocol等資訊,然後依照這個資訊提供認證。
三 代理delegate
NSURLSession的代理通常是兩個層次的,Session層次和Task層次(一個Session可以包括多個Task)。
NSURLSessionDelegate-處理Session層次事件
NSURLSessionTaskDelegate-處理所有類型Task層次共性事件
NSURLSessionDownloadDelegate-處理Download類型的Task層次事件NSURLSessionDataDelegate-處理Download類型的Task層次事件
具體的代理事件,我會在以後的Demo裡進行講解。
想深入學習IOS網路開發的,可以研讀下官方的文檔。
https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html