2009-10-18 59 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密钥来测试以查看是否有蜂窝可用。