先來看一下整個方法
- (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的連接。