IOS網路開發NSURLSession詳解(一)概述,iosnsurlsession

來源:互聯網
上載者:User

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.