使用SCNetworkReachability判斷網絡是否連接


先來看一下整個方法

- (BOOL)isConnectionAvailable {
    //創建零地址,0.0.0.0的地址表示查詢本機的網絡連接狀態
    struct sockaddr_in zeroAddress;
    bzero(&zeroAddress, sizeof(zeroAddress));
    zeroAddress.sin_len = sizeof(zeroAddress);
    zeroAddress.sin_family = AF_INET;
    
    // Recover reachability flags
    SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
    SCNetworkReachabilityFlags flags;
    //獲得連接的標志
    BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
    CFRelease(defaultRouteReachability);
    //如果不能獲取連接標志,則不能連接網絡,直接返回
    if (!didRetrieveFlags)
    {
        DLog(@"Error. Could not recover network reachability flags");
        return NO;
    }
    //根據獲得的連接標志進行判斷
    BOOL isReachable = ((flags & kSCNetworkFlagsReachable) != 0);
    BOOL needsConnection = ((flags & kSCNetworkFlagsConnectionRequired) != 0);
    return (isReachable && !needsConnection) ? YES : NO;
}

 

在訪問網絡接口之前,只需要調用這個方法,就可以知道你手機的網絡是否可用。如果可用,返回YES 不是返回NO;

使用這個方法 需要導入

#import <SystemConfiguration/SystemConfiguration.h>
#import <netinet/in.h>

SCNetworkReachability介紹
SystemConfiguration框架中和測試網絡連接狀態相關的函數定義在SCNetworkReachability.H文件中,主要的函數有以下幾個:
(1)創建測試連接的引用:
(a)SCNetworkReachabilityRef SCNetworkReachabilityCreateWithAddress (
   CFAllocatorRef allocator,
   const struct sockaddr *address
);
根據傳入的地址測試連接,第一個參數可以為NULL或kCFAllocatorDefault,第二個參數為需要測試連接的IP地址,當為0.0.0.0時則可以查詢本機的網絡連接狀態。同時返回一個引用必須在用完后釋放。
(b)SCNetworkReachabilityRef SCNetworkReachabilityCreateWithName (
   CFAllocatorRef allocator,
   const char *nodename
);
這個是根據傳入的網址測試連接,第二個參數比如為"www.apple.com",其他和上一個一樣。
(2)確定連接的狀態:
Boolean SCNetworkReachabilityGetFlags (
   SCNetworkReachabilityRef target,
   SCNetworkReachabilityFlags *flags
);
這個函數用來獲得測試連接的狀態,第一個參數為之前建立的測試連接的引用,第二個參數用來保存獲得的狀態,如果能獲得狀態則返回TRUE,否則返回FALSE
(3)主要的數據類型介紹:
SCNetworkReachabilityRef:用來保存創建測試連接返回的引用
(4)主要常量介紹:
SCNetworkReachabilityFlags:保存返回的測試連接狀態
其中常用的狀態有:
kSCNetworkReachabilityFlagsReachable:能夠連接網絡
kSCNetworkReachabilityFlagsConnectionRequired:能夠連接網絡,但是首先得建立連接過程
kSCNetworkReachabilityFlagsIsWWAN:判斷是否通過蜂窩網覆蓋的連接,比如EDGE,GPRS或者目前的3G.主要是區別通過WiFi的連接。

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM