iOS測速

前言

最近遇到一個(gè)需求(其實(shí)是閑著無聊)浓镜,需要在客戶端上實(shí)時(shí)顯示當(dāng)前的上行速度和下行速度和網(wǎng)絡(luò)類型扣墩。目前關(guān)于iOS測速的文章和demo網(wǎng)上一搜一大堆萨惑,基本上使用的方法都一致更舞,這里只是對這些方法做出總結(jié)劈猿。

我們常說的網(wǎng)速是什么拙吉?

為了解釋這個(gè)名詞,我專門搜索了我國最大的網(wǎng)絡(luò)百科全書:百度百科揪荣。果不其然筷黔,百度百科早就收錄了“網(wǎng)速”這個(gè)詞條。并且通過了“科普中國”百科科學(xué)詞條編寫與應(yīng)用工作項(xiàng)目的審核仗颈,收到了1873位網(wǎng)友的點(diǎn)贊和39次轉(zhuǎn)發(fā)佛舱。

網(wǎng)速詞條

“網(wǎng)速一般是指電腦或手機(jī)上網(wǎng)時(shí)椎例,上傳和下載數(shù)據(jù)時(shí),請求和返回?cái)?shù)據(jù)所用的時(shí)間長短请祖《┩幔”這句話可以分開兩部分理解。上傳數(shù)據(jù)時(shí)肆捕,請求所用的時(shí)間長短刷晋,和下載數(shù)據(jù)時(shí),返回?cái)?shù)據(jù)所用的時(shí)間長短慎陵。這其中眼虱,數(shù)據(jù)量和時(shí)間的比值,就是網(wǎng)速席纽。


計(jì)算公式

比如下載或上傳一個(gè)10KB的文件捏悬,需要1秒,則網(wǎng)速為10KB/S

題外話:作為蘋果用戶润梯,非常羨慕安卓系統(tǒng)能在狀態(tài)欄上顯示實(shí)時(shí)的上下載速度过牙。而iOS系統(tǒng),只能用一種曲線救國的方式:weight纺铭。什么寇钉?你不知道weight?拿起你的手機(jī)彤蔽,使勁向左滑摧莽,這個(gè)界面上的小框框就是weight庙洼。


weight

圖中的SYS Pro這個(gè)應(yīng)用顿痪,就能在weight中實(shí)時(shí)顯示網(wǎng)速。

如何測速

方法一

有了公式油够,我們就能很很輕松的計(jì)算出當(dāng)前網(wǎng)速蚁袭。

公式中有兩個(gè)變量,“數(shù)據(jù)量”和“時(shí)間”石咬。固定某一變量揩悄,統(tǒng)計(jì)另一變量的變化量。如固定時(shí)間鬼悠,統(tǒng)計(jì)在單位時(shí)間內(nèi)(假設(shè)為1秒)删性,最大的下載數(shù)據(jù)量,就能得到當(dāng)前下行速度焕窝。而固定數(shù)據(jù)量蹬挺,統(tǒng)計(jì)下載時(shí)間,也能算出下行速度它掂,但是需要注意的是巴帮,這時(shí)候算出的值為平均速度,并不是單位時(shí)間內(nèi)的下載速度。

這種方式的優(yōu)點(diǎn)自然是算出來的值比較準(zhǔn)確榕茧。而缺點(diǎn)是需要消耗一定的流量垃沦,在當(dāng)時(shí)5元30M的年代(現(xiàn)在依舊是5元30M),用戶估計(jì)要怒刪應(yīng)用了用押。
還有一個(gè)缺點(diǎn)是一個(gè)TCP連接可能無法充分利用當(dāng)前網(wǎng)絡(luò)肢簿,需要多個(gè)鏈接一起榨干網(wǎng)絡(luò)。

方法二

這個(gè)需求需要實(shí)時(shí)的顯示網(wǎng)速蜻拨,所以方法一不太行得通译仗。那如何獲取當(dāng)前實(shí)時(shí)的網(wǎng)速呢?那就要祭出Uinx結(jié)構(gòu)體:ifaddrs這個(gè)結(jié)構(gòu)體在頭文件ifaddrs.h中定義官觅,能獲取所有網(wǎng)卡的數(shù)據(jù)纵菌。
詳細(xì)如下

struct ifaddrs {
    struct ifaddrs  *ifa_next;     /* Next item in list */
    char            *ifa_name;     /* Name of interface 端口名稱*/
    unsigned int     ifa_flags;    /* Flags from SIOCGIFFLAGS 接口標(biāo)志*/
    struct sockaddr *ifa_addr;     /* Address of interface 本機(jī)IP*/
    struct sockaddr *ifa_netmask;  /* Netmask of interface 子網(wǎng)掩碼*/
    struct sockaddr *ifa_dstaddr;  /* Point-to-point destination address 對端地址*/
    void            *ifa_data;     /* Address-specific data 接口信息數(shù)據(jù)*/
};

這個(gè)結(jié)構(gòu)體的詳細(xì)描述可以查看這個(gè)網(wǎng)頁:ifaddrs

其中的ifa_data中的ifi_ibytesifi_obytes就是我們需要的數(shù)據(jù)。

/*
 * Structure describing information about an interface
 * which may be of interest to management entities.
 */
