iOS9的網路請求簡述

2021-07-07 05:03:57 字數 3903 閱讀 7605

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物件。可以設定在記憶體中快取的大小,以及在磁碟中快取的大小和路徑。

不是特別需要的話,使用shared cached足矣,如果有特別需要,建立乙個nsurlcache物件,然後通過+ setsharedurlcache 來設定。

當然,通過這個類也可以獲得到當前cache的使用情況。

通過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...