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