iphone判断当前网络连接类型WIF、WWAN、2G和3G

在 apple 管网sample code的Reachability只能区分出无网络、wifi和wwan(2G&2.5G&3G)类型的网络连接类型,只需重构networkStatusForFlags方法,即可详细区分出2G与3G网络 。


首先 去 apple 管网下载demo ,

Reachability地址:http://developer.apple.com/library/ios/#samplecode/Reachability/Listings/Classes_Reachability_m.html


然后打开工程
修改Reachability.m 中 networkStatusForFlags 方法重构
[html]  view plain copy
  1. - (NetworkStatus) networkStatusForFlags: (SCNetworkReachabilityFlags) flags  
  2.   
  3. {  
  4.       
  5.     if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)  
  6.           
  7.     {  
  8.        
  9.         return NotReachable;  
  10.          
  11.     }  
  12.   
  13.     BOOL retVal = NotReachable;  
  14.     
  15.     if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)  
  16.          
  17.     {  
  18.           
  19.         // if target host is reachable and no connection is required  
  20.           
  21.         //  then we'll assume (for now) that your on Wi-Fi  
  22.           
  23.         retVal = ReachableViaWiFi;  
  24.           
  25.     }  
  26.   
  27.     if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||  
  28.            
  29.          (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))  
  30.            
  31.     {  
  32.            
  33.         // ... and the connection is on-demand (or on-traffic) if the  
  34.           
  35.         //     calling application is using the CFSocketStream or higher APIs  
  36.            
  37.         if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)  
  38.               
  39.         {  
  40.              
  41.             // ... and no [user] intervention is needed  
  42.                
  43.             retVal = ReachableViaWiFi;  
  44.               
  45.         }  
  46.            
  47.     }  
  48.       
  49.       
  50.      
  51.     if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)  
  52.           
  53.     {  
  54.           
  55.         if((flags & kSCNetworkReachabilityFlagsReachable) == kSCNetworkReachabilityFlagsReachable) {  
  56.               
  57.             if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {  
  58.                  
  59.                 retVal = ReachableVia3G;  
  60.                    
  61.                 if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired) {  
  62.                       
  63.                     retVal = ReachableVia2G;  
  64.                        
  65.                 }  
  66.                   
  67.             }  
  68.               
  69.         }  
  70.            
  71.     }  
  72.       
  73.     return retVal;  
  74.      
  75. }  

注意首先要在

Reachability.h中添加

[html]  view plain copy
  1. typedef enum {  
  2.     NotReachable = 0,  
  3.     ReachableViaWiFi,  
  4.     ReachableViaWWAN,  
  5.        <span style="color:#ff0000;"> ReachableVia2G,  
  6.         ReachableVia3Gspan>  
  7. } NetworkStatus;  
然后在

ReachabilityAppDelegate.m的

[html]  view plain copy
  1. - (void) configureTextField: (UITextField*) textField imageView: (UIImageView*) imageView reachability: (Reachability*) curReach  
  2. {  
  3.     NetworkStatus netStatus = [curReach currentReachabilityStatus];  
  4.     BOOL connectionRequired= [curReach connectionRequired];  
  5.     NSString* statusString= @"";  
  6.     switch (netStatus)  
  7.     {  
  8.         case NotReachable:  
  9.         {  
  10.             statusString = @"Access Not Available";  
  11.             imageView.image = [UIImage imageNamed: @"stop-32.png"] ;  
  12.             //Minor interface detail- connectionRequired may return yes, even when the host is unreachable.  We cover that up here...  
  13.             connectionRequiredNO;    
  14.             break;  
  15.         }  
  16.               
  17.         case ReachableViaWWAN:  
  18.         {  
  19.             statusString = @"Reachable WWAN";  
  20.             imageView.image = [UIImage imageNamed: @"WWAN5.png"];  
  21.             break;  
  22.         }  
  23.         case ReachableViaWiFi:  
  24.         {  
  25.              statusString= @"Reachable WiFi";  
  26.             imageView.image = [UIImage imageNamed: @"Airport.png"];  
  27.             break;  
  28.       }  
  29.      <span style="color:#ff0000;">       case ReachableVia2G:  
  30.         {  
  31.             statusString= @"2G";  
  32.             imageView.image = [UIImage imageNamed: @"Airport.png"];  
  33.             break;  
  34.         }  
  35.         case ReachableVia3G:  
  36.         {  
  37.             statusString= @"3G";  
  38.             imageView.image = [UIImage imageNamed: @"Airport.png"];  
  39.             break;  
  40.         }span>  
  41.     }  
  42.     if(connectionRequired)  
  43.     {  
  44.         statusString= [NSString stringWithFormat: @"%@, Connection Required", statusString];  
  45.     }  
  46.     textField.textstatusString;  
  47. }  

然后就ok了。



WIFI如下:


[html]  view plain copy
  1. //检查当前网络连接是否正常  
  2. -(BOOL)connectedToNetWork  
  3. {  
  4.       
  5.     struct sockaddr_in zeroAddress;  
  6.       
  7.     bzero(&zeroAddress, sizeof(zeroAddress));  
  8.       
  9.     zeroAddress.sin_len = sizeof(zeroAddress);  
  10.       
  11.     zeroAddress.sin_family = AF_INET;  
  12.       
  13.     SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);  
  14.       
  15.     SCNetworkReachabilityFlags flags;  
  16.       
  17.     BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);  
  18.       
  19.     CFRelease(defaultRouteReachability);  
  20.       
  21.     if (!didRetrieveFlags) {  
  22.           
  23.         printf("Error. Count not recover network reachability flags\n");  
  24.           
  25.         return NO;  
  26.           
  27.     }  
  28.       
  29.     BOOL isReachable = flags & kSCNetworkFlagsReachable;  
  30.       
  31.     BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;  
  32.       
  33.     return (isReachable && !needsConnection) ? YES : NO;  
  34.       
  35. }  
  36.   
  37. //检查网络连接类型  
  38.   
  39. -(void)checkNetworktype:(id)sender{  
  40.       
  41.     NSString *connectionKind;  
  42.       
  43.     if ([self connectedToNetWork]) {  
  44.           
  45.         hostReach = [Reachability reachabilityWithHostName:@"www.google.com"];  
  46.           
  47.         switch ([hostReach currentReachabilityStatus]) {  
  48.                   
  49.             case NotReachable:  
  50.                   
  51.                 connectionKind = @"没有网络链接";  
  52.                   
  53.                 break;  
  54.                   
  55.             case ReachableViaWiFi:  
  56.                   
  57.                 connectionKind = @"当前使用的网络类型是WIFI";  
  58.                   
  59.                 break;  
  60.                   
  61.             case ReachableVia3G:  
  62.                   
  63.                 connectionKind = @"当前使用的网络链接类型是WWAN(3G)";  
  64.                   
  65.                 break;  
  66.                   
  67.             case ReachableVia2G:  
  68.                   
  69.                 connectionKind = @"当前使用的网络链接类型是WWAN(2G)";  
  70.                   
  71.                 break;  
  72.                   
  73.             default:  
  74.                   
  75.                 break;  
  76.                   
  77.         }  
  78.           
  79.     }else {  
  80.           
  81.         connectionKind = @"没有网络链接";  
  82.     }}  

你可能感兴趣的:(iphone判断当前网络连接类型WIF、WWAN、2G和3G)