iOS开发之判断具体当前网络类型(2G网络还是3G网络)

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

  1. //Reachability.m 中 networkStatusForFlags 方法重构
  2. - (NetworkStatus) networkStatusForFlags: (SCNetworkReachabilityFlags) flags
  3. {
  4.         if ((flags & kSCNetworkReachabilityFlagsReachable) == 0)
  5.         {
  6.                 return NotReachable;
  7.         }
  8.     
  9.         BOOL retVal = NotReachable;
  10.         
  11.         if ((flags & kSCNetworkReachabilityFlagsConnectionRequired) == 0)
  12.         {
  13.                 // if target host is reachable and no connection is required
  14.                 //  then we'll assume (for now) that your on Wi-Fi
  15.                 retVal = ReachableViaWiFi;
  16.         }
  17.         
  18.         
  19.         if ((((flags & kSCNetworkReachabilityFlagsConnectionOnDemand ) != 0) ||
  20.          (flags & kSCNetworkReachabilityFlagsConnectionOnTraffic) != 0))
  21.         {
  22.         // ... and the connection is on-demand (or on-traffic) if the
  23.         //     calling application is using the CFSocketStream or higher APIs
  24.         if ((flags & kSCNetworkReachabilityFlagsInterventionRequired) == 0)
  25.         {
  26.             // ... and no [user] intervention is needed
  27.             retVal = ReachableViaWiFi;
  28.         }
  29.     }
  30.     
  31.     if ((flags & kSCNetworkReachabilityFlagsIsWWAN) == kSCNetworkReachabilityFlagsIsWWAN)
  32.         {
  33.         if((flags & kSCNetworkReachabilityFlagsReachable) == kSCNetworkReachabilityFlagsReachable) {
  34.             if ((flags & kSCNetworkReachabilityFlagsTransientConnection) == kSCNetworkReachabilityFlagsTransientConnection) {
  35.                 retVal = ReachableVia3G;
  36.                 if((flags & kSCNetworkReachabilityFlagsConnectionRequired) == kSCNetworkReachabilityFlagsConnectionRequired) {
  37.                     retVal = ReachableVia2G;
  38.                 }
  39.             }
  40.         }
  41.         }
  42.         return retVal;
  43. }

  44. //检查当前网络连接是否正常
  45. -(BOOL)connectedToNetWork
  46. {
  47.         struct sockaddr_in zeroAddress;
  48.         bzero(&zeroAddress, sizeof(zeroAddress));
  49.         zeroAddress.sin_len = sizeof(zeroAddress);
  50.         zeroAddress.sin_family = AF_INET;
  51.         
  52.         SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
  53.         SCNetworkReachabilityFlags flags;
  54.         
  55.         BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
  56.         CFRelease(defaultRouteReachability);
  57.         
  58.         if (!didRetrieveFlags) {
  59.                 printf("Error. Count not recover network reachability flags\n");
  60.                 return NO;
  61.         }
  62.         
  63.         BOOL isReachable = flags & kSCNetworkFlagsReachable;
  64.         BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
  65.         return (isReachable && !needsConnection) ? YES : NO;
  66. }

  67. //检查网络连接类型
  68. -(void)checkNetworktype:(id)sender{
  69.     NSString *connectionKind;
  70.     if ([self connectedToNetWork]) {
  71.                 hostReach = [Reachability reachabilityWithHostName:@"www.google.com"];
  72.         switch ([hostReach currentReachabilityStatus]) {
  73.             case NotReachable:
  74.                 connectionKind = @"没有网络链接";
  75.                 break;
  76.             case ReachableViaWiFi:
  77.                 connectionKind = @"当前使用的网络类型是WIFI";
  78.                 break;
  79.             case ReachableVia3G:
  80.                 connectionKind = @"当前使用的网络链接类型是WWAN(3G)";
  81.                 break;
  82.             case ReachableVia2G:
  83.                 connectionKind = @"当前使用的网络链接类型是WWAN(2G)";
  84.                 break;    
  85.             default:
  86.                 break;
  87.         }
  88.         }else {
  89.                 connectionKind = @"没有网络链接";
  90.         }
  91. }
复制代码


文章来源: http://www.oschina.net/code/snippet_588197_11928
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值