本文主要是看了WWDC 2013 - Session 705 - What's New in Foundation Networking 做出的翻譯和總結(jié), 文字/視頻鏈接如下
iOS網(wǎng)絡(luò)層 :
- BSD Networking
- 使用BSD Socket
- CoreFoundation / CFNetwork
- 提供訪問CFStream的API, 幫助你去訪問sockets stream的文件流.
- CFNetServices提供基于Bonjour Services(用于尋找服務(wù))的發(fā)布和訂閱的服務(wù).
- CFHTTPReadStream能發(fā)送HTTP和接收響應(yīng)體中的stream數(shù)據(jù).
- Foundation
- NSStream可以完全替代CFStream
- NSNetServices是對(duì)CFNetServices的封裝, 基于代理, 兼容OC中的ARC.
- NSURLConnection不止是一個(gè)類, 而是一些配套使用的類
iOS7開始, 新增了
NSURLSession
, 蘋果旨在用來取代NSURLConnection
. 并且NSURLConnection
在iOS9之后已經(jīng)被棄用!
NSURLConnection vs NSURLSession
一個(gè)NSURLConnection對(duì)象代表一個(gè)任務(wù), 每個(gè)任務(wù)綁定一個(gè)configuration, 全部connection對(duì)象共享一個(gè)全局存儲(chǔ)器(global storage).
一個(gè)NSURLSession對(duì)象綁定一個(gè)configuration, 一個(gè)session對(duì)象可以創(chuàng)建n個(gè)任務(wù)(NSURLSessionTask對(duì)象), 每個(gè)NSURLSession擁有一個(gè)私人存儲(chǔ)器(private storage).
NSURLSession的優(yōu)勢
- 基于連接的身份認(rèn)證方案
- 更多更好的HTTP請(qǐng)求配置選項(xiàng)
- 私有的, 可子類話的存儲(chǔ)器
- 后臺(tái), 進(jìn)程外的上傳和下載任務(wù)
- API baseline
- 由于NSURLConnection在iOS9以后已經(jīng)被蘋果棄用了, 所以大家還是用NSURLSession吧.
NSURLSession API
NSURLSession API分為以下幾個(gè)類 :
- NSURLSessionConfiguration
- NSURLSessionTask
- NSURLSessionDelegate
- NSURLSession
NSURLSessionConfiguration
幾種常見的Configuration :
- defaultConfiguration : 默認(rèn)的策略
- ephemeralSessionConfiguration : 僅內(nèi)存緩存, 不做磁盤緩存.
- backgroundSessionConfiguration:
identifier
: 后臺(tái)策略,identifier
用來后臺(tái)重連session對(duì)象. (做后臺(tái)上傳/下載就是這個(gè)config)
每個(gè)NSURLSessionConfiguration
對(duì)象代表一個(gè)NSURLSession
的策略 :
- 緩存, cookie, 證書存儲(chǔ)
- 電池使用, 網(wǎng)絡(luò)服務(wù)類型
- 請(qǐng)求的數(shù)量
- 資源/請(qǐng)求超時(shí)時(shí)間
- TLS協(xié)議
- HTTP 代理, cookies, 流水線, 頭部
- 使用子類化的存儲(chǔ)器
另外, Configuration對(duì)象默認(rèn)是可變類型的(mutable), 他們被使用的時(shí)候相當(dāng)于copy了一份(immutable). 所以你在session中并不能對(duì)其中的Configuration進(jìn)行修改.
NSURLSessionTask
- task被用來取代connection. 一個(gè)task代表一個(gè)任務(wù)(相當(dāng)于NSURLConnection對(duì)象)
- 提供任務(wù)的狀態(tài)和進(jìn)度屬性
- 提供任務(wù)的取消/掛起/恢復(fù)功能
- 區(qū)分data和upload任務(wù)
- 提供斷點(diǎn)續(xù)傳的實(shí)現(xiàn) (*重點(diǎn))
NSURLSessionTask的類繼承圖譜如下 :
NSURLSessionDelegate
- 一個(gè)代理對(duì)象能夠處理所有NSURLSession方法
- Session, task, dataTask, DownloadTask
- 強(qiáng)引用代理對(duì)象(這跟我們平時(shí)弱引用代理對(duì)象不一樣)直到session無效, session就會(huì)把全部task都取消/完成.
- 代理方法有可能會(huì)阻塞加載
- 記得調(diào)用completion handler這個(gè)block去讓session繼續(xù)工作, 否則會(huì)阻塞起來
Background Transfers
- 系統(tǒng)創(chuàng)建一個(gè)守護(hù)進(jìn)程
- 當(dāng)你的app正在運(yùn)行的時(shí)候, 正常調(diào)用代理方法傳輸數(shù)據(jù)給你
- 當(dāng)你的app退出了(回到桌面/crash), 守護(hù)進(jìn)程會(huì)繼續(xù)他的工作, 直到需要重新認(rèn)證或者完成所有任務(wù)
- re-launch你的app, 然后re-create你的后臺(tái)session, 然后后臺(tái)session會(huì)re-connect守護(hù)進(jìn)程.
- 守護(hù)進(jìn)程此時(shí)就會(huì)把數(shù)據(jù)給你.
可以通過不同的identifier創(chuàng)建多個(gè)后臺(tái)session.