2, #import<SystemConfiguration/SystemConfiguration.h>
#import<netdb.h>
3, 源代码如下:
- (BOOL) connectedToNetWork { //创建零地址,0.0.0.0的地址表示查询本机的网络连接状态 struct sockaddr_in zeroAddress; bzero(&zeroAddress, sizeof(zeroAddress)); zeroAddress.sin_len = sizeof(zeroAddress); zeroAddress.sin_family = AF_INET; /** * SCNetworkReachabilityRef: 用来保存创建测试连接返回的引用 * * SCNetworkReachabilityCreateWithAddress: 根据传入的地址测试连接. * 第一个参数可以为NULL或kCFAllocatorDefault * 第二个参数为需要测试连接的IP地址,当为0.0.0.0时则可以查询本机的网络连接状态 * 同时返回一个引用必须在用完后释放 * PS: SCNetworkReachabilityCreateWithName: 这是个根据传入的网络测试连接, * 第二个参数比如为“www.apple.com”,其他和上一个一样 * * SCNetworkReachabilityGetFlags:这个函数用来获得测试连接的状态, * 第一个参数为之前建立的测试连接的引用, * 第二个参数用来保存获得的状态, * 如果能获得状态则返回TRUE,否则返回FALSE。 * */ SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress); SCNetworkReachabilityFlags flags; BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags); CFRelease(defaultRouteReachability); if (!didRetrieveFlags) { printf("Error. Could not recover network reachability flags"); return NO; } /** * kSCNetworkReachabilityFlagsReachable: 能够连接网络 * kSCNetworkReachabilityFlagsConnectionRequired: 能够连接网络,但是首先得建立连接过程 * kSCNetworkReachabilityFlagsIsWWAN: 判断是否通过蜂窝网覆盖的连接, * 比如EDGE,GPRS或者目前的3G.主要是区别通过WiFi的连接 */ BOOL isReachable = ((flags & kSCNetworkReachabilityFlagsReachable) != 0); BOOL needsConnection = ((flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0); return (isReachable && !needsConnection) ? YES : NO; }
当然,可以使用每秒检测一次
[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(testWeb) userInfo:nil repeats:YES]; -(void)testWeb{ NSString *result; if ([self connectedToNetWork]) { result = @"Connection Successed!!!"; }else { result = @"Connection Faild!!!"; } NSLog(@"result:%@",result); }