检测网络是否有效
//检测网络是否有效 - (BOOL) checkNetworkIsValid { struct sockaddr_in zeroAddress; bzero(&zeroAddress, sizeof(zeroAddress)); zeroAddress.sin_len = sizeof(zeroAddress); zeroAddress.sin_family = AF_INET; SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress); SCNetworkReachabilityFlags flags; BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags); CFRelease(defaultRouteReachability); if (!didRetrieveFlags) { return NO; } BOOL isReachable = flags & kSCNetworkFlagsReachable; BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired; // = flags & kSCNetworkReachabilityFlagsIsWWAN; BOOL nonWifi = flags & kSCNetworkReachabilityFlagsTransientConnection; BOOL moveNet = flags & kSCNetworkReachabilityFlagsIsWWAN; return ((isReachable && !needsConnection) || nonWifi || moveNet) ? YES : NO; }
#import "CheckNetwork.h" #import <netinet/in.h> #import <SystemConfiguration/SCNetworkReachability.h> @implementation CheckNetwork + (BOOL) connectedToNetwork { //创建零地址,0.0.0.0的地址表示查询本机的网络连接状态 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) { return NO; } //根据获得的连接标志进行判断 BOOL isReachable = flags & kSCNetworkFlagsReachable; BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired; BOOL isWWAN = flags & kSCNetworkReachabilityFlagsIsWWAN; return (isReachable && (!needsConnection || isWWAN)) ? YES : NO; }
检查是否连接VPN
//判断是否连接VPN导包#import <ifaddrs.h> - (BOOL)isVPNConnected { struct ifaddrs *interfaces = NULL; struct ifaddrs *temp_addr = NULL; int success = 0; // retrieve the current interfaces - returns 0 on success success = getifaddrs(&interfaces); if (success == 0) { // Loop through linked list of interfaces temp_addr = interfaces; while (temp_addr != NULL) { NSString *string = [NSString stringWithFormat:@"%s" , temp_addr->ifa_name]; if ([string rangeOfString:@"tap"].location != NSNotFound || [string rangeOfString:@"tun"].location != NSNotFound || [string rangeOfString:@"ppp"].location != NSNotFound){ return YES; } temp_addr = temp_addr->ifa_next; } } // Free memory freeifaddrs(interfaces); return NO; }