我使用以下代码来确定是否存在互联网连接。
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或Edge网络上测试相同的方法,它会返回NO(即未连接到互联网)
任何想法为什么?
感谢。
答案 0 :(得分:6)
查看Apple的代码示例“Reachability”,并查看注释的顶部,了解如何在异步模式下使用它:
http://developer.apple.com/IPhone/library/samplecode/Reachability/index.html
答案 1 :(得分:0)
问题是你没有主动连接,蜂窝调制解调器断电(它在几秒钟不活动后就会发生)。如果你看着你,你会发现needConnection是YES。任何更高级别的API(CFNetwork,NSURLConnection)都将导致自动建立连接。
您可以通过检查kSCNetworkReachabilityFlagsIsWWAN密钥来测试您是否有蜂窝电话。