轉載自:http://dev.10086.cn/cmdn/bbs/thread-12475-1-1.html
一.基本知識
在需要聯網的iPhone程序中,我們首先需要檢查網絡的狀態,如果不能連接網絡則告訴用戶程序不能使用的原因是沒有網絡連接。在iPhone的SystemConfiguration框架裏有提供了和聯網相關的函數,可以用來檢查網絡的連接狀態。
二.具體介紹
1.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的連接。
2.代碼例子
因此判斷是否已經聯網的代碼例子可以如下所示:
+ (BOOL) connectedToNetwork
{
//創建零地址,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)
{
return NO;
}
//根據獲得的連接標誌進行判斷
BOOL isReachable = flags & kSCNetworkFlagsReachable;
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
return (isReachable && !needsConnection) ? YES : NO;
}