struct if_data {
    /* generic interface information */
    u_char      ifi_type;       /* ethernet, tokenring, etc */
    u_char      ifi_typelen;    /* Length of frame type id */
    u_char      ifi_physical;   /* e.g., AUI, Thinnet, 10base-T, etc */
    u_char      ifi_addrlen;    /* media address length */
    u_char      ifi_hdrlen;     /* media header length */
    u_char      ifi_recvquota;  /* polling quota for receive intrs */
    u_char      ifi_xmitquota;  /* polling quota for xmit intrs */
    u_char      ifi_unused1;    /* for future use */
    u_int32_t   ifi_mtu;        /* maximum transmission unit */
    u_int32_t   ifi_metric;     /* routing metric (external only) */
    u_int32_t   ifi_baudrate;   /* linespeed */
    /* volatile statistics */
    u_int32_t   ifi_ipackets;   /* packets received on interface */
    u_int32_t   ifi_ierrors;    /* input errors on interface */
    u_int32_t   ifi_opackets;   /* packets sent on interface */
    u_int32_t   ifi_oerrors;    /* output errors on interface */
    u_int32_t   ifi_collisions; /* collisions on csma interfaces */
    u_int32_t   ifi_ibytes;     /* total number of octets received */
    u_int32_t   ifi_obytes;     /* total number of octets sent */
    u_int32_t   ifi_imcasts;    /* packets received via multicast */
    u_int32_t   ifi_omcasts;    /* packets sent via multicast */
    u_int32_t   ifi_iqdrops;    /* dropped on input, this interface */
    u_int32_t   ifi_noproto;    /* destined for unsupported protocol */
    u_int32_t   ifi_recvtiming; /* usec spent receiving when timing */
    u_int32_t   ifi_xmittiming; /* usec spent xmitting when timing */
    struct IF_DATA_TIMEVAL ifi_lastchange;  /* time of last administrative change */
    u_int32_t   ifi_unused2;    /* used to be the default_proto */
    u_int32_t   ifi_hwassist;   /* HW offload capabilities */
    u_int32_t   ifi_reserved1;  /* for future use */
    u_int32_t   ifi_reserved2;  /* for future use */
};

只要讀取上一秒網(wǎng)卡中的流量使用情況休涤,再讀取當(dāng)前的流量使用情況咱圆,就可以計(jì)算出網(wǎng)速。

針對第二種情況功氨,用OC寫了一個(gè)簡單的Demo序苏,放在:https://github.com/OYQ/OYTool/tree/master/OYNetSpeedTool-Objc

  • 需要注意的是,demo中并不是每一秒計(jì)算一次網(wǎng)速捷凄,而是每兩秒計(jì)算一次忱详,因?yàn)槿粘J褂弥胁⒉恍枰珳?zhǔn)的計(jì)算,并且大量的計(jì)算會(huì)消耗性能跺涤。

參考資料

iOS如何進(jìn)行網(wǎng)絡(luò)測速-Joy__
iOS 網(wǎng)速測試-godBlessMe__
IOS網(wǎng)速測試-角燈的技術(shù)博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末匈睁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子桶错,更是在濱河造成了極大的恐慌航唆,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件院刁,死亡現(xiàn)場離奇詭異糯钙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)退腥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門任岸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人狡刘,你說我怎么就攤上這事享潜。” “怎么了颓帝?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵米碰,是天一觀的道長窝革。 經(jīng)常有香客問我,道長吕座,這世上最難降的妖魔是什么虐译? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮吴趴,結(jié)果婚禮上漆诽,老公的妹妹穿的比我還像新娘。我一直安慰自己锣枝,他們只是感情好厢拭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著撇叁,像睡著了一般供鸠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上陨闹,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天楞捂,我揣著相機(jī)與錄音,去河邊找鬼趋厉。 笑死寨闹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的君账。 我是一名探鬼主播繁堡,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼乡数!你這毒婦竟也來了椭蹄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤瞳脓,失蹤者是張志新(化名)和其女友劉穎塑娇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劫侧,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年哨啃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了烧栋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拳球,死狀恐怖审姓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情祝峻,我是刑警寧澤魔吐,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布扎筒,位于F島的核電站,受9級(jí)特大地震影響酬姆,放射性物質(zhì)發(fā)生泄漏嗜桌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一辞色、第九天 我趴在偏房一處隱蔽的房頂上張望骨宠。 院中可真熱鬧,春花似錦相满、人聲如沸层亿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽匿又。三九已至,卻和暖如春建蹄,著一層夾襖步出監(jiān)牢的瞬間琳省,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工躲撰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留针贬,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓拢蛋,卻偏偏與公主長得像桦他,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子谆棱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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

  • 與自然生態(tài)系統(tǒng)中的物種一樣快压,商業(yè)生態(tài)系統(tǒng)中的每一個(gè)環(huán)節(jié)都是整個(gè)商業(yè)生態(tài)系統(tǒng)的一部分,每一家企業(yè)最終都 要與整個(gè)商業(yè)...
    Task任務(wù)閱讀 346評(píng)論 0 0
  • 不知道人的靈魂是否都是完整的 還是只有我 像個(gè)病態(tài)般的失眠 在深夜里尋找著自己 在電影小說里尋找著 內(nèi)心缺失的那一...
    貓爺不是貓閱讀 165評(píng)論 0 0
  • 同學(xué)們都非常積極踴躍垃瞧,并按時(shí)回道宿舍參加比武大賽蔫劣。五二班、六二班的班主任也作為評(píng)委出席我們的活動(dòng) 个从。
    姜志萍閱讀 564評(píng)論 0 0