httpdns服務(wù)解決的問題我們的App時常會出現(xiàn)請求失敗或是請求的接口返回錯誤數(shù)據(jù)的情況,,一般引起這些問題的原因大都和你的域名解析有關(guān)域名解析錯誤、域名被劫持,。這些問題嚴重影響用戶體驗,,為了解決這些問題我們需要接入httpdns 服務(wù)。 至于為什么會出現(xiàn)域名解析的諸多問題以及httpdns 怎么解決的可以參看下面兩篇文章: https://www./t/262266 http://www.cnblogs.com/softidea/p/5325162.html
接入httpdns的網(wǎng)絡(luò)環(huán)境1.iOS客戶端使用https協(xié)議(蘋果要求雖然現(xiàn)在沒有強制但相信這是趨勢) 2.服務(wù)端采用CDN加速
App端接入httpdns我們接入的是騰訊出品的httpdns 服務(wù)簡稱D+ App的簡要處理流程圖:
說明:在域名列表及對應(yīng)IP部分可以根據(jù)業(yè)務(wù)采用動態(tài)更新的策略來提高該部分的可用性
https請求IP直連業(yè)務(wù)場景的解決
- 問題
當客戶端在使用https和CDN服務(wù)器(CDN的站點往往服務(wù)了很多的域名)交互過程中CDN服務(wù)器要獲取到請求的域名信息用以下發(fā)對應(yīng)的公鑰證書和隨機數(shù)來完成校驗過程,,但由于客戶端采用了HTTPDNS 解析域名請求URL中的host會被替換成HTTPDNS 解析出來的IP,,導(dǎo)致服務(wù)器獲取到的域名為解析后的IP,無法找到匹配的證書,,只能返回默認的證書或者不返回,,所以會出現(xiàn)SSL/TLS握手不成功的錯誤。
解決辦法 通過設(shè)置sni請求參數(shù)把域名信息攜帶過去
iOS端對于sni參數(shù)的設(shè)置方法 1.iOS上層網(wǎng)絡(luò)庫NSURLConnection/NSURLSession沒有提供接口進行SNI字段的配置,,只能通過NSURLProtocol攔截來請求設(shè)置sni,。
NSURLProtocol這個類我們不能直接使用,我們需要自己創(chuàng)建一個它的子類,,在子類中我們需要重寫下面幾個函數(shù):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| /** * 是否攔截處理指定的請求 * * @param request 指定的請求 * * @return 返回YES表示要攔截處理,,返回NO表示不攔截處理 */ + (BOOL)canInitWithRequest:(NSURLRequest *)request /*! *@method: NSURLProtocol抽象類必須要實現(xiàn)。通常情況下這里有一個最低的標準:即輸入輸出請求滿足最基本的協(xié)議規(guī)范一致,。因此這里簡單的做法可以直接返回,。一般情況下我們是不會去更改這個請求的。如果你想更改, *比如給這個request添加一個title,,組合成一個新的http請求,。 *@parma: 本地HttpRequest請求:request *@return:直接轉(zhuǎn)發(fā) */ + (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request /** * 開始加載,在該方法中,,加載一個請求 */ - (void)startLoading /** * 取消請求 */ - (void)stopLoading
|
詳見:https://github.com/RiverLeeSunny/CFHTTPDNSHTTPMessageProtocol
2.第三方網(wǎng)絡(luò)庫庫asi-http-request是在CFNetwork基礎(chǔ)上封裝的是支持SNI設(shè)置的但這個庫好久不更新維護了,,如果你們App有一直在使用可以研究下怎么設(shè)置。
|