SCNetworkReachabilityRef監(jiān)測(cè)網(wǎng)絡(luò)狀態(tài)

SCNetworkReachabilityRef接口可以確定當(dāng)前主機(jī)的網(wǎng)絡(luò)狀態(tài)以及目標(biāo)主機(jī)的可達(dá)性, 可達(dá)性是指data packet(數(shù)據(jù)包)可以從當(dāng)前主機(jī)發(fā)送出去, 而不是目標(biāo)主機(jī)可以接收到data packet(數(shù)據(jù)包).

SCNetworkReachabilityRef接口有同步和異步兩種模式.
在同步模式下, 可以通過SCNetworkReachabilityGetFlags方法獲取網(wǎng)絡(luò)狀態(tài);
在異步模式下, 可以調(diào)度一個(gè)SCNetworkReachability對(duì)象到客戶端的運(yùn)行循環(huán)上, 客戶端實(shí)現(xiàn)一個(gè)回調(diào)函數(shù)接收網(wǎng)絡(luò)狀態(tài)變化的通知, 這個(gè)回調(diào)函數(shù)遵循Core Foundation命名規(guī)范, 只要函數(shù)名中包含 "Create" 或 "Copy"的函數(shù)返回的引用,都必須調(diào)用CFRelease來釋放。

SCNetworkReachabilityRef中幾個(gè)主要的方法和屬性:

SCNetworkReachabilityContext結(jié)構(gòu)體

typedef struct {
    CFIndex     version;
    void *      __nullable info;
    const void  * __nonnull (* __nullable retain)(const void *info);
    void        (* __nullable release)(const void *info);
    CFStringRef __nonnull (* __nullable copyDescription)(const void *info);
} SCNetworkReachabilityContext;

結(jié)構(gòu)體中包含用戶指定的數(shù)據(jù)信息和用于SCNetworkReachabilitySetCallback方法的回調(diào)info.
version為版本號(hào), 作為參數(shù)傳遞給SCDynamicStore創(chuàng)建結(jié)構(gòu)體類型的版本號(hào). 這個(gè)結(jié)構(gòu)體的版本號(hào)為0.
info是一個(gè)C語(yǔ)言的指針對(duì)象, 這里一般傳入當(dāng)網(wǎng)絡(luò)狀態(tài)發(fā)生改變時(shí)執(zhí)行的block回調(diào), 個(gè)人理解為C語(yǔ)言的指針不在ARC的管理范圍內(nèi), 需要手動(dòng)管理內(nèi)存, 所以這里傳入release inforetain info用于管理內(nèi)存.
這個(gè)結(jié)構(gòu)體需要在SCNetworkReachabilitySetCallback設(shè)置才能起作用.

創(chuàng)建網(wǎng)絡(luò)連接引用

SCNetworkReachabilityRef SCNetworkReachabilityCreateWithAddress(CFAllocatorRef allocator, const struct sockaddr *address);

通過傳入需要測(cè)試的IP地址創(chuàng)建網(wǎng)絡(luò)連接引用, allocator可以設(shè)置為NULL或者kCFAllocatorDefault.

SCNetworkReachabilityRef SCNetworkReachabilityCreateWithName(CFAllocatorRef allocator, const char *nodename);

通過傳入需要測(cè)試的網(wǎng)址創(chuàng)建網(wǎng)絡(luò)連接引用, 同上個(gè)方法.

獲取網(wǎng)絡(luò)連接狀態(tài)

Boolean SCNetworkReachabilityGetFlags(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags *flags);

用于獲取網(wǎng)絡(luò)連接的狀態(tài), 傳入的第一個(gè)參數(shù)是SCNetworkReachabilityRef網(wǎng)絡(luò)連接引用, 第二個(gè)參數(shù)用來保存獲取的網(wǎng)絡(luò)連接狀態(tài), 如果能獲取到連接就返回true否則返回false.

網(wǎng)絡(luò)狀態(tài)改變時(shí)的通知

Boolean SCNetworkReachabilitySetCallback(SCNetworkReachabilityRef target, SCNetworkReachabilityCallBack callout, SCNetworkReachabilityContext *context);

當(dāng)網(wǎng)絡(luò)狀態(tài)發(fā)生變化時(shí), 就會(huì)調(diào)用callout, 第一個(gè)參數(shù)是網(wǎng)絡(luò)連接引用, 第二個(gè)參數(shù)是回調(diào), 如果為NULL, 當(dāng)前的target就會(huì)被移除, SCNetworkReachabilityCallBack的類型為(typedef void (*SCNetworkReachabilityCallBack)(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags flags, void *info);) callout回調(diào)中的info參數(shù)就是從第三個(gè)參數(shù)context結(jié)構(gòu)體中取的info回調(diào), 這樣就把結(jié)構(gòu)體context中的數(shù)據(jù)傳到了SCNetworkReachabilityCallBack參數(shù)中, 第三個(gè)參數(shù)是與callout相關(guān)聯(lián)的上下文, 可能為空. 如果通知客戶端成功就返回true, 否則返回false.

Boolean SCNetworkReachabilityScheduleWithRunLoop(SCNetworkReachabilityRef target, CFRunLoopRef runLoop, CFStringRef runLoopMode);

使用指定的運(yùn)行循環(huán)和模式調(diào)度指定的網(wǎng)絡(luò)目標(biāo), 第一個(gè)參數(shù)是網(wǎng)絡(luò)連接引用, 第二個(gè)參數(shù)runloop循環(huán), 第三個(gè)參數(shù)循環(huán)模式. 如果target運(yùn)行成功就返回true, 否則返回false.
這里將target加入指定的runloop中, 會(huì)一直監(jiān)測(cè)target的網(wǎng)絡(luò)狀態(tài), 當(dāng)網(wǎng)絡(luò)狀態(tài)發(fā)生變化時(shí)就會(huì)執(zhí)行SCNetworkReachabilitySetCallback方法中的callout回調(diào), 所以我們只需要定義一個(gè)SCNetworkReachabilityCallBack類型的block, 將其傳入SCNetworkReachabilitySetCallback方法中即可.

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

相關(guān)閱讀更多精彩內(nèi)容

  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 14,316評(píng)論 0 15
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,612評(píng)論 19 139
  • 昨天朋友從老家來汕頭看生病的老爸,然后約了一起吃飯,一下子說她爸70歲了,我突然一愣,這么快就70歲了,哦,我自己...
    奔騰君閱讀 224評(píng)論 0 0
  • (第八天打卡) 8月8號(hào)是中國(guó)第一越劇女小生——茅威濤的生日,作為中國(guó)第二大劇種的越劇,浸潤(rùn)著江浙文化從...
    一花亦真閱讀 643評(píng)論 4 8
  • 01. Inverse of AB and A-transpose 02. A = LU (no row exch...
    孫寅閱讀 266評(píng)論 0 0

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