網(wǎng)絡監(jiān)聽
蜂窩無線系統(tǒng)(LTE悍引、4G、3G 等)對電量的消耗遠大于 WiFi 信號汞幢。根源在于 LTE 設備 基于多輸入钳榨、多輸出技術舰罚,使用多個并發(fā)信號以維護兩端的 LTE 鏈接。
應該避免在沒有連接WIFI的情況下進行高帶寬消耗操作薛耻,因此营罢,我們需要
- 在進行任何網(wǎng)絡操作之前,先檢查網(wǎng)絡的連接是否可用
- 持續(xù)監(jiān)視網(wǎng)絡的可用性饼齿,并在連接狀態(tài)變化時給予適當反饋
蘋果公司提供了示例代碼(http://apple.co/1Q3gRKL)饲漾,以檢查和監(jiān)聽網(wǎng)絡狀態(tài)的變化。如 果 你 的 項 目 使 用 了 CocoaPods缕溉, 那 么 請 使 用 Tony Million 的 Reachabilitypod(https:// github.com/tonymillion/Reachability)考传。
網(wǎng)絡請求過程
正常一條網(wǎng)絡請求需要經(jīng)過的流程是這樣:
1.DNS 解析,請求DNS服務器倒淫,獲取域名對應的 IP 地址伙菊。
2.與服務端建立連接,包括 tcp 三次握手敌土,安全協(xié)議同步流程镜硕。
3.連接建立完成,發(fā)送和接收數(shù)據(jù)返干,解碼數(shù)據(jù)兴枯。
DNS查找
發(fā)起連接的第一步是 DNS 查找。如果你的應用嚴重依賴網(wǎng)絡操作矩欠,DNS 的查找時間會使應用變慢财剖。
為了最大限度地減少 DNS 查詢時間所產(chǎn)生的延遲,你應該遵循以下的最佳實踐癌淮。
? 最小化應用使用的專有域名的數(shù)量躺坟。按照路由的一般工作方式,多個域名是不可避免的乳蓄。
最好是能做到以下幾點:
(1) 身份管理(登錄咪橙、注銷、配置文件) (2) 數(shù)據(jù)服務(API 端點)
(3) CDN(圖片和其他靜態(tài)人工產(chǎn)品)
有可能需要其他域名(例如虚倒,用于提供視頻美侦、上傳檢測數(shù)據(jù)、具體的子數(shù)據(jù)服務魂奥、廣告 投放菠剩,甚至是國家特定的全球本地化)。如果子域名數(shù)量上升至兩位數(shù)耻煤,那么勢必會引 發(fā)擔憂具壮。
? 在應用啟動時不需要連接所有的域名准颓,可能只需要身份管理和初始畫面所需的數(shù)據(jù)。對 于后續(xù)的子域名棺妓,嘗試更早地進行 DNS 解析瞬场,也被稱為 DNS 預先下載。為實現(xiàn)此操作涧郊, 你可以參考以下兩點。
如果子域名和主機在控制范圍內(nèi)眼五,你可以配置一個預設的 URL妆艘,不返回任何數(shù)據(jù),只 返回 HTTP 204 的狀態(tài)碼看幼,然后提前對該 URL 發(fā)起連接批旺。
第二個方法是使用 gethostbyname 執(zhí)行一個明確的 DNS 查找。然而诵姜,針對不同的協(xié)議汽煮, 主機可能會解析至不同的 IP,例如棚唆,HTTP 請求可能會解析至一個地址暇赤,而 HTTPS 會 解析至另一個地址。雖然不是很常見宵凌,但第 7 層的路由可以根據(jù)實際的請求解析 IP 地 址鞋囊,例如,圖像是一個地址瞎惫,視頻是另外一個地址溜腐。鑒于這些因素,在連接之前解析 DNS 經(jīng)常是無用的瓜喇,對主機進行偽連接會更有效挺益。
SSL握手時間
為了安全起見,可以假設應用中所有的連接均是通過 TLS/SSL 的(使用 HTTPS)乘寒。HTTPS在連接開始時望众,先進行 SSL 握手,SSL 握手主要是驗證服務器證書肃续,同時共享用于通信的 隨機密鑰黍檩。這一操作聽起來簡單,但是卻有很多步驟始锚,還會耗費較多時間(見圖 7-3)刽酱。
你應該遵循以下的最佳實踐。
最大程度地減少應用發(fā)起的連接數(shù)瞧捌。因此棵里,也需要減少應用連接的獨有域名的數(shù)量
請求結束后不要關閉 HTTP/S 連接润文。
為所有的HTTPS請求添加頭Connection: keep-alive。這確保了同樣的連接在下一次 請求時可以復用殿怜。使用域分片典蝌。如此一來,雖然連接的是不同的主機名头谜,你也可以使用同一個 socket骏掀,只 要它們解析為相同的 IP,可以使用相同的證書(例如柱告,在通配符域)就行了截驮。 域分片在 SPDY 及其后續(xù)版本——HTTP/2(https://http2.github.io)——中是可用的。你 需要一個支持上述任意一種格式的網(wǎng)絡庫际度。