在douban應(yīng)用中,需要聯(lián)網(wǎng)是必須的,看書發(fā)現(xiàn),apple對(duì)于需要聯(lián)網(wǎng)的應(yīng)用要求很高,必須要進(jìn)行聯(lián)網(wǎng)檢查,現(xiàn)在還任務(wù)在身,但是忙中抽閑,看了看SCNetworkReachability,用于進(jìn)行聯(lián)網(wǎng)檢查的。下面記錄一下。
說明引用網(wǎng)上網(wǎng)友的,特此注明、、、
一.基本知識(shí)
在需要聯(lián)網(wǎng)的iphone程序中,我們首先需要檢查網(wǎng)絡(luò)的狀態(tài),如果不能連接網(wǎng)絡(luò)則告訴用戶程序不能使用的原因是沒有網(wǎng)絡(luò)連接。在iPhone的SystemConfiguration框架里有提供了和聯(lián)網(wǎng)相關(guān)的函數(shù),可以用來檢查網(wǎng)絡(luò)的連接狀態(tài)。
二.具體介紹
1.SCNetworkReachability介紹
SystemConfiguration框架中和測(cè)試網(wǎng)絡(luò)連接狀態(tài)相關(guān)的函數(shù)定義在SCNetworkReachability.H文件中,主要的函數(shù)有以下幾個(gè):
(1)創(chuàng)建測(cè)試連接的引用:
(a)SCNetworkReachabilityRef SCNetworkReachabilityCreateWithAddress (
CFAllocatorRef allocator,
const struct sockaddr *address
);
根據(jù)傳入的地址測(cè)試連接,第一個(gè)參數(shù)可以為NULL或kCFAllocatorDefault,第二個(gè)參數(shù)為需要測(cè)試連接的IP地址,當(dāng)為0.0.0.0時(shí)則可以查詢本機(jī)的網(wǎng)絡(luò)連接狀態(tài)。同時(shí)返回一個(gè)引用必須在用完后釋放。
(b)SCNetworkReachabilityRef SCNetworkReachabilityCreateWithName (
CFAllocatorRef allocator,
const char *nodename
);
這個(gè)是根據(jù)傳入的網(wǎng)址測(cè)試連接,第二個(gè)參數(shù)比如為"www.apple.com",其他和上一個(gè)一樣。
(2)確定連接的狀態(tài):
Boolean SCNetworkReachabilityGetFlags (
SCNetworkReachabilityRef target,
SCNetworkReachabilityFlags *flags
);
這個(gè)函數(shù)用來獲得測(cè)試連接的狀態(tài),第一個(gè)參數(shù)為之前建立的測(cè)試連接的引用,第二個(gè)參數(shù)用來保存獲得的狀態(tài),如果能獲得狀態(tài)則返回TRUE,否則返回FALSE
(3)主要的數(shù)據(jù)類型介紹:
SCNetworkReachabilityRef:用來保存創(chuàng)建測(cè)試連接返回的引用
(4)主要常量介紹:
SCNetworkReachabilityFlags:保存返回的測(cè)試連接狀態(tài)
其中常用的狀態(tài)有:
kSCNetworkReachabilityFlagsReachable:能夠連接網(wǎng)絡(luò)
kSCNetworkReachabilityFlagsConnectionRequired:能夠連接網(wǎng)絡(luò),但是首先得建立連接過程
kSCNetworkReachabilityFlagsIsWWAN:判斷是否通過蜂窩網(wǎng)覆蓋的連接,比如EDGE,GPRS或者目前的3G.主要是區(qū)別通過WiFi的連接。
2.代碼例子
因此判斷是否已經(jīng)聯(lián)網(wǎng)的代碼例子可以如下所示:
+ (BOOL) connectedToNetwork
{
//創(chuàng)建零地址,0.0.0.0的地址表示查詢本機(jī)的網(wǎng)絡(luò)連接狀態(tài)
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;
//獲得連接的標(biāo)志
BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
CFRelease(defaultRouteReachability);
//如果不能獲取連接標(biāo)志,則不能連接網(wǎng)絡(luò),直接返回
if (!didRetrieveFlags)
{
return NO;
}
//根據(jù)獲得的連接標(biāo)志進(jìn)行判斷
BOOL isReachable = flags & kSCNetworkFlagsReachable;
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
return (isReachable && !needsConnection) ? YES : NO;
}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注