nsurlsession是ios sdk提供的一組相對容易使用的網路api。它包括幾個部分nsurlrequest,nsurlcache,nsurlsession,nsurlsessionconfiguration,nsurlsessiontask。ios的網路程式設計除了nsurlsession,也可以使用nsurlconnection,只不過後者的易用性較差。網路開發的整體包括五個部分
支援的協議(例如http)如圖授權和證書(例如伺服器要求提供使用者名稱密碼)
cookie 儲存(例如不儲存cookie)
cache 管理(例如只在記憶體cache,不cache到硬碟)
配置管理(例如http headers等配置資訊)
知道有這些類,大概是做什麼的就行。
指定nsurlsession的配置資訊。這些配置資訊決定了nsurlsession的種類,http的額外headers,請求的timeout時間,cookie的接受策略等配置資訊。更多的參見官方文件。
這裡詳細講解下三種nsurlsessionconfiguration,這決定了nsurlsession種類。
+ (nsurlsessionconfiguration *)defaultsessionconfiguration
defaultsession,使用基於硬碟的持久話cache,儲存使用者的證書到鑰匙串,使用共享cookie儲存
+ (nsurlsessionconfiguration *)ephemeralsessionconfiguration
配置資訊和default大致相同。除了,不會把cache,證書,或者任何和session相關的資料儲存到硬碟,而是儲存在記憶體中,生命週期和session一致。比如瀏覽器無痕瀏覽等功能就可以基於這個來做。
注意,建立的task都是掛起狀態,需要resume才能執行。
會話是基於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]
;
指定請求的url和cache策略。
例如,如下這個初始化函式
(instancetype)requestwithurl
:(nsurl *)theurl
cachepolicy
:(nsurlrequestcachepolicy)cachepolicy
timeoutinterval
:(nstimeinterval)timeoutinterval
就是在初始化的時候指定url,cachepolicy以及 timeoutinterval.
通過nsurlrequest可以設定httpmethod,預設是get
cache url請求返回的response。
實現的方式是把nsurlrequest物件對映到nscachedurlresponse物件。可以設定在記憶體中快取的大小,以及在磁碟中快取的大小和路徑。當然,通過這個類也可以獲得到當前cache的使用情況。不是特別需要的話,使用shared cached足矣,如果有特別需要,建立乙個nsurlcache物件,然後通過+ setsharedurlcache 來設定。
通過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授權。
- 用來處理證書資訊
比如使用者名稱密碼,比如伺服器授權等等。
這個要根據不同的認證方式來處理,
例如以下就是初始化乙個
使用者名稱密碼的認證。
(nsurlcredential *)credentialwithuser
:(nsstring *)user
password
:(nsstring *)password
persistence
:(nsurlcredentialpersistence)persistence
基於證書的
+credentialwithidentity
:certificates
:persistence:.
這裡的
在訪問資源的時候,可能伺服器會返回需要授權(提供乙個nsurlcredential物件)。那麼,urlsession:task:didreceivechallenge:completionhandler:被呼叫。需要的授權資訊會儲存在這個類的物件裡。
幾個常用的屬性
error
最後一次授權失敗的錯誤資訊
failureresponse
最後一次授權失敗的錯誤資訊
previousfailurecount
授權失敗的次數
proposedcredential
建議使用的證書
protectionspace
nsurlprotectionspace物件,包括了位址埠等資訊,接下來會講解這個物件。
這個類的物件代表了伺服器上的一塊需要授權資訊的區域,英文叫realm。通過這個物件的資訊來響應challenge。
比如,如果伺服器需要乙個基於使用者名稱密碼的認證,那麼應該先參考下nsurlprotectionspace物件的host,port,realm,protocol等資訊,然後依照這個資訊提供證書。
nsurlsession的**通常是兩個層次的,session層次和task層次(乙個session可以包括多個task)。
nsurlsessiondelegate-處理session層次事件
nsurlsessiontaskdelegate-處理所有型別task層次共性事件
nsurlsessiondownloaddelegate-處理download型別的task層次事件nsurlsessiondatadelegate-處理download型別的task層次事件
iOS 9適配須知
昨天更新了xcode 7,準備ios 9的適配,查閱了相關文件,還是遇到不少坑,特整理下。1 編譯執行發現錯誤,類似如下錯誤 ld users framework sdks polymerpay library mobstat lib sdk.a forsdk.o does not contain ...
解決適配iOS9
1 在ios9下,系統缺省會攔截對http協議介面的訪問,因此無法獲取http協議介面的資料。解決 暫時退回到http協議。具體方法 然後給它新增乙個key nsallowsarbitraryloads,型別為boolean型別,值為yes 2 ios 9新建專案預設需要支援bitcode,而不支援...
適配iOS 9系統
問題描述 在ios9下,系統缺省會攔截對http協議介面的訪問,因此無法獲取http協議介面的資料。對sharesdk來說,具體表現可能是,無法授權 分享 獲取使用者資訊等。還可能造成我們的編輯介面裡傳http之類的網路的時候,我們的編輯介面不會顯示截圖,解決的辦法或者全面關閉https,允許使用h...