Advances In Networking,Part2

URLSession Adaptable Connectivity API

當(dāng)網(wǎng)絡(luò)請(qǐng)求遇到不可達(dá)的情況時(shí),如:

  • 無(wú)連接上Wifi且無(wú)手機(jī)信號(hào)
  • 設(shè)備飛行模式
  • 只有蜂窩信號(hào),但是allowsCellularAccess為NO

等,會(huì)導(dǎo)致請(qǐng)求直接失敗。很多APP通常這是時(shí)候回監(jiān)聽(tīng)網(wǎng)絡(luò)連接狀態(tài)以待可連接時(shí)重新請(qǐng)求或直接重新發(fā)起請(qǐng)求。
蘋(píng)果為了解決這個(gè),在URLSessionConfiguration中增加了waitsForConnectivity屬性,當(dāng)其設(shè)置為YES,系統(tǒng)回等到以上幾個(gè)請(qǐng)求不可達(dá)情況消失了才把請(qǐng)求發(fā)出去(避免無(wú)謂的請(qǐng)求失敗)。(此功能在BackgroundURLSession中默認(rèn)開(kāi)啟)
同時(shí)增加了

urlSession(_:taskIsWaitingForConnectivity:)

代理方法通知代理者某個(gè)請(qǐng)求等待連接可用

URLSession Scheduling API

主要解決一下三個(gè)問(wèn)題:

  • 沒(méi)必要因?yàn)閯?chuàng)建NSURLSessionTask而進(jìn)行額外的后臺(tái)加載
  • 當(dāng)后臺(tái)請(qǐng)求創(chuàng)建但還沒(méi)發(fā)出去的時(shí)候,這個(gè)被創(chuàng)建的請(qǐng)求有可能因?yàn)樯舷挛淖兓脑驅(qū)е逻@個(gè)請(qǐng)求無(wú)意義
  • iOS系統(tǒng)并不知道什么時(shí)候去發(fā)起你的請(qǐng)求才是最合適的
    原先你要做后臺(tái)數(shù)據(jù)加載的時(shí)候,流程是這樣的:
屏幕快照 2017-08-27 下午4.48.03.png

變成

屏幕快照 2017-08-27 下午4.48.10.png

所以當(dāng)應(yīng)用在前臺(tái)的時(shí)候,你就可以創(chuàng)建這個(gè)NSURLSessionTask,iOS11里面就不會(huì)在后臺(tái)額外launch一次去創(chuàng)建NSURLSessionTask。這就解決了問(wèn)題1。

iOS11在NSURLSessionTask的delegate里面提供了一個(gè)新的方法:urlSession:task:willBeginDelayedRequest:completionHandler:(Backgroud Session 專有)。系統(tǒng)在發(fā)起請(qǐng)求之前會(huì)調(diào)一個(gè)這個(gè)回調(diào),然后在這個(gè)completionHandler里面你告訴系統(tǒng)這個(gè)請(qǐng)求是否要發(fā)出去,是否要修改。從而解決了問(wèn)題2。

iOS11也給了NSURLSessionTask一個(gè)property:earliestBeginDate。系統(tǒng)在earlistBeginDate之前是不會(huì)發(fā)起這個(gè)請(qǐng)求的。你給這個(gè)task設(shè)置一個(gè)earliestBeginDate,就解決了問(wèn)題3。
還通過(guò)設(shè)置NSURLSessionTask的countOfBytesClientExpectsToSend和countOfBytesClientExpectsToReceive來(lái)讓系統(tǒng)更好地調(diào)度你的后臺(tái)網(wǎng)絡(luò)任務(wù)。

NSURLSession Enhancements

ProgressReporting

以往監(jiān)聽(tīng)URLSessionTask的進(jìn)度是通過(guò)KVO以下屬性來(lái)計(jì)算進(jìn)度

countOfBytesExpectedToReceive,countOfBytesReceived,countOfBytesExpectedToSend,countOfBytesSent

但是這樣需要做額外的工作
蘋(píng)果新增了屬性

var fractionCompleted:Double

來(lái)提供進(jìn)度
以及屬性

localizedDescription,localizedAdditionalDescription:

獲取進(jìn)度的描述

URLSession Brotli Support

URLSession支持Brotli壓縮協(xié)議
Brotli對(duì)比gzip,壓縮率提高了15%(HTML,CSS,JS...等)

URLSessionStreamTask

新增了HTTPS認(rèn)證的流程代理
注: URLSessionStreamTask特性

  • 支持TCP/IP直連服務(wù)器
  • 支持HTTPS
  • 完全取代NSInputStream/NSOutputStream

Networking Best Practices

  • 不使用BSD Socket
  • 不使用embed networking Libaray
  • 使用蘋(píng)果以下的API來(lái)獲得提升
    • Wifi Assist
    • Background work
  • 使用域名相關(guān)API(就是不要直接使用IP)
  • 使用timeoutIntervalForResource,timeoutIntervalForRequest設(shè)定請(qǐng)求超時(shí)時(shí)間
  • 盡量一個(gè)app內(nèi)共用一個(gè)URLSession
  • 即使清理動(dòng)態(tài)創(chuàng)建的URLSession,使用finishTasksAndInvalidate和invalidateAndCancel函數(shù)
屏幕快照 2017-08-27 下午5.12.31.png

Ongoing Developments

開(kāi)發(fā)TLS1.3中

開(kāi)發(fā)QUIC中

  • 全名Quick UDP internet connections
  • 由谷歌發(fā)起的
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 蘋(píng)果官方提供的用于加載網(wǎng)絡(luò)資源的類,可以分為以下幾大類 NSURLSession是iOS7新引進(jìn)的類,用于取代NS...
    Y_shadow閱讀 759評(píng)論 0 0
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,335評(píng)論 25 708
  • NSURLSession 類及其相關(guān)類為下載內(nèi)容提供了接口。這個(gè) API 提供了一系列豐富的代理方法來(lái)支持授權(quán),而...
    芳仔小腳印閱讀 940評(píng)論 1 8
  • iOS開(kāi)發(fā)系列--網(wǎng)絡(luò)開(kāi)發(fā) 概覽 大部分應(yīng)用程序都或多或少會(huì)牽扯到網(wǎng)絡(luò)開(kāi)發(fā),例如說(shuō)新浪微博、微信等,這些應(yīng)用本身可...
    lichengjin閱讀 3,721評(píng)論 2 7
  • 鎮(zhèn)上的人對(duì)我很不滿,因此發(fā)生了后來(lái)的事。 剛開(kāi)始是我的鄰居。每次外出,我都會(huì)碰到他們。這不足為奇。他們住在我前面,...
    張不退閱讀 343評(píng)論 1 0