iOS IP的獲取

什么是IP

IP是Internet Protocol(網(wǎng)際互連協(xié)議)的縮寫,是TCP/IP體系中的網(wǎng)絡(luò)層協(xié)議。對上可載送傳輸層各種協(xié)議的信息,例如TCP、UDP等;對下可將IP信息包放到鏈路層,通過以太網(wǎng)、令牌環(huán)網(wǎng)絡(luò)等各種技術(shù)來傳送

IP地址是IP協(xié)議提供的一種統(tǒng)一的地址格式,它為互聯(lián)網(wǎng)上的每一個網(wǎng)絡(luò)和每一臺主機分配一個邏輯地址,以此來屏蔽物理地址的差異。
IP規(guī)定網(wǎng)絡(luò)上所有的設(shè)備都必須有一個獨一無二的IP地址,就好比是郵件上都必須注明收件人地址。但是一臺設(shè)備理論上可以有多個IP地址。

IP地址:IP地址是一個32位的二進制數(shù),通常被分割為4個“8位二進制數(shù)”(也就是4個字節(jié))。IP地址通常用“點分十進制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之間的十進制整數(shù)。

獲取IP的幾種方式
一、請求第三方獲取

http://119.29.29.29/d?dn=www.baidu.com&ttl=1,講www.baidu.com換成其他域名,即可請求獲取到該域名的ip地址。

我們可以看到,百度不只有一個ip,這是CDN的關(guān)系(自己下去查)

二、根據(jù)私有API獲取

(筆者只考慮了iOS11以上的版本)
_timingData私有屬性,分別可以從NSURLConnection和NSURLSessionTask對象中獲取,(NSURLConnection 需要iOS12的版本支持)
需要注意的是,私有API有被拒審的風(fēng)險,慎用~要做一些特殊處理,比如通過runtime的方式執(zhí)行獲取,或者對_timingData進行encode處理過機審。

iOS 13以上,NSURLSessionTask可以通過task的代理直接獲取,光明正大的拿到ip地址。
NSURLSessionTaskTransactionMetrics.remoteAddress

優(yōu)勢:這種方式有一個極大的好處,就是和本次請求綁定在一次,不需要增加請求的次數(shù),給APP增加流量上的負擔(dān)。
劣勢:如果用戶有連接代理,則會拿到代理的ip,這對我們統(tǒng)計來說是沒有意義的。

三、ping值獲取

(需要一次極小的請求,直接獲取到當(dāng)前請求遠端ip,但是可能會有一些偏差,因為ping相當(dāng)于一次請求,和真實的請求IP可能會存在偏差)

獲取時長約為35ms(和網(wǎng)絡(luò)環(huán)境正相關(guān),very bad的網(wǎng)絡(luò)可能會達到1秒以上)
具體方案參考如下:
https://kangzubin.com/apple-sample-code-simpleping/
https://learnku.com/articles/23788

蘋果ping的地址:https://developer.apple.com/library/archive/samplecode/SimplePing/Listings/Common_SimplePing_m.html#//apple_ref/doc/uid/DTS10000716-Common_SimplePing_m-DontLinkElementID_4

最終方案:

先判斷是否有代理,https://blog.csdn.net/potato512/article/details/88692127
判斷是否有代理,第一次約為5ms,之后為0.02ms。切換代理狀態(tài)時,也會增加時長為毫米級(2ms左右)
如果存在代理,使用ping工具獲??;如果不存在,使用私有API

IP存在獲取不到的情況,注意判空

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容