2009-10-18 88 views
0

我正在使用以下代碼來確定互聯網連接是否存在。iPhone - 檢查互聯網連接是否可用

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) { 
    NSLog(@"Error. Could not recover network reachability flags"); 
    return 0; 
} 
BOOL isReachable = flags & kSCNetworkFlagsReachable; 
BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired; 
return (isReachable && !needsConnection) ? YES : NO; 

此方法返回我的設備連接到wifi網絡時的預期結果。但是,如果我在3G或邊緣網絡上測試相同的方法,則返回NO(即未連接到互聯網)

任何想法爲什麼?

謝謝。

+1

有爲什麼你需要預檢這個特別的理由檢查?蘋果的建議並不是:繼續嘗試談談你需要談論的內容,並且準備好處理可達性結果。 iPhone上的網絡條件可能非常短暫。 – 2009-10-19 01:05:07

+0

我想根據不同的條件顯示不同的輸出 - 如果服務器出現問題,信息會有所不同,如果沒有互聯網連接,它會再次不同 – lostInTransit 2009-10-19 02:58:15

回答

0

問題是,您沒有主動連接,蜂窩調制解調器斷電(它在幾秒鐘不活動之後執行)。如果你看着你,你會看到needsConnection是YES。任何更高級別的API(CFNetwork,NSURLConnection)都會自動建立連接。

您可以通過檢查kSCNetworkReachabilityFlagsIsWWAN密鑰來測試以查看是否有蜂窩可用。