2011-10-29 55 views
101

我不确定这是否可能,但我有这种情况。iOS检测3G或WiFi

我有一个网站显示在我的UIWebView中有一个UISegmentedController设置的链接。 他们的网站可以检测到你是否在wifi上或在3G网络上。

现在分段控制器指向2个不同的页面。 1 - 一个iPhone友好登录屏幕 2 - 主页,一旦你登录

现在,这是一个问题:

我能否与其他应用程序来检测,如果它是在WiFi或3G(。我知道你可以做到这一点),但后来基于答案去段1或2

有点像这样:

if(iPhone device is on 3g) { 
    Go to Segment 1; 
} else { 
    Go to Segment 0; 
} 
+2

的可能重复的[iphone SDK检测WiFi和载波网络(http://stackoverflow.com/questions/1625158/iphone-sdk-detect-wifi-and-运营商网络) –

回答

204

使用代码苹果提供here

Reachability *reachability = [Reachability reachabilityForInternetConnection]; 
[reachability startNotifier]; 

NetworkStatus status = [reachability currentReachabilityStatus]; 

if(status == NotReachable) 
{ 
    //No internet 
} 
else if (status == ReachableViaWiFi) 
{ 
    //WiFi 
} 
else if (status == ReachableViaWWAN) 
{ 
    //3G 
} 
+0

是很酷的工作!必须做一些修正可达性文件,因为他们有iOS5的错误 - 但我现在很高兴。不幸的是,我只能给你1投票:-) –

+8

你有状态后不应该调用'[reachability stopNotifier]'吗? – zekel

+3

这取决于您使用此代码的范围。如果这只是一个方法,'reachability'将超出范围,并在方法结束时处理,'stopNotifier'将被隐式调用。 –

-1

使用这一个,内置可达性和易于使用,只需几行代码即可集成。有一个回调函数来告诉你什么时候该连接改变 http://huytd.github.io/datatify/

+0

这个使用再次可达性 – Stephan

8

我做了一个非常简单的基于块的可达性包装,去掉所有过时的类C可达代码,倒入一个更可可的形式。

用法,如:

[EPPZReachability reachHost:hostNameOrIPaddress 
       completition:^(EPPZReachability *reachability) 
{ 
    if (reachability.reachableViaCellular) [self doSomeLightweightStuff]; 
}]; 

eppz!blogReachability with blocks for everyday use,或直接从eppz!reachability at GitHub抓住它。

也适用于IP地址,这是一个非常罕见的Reachability包装功能。

+19

嗯为什么'截图'? – QED

+12

我从博客文章中得到它,眼睛糖果。 – Geri

+4

一个为“眼睛糖果”评论 – Dnaso

24

如果您不希望导入可达库或处理与发出通知,你可以使用这个简单的同步方法:

typedef enum { 
    ConnectionTypeUnknown, 
    ConnectionTypeNone, 
    ConnectionType3G, 
    ConnectionTypeWiFi 
} ConnectionType; 


+ (ConnectionType)connectionType 
{ 
    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, "8.8.8.8"); 
    SCNetworkReachabilityFlags flags; 
    BOOL success = SCNetworkReachabilityGetFlags(reachability, &flags); 
    CFRelease(reachability); 
    if (!success) { 
     return ConnectionTypeUnknown; 
    } 
    BOOL isReachable = ((flags & kSCNetworkReachabilityFlagsReachable) != 0); 
    BOOL needsConnection = ((flags & kSCNetworkReachabilityFlagsConnectionRequired) != 0); 
    BOOL isNetworkReachable = (isReachable && !needsConnection); 

    if (!isNetworkReachable) { 
     return ConnectionTypeNone; 
    } else if ((flags & kSCNetworkReachabilityFlagsIsWWAN) != 0) { 
     return ConnectionType3G; 
    } else { 
     return ConnectionTypeWiFi; 
    } 
} 
+0

要使用这个有用的代码,你必须#import 和链接到SystemConfiguration.framework。 – Dirk

+0

它帮助我从一个大问题,非常感谢 –

16

进口苹果的Reachability和尝试这个,

#import "Reachability.h" 
#import <CoreTelephony/CTTelephonyNetworkInfo.h> 

//Try this 
Reachability *reachability = [Reachability reachabilityForInternetConnection]; 
    [reachability startNotifier]; 

    NetworkStatus status = [reachability currentReachabilityStatus]; 

    if(status == NotReachable) 
    { 
     NSLog(@"none"); 
     //No internet 
    } 
    else if (status == ReachableViaWiFi) 
    { 
     NSLog(@"Wifi"); 
     //WiFi 
    } 
    else if (status == ReachableViaWWAN) 
    { 
     NSLog(@"WWAN"); 


    //connection type 
    CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init]; 
    _carrier = [[netinfo subscriberCellularProvider] carrierName]; 

    if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) { 
     NSLog(@"2G"); 
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) { 
     NSLog(@"2G"); 
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) { 
     NSLog(@"3G"); 
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA]) { 
     NSLog(@"3G"); 
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]) { 
     NSLog(@"3G"); 
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) { 
     NSLog(@"2G"); 
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]) { 
     NSLog(@"3G"); 
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]) { 
     NSLog(@"3G"); 
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) { 
     NSLog(@"3G"); 
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) { 
     NSLog(@"3G"); 
    } else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) { 
     NSLog(@"4G"); 
    } 

    } 

引用(链接可能在未来打破):

+0

首先添加SystemConfiguration框架,打开此链接https://github.com/tonymillion/Reachabilit'并下载该文件并将Reachability.h,.m复制到您的项目并导入#import“Reachability.h”, #import ,最后复制粘贴上面的代码..... – Marking

5

为SWIFT我们可以使用:

func getNetworkType()->String { 
    do{ 
     let reachability:Reachability = try Reachability.reachabilityForInternetConnection() 
     do{ 
      try reachability.startNotifier() 
      let status = reachability.currentReachabilityStatus 
      if(status == .NotReachable){ 
       return "" 
      }else if (status == .ReachableViaWiFi){ 
       return "Wifi" 
      }else if (status == .ReachableViaWWAN){ 
       let networkInfo = CTTelephonyNetworkInfo() 
       let carrierType = networkInfo.currentRadioAccessTechnology 
       switch carrierType{ 
       case CTRadioAccessTechnologyGPRS?,CTRadioAccessTechnologyEdge?,CTRadioAccessTechnologyCDMA1x?: return "2G" 
       case CTRadioAccessTechnologyWCDMA?,CTRadioAccessTechnologyHSDPA?,CTRadioAccessTechnologyHSUPA?,CTRadioAccessTechnologyCDMAEVDORev0?,CTRadioAccessTechnologyCDMAEVDORevA?,CTRadioAccessTechnologyCDMAEVDORevB?,CTRadioAccessTechnologyeHRPD?: return "3G" 
       case CTRadioAccessTechnologyLTE?: return "4G" 
       default: return "" 
       } 

       // Get carrier name 

      }else{ 
       return "" 
      } 
     }catch{ 
      return "" 
     } 

    }catch{ 
     return "" 
    } 


} 
1
#import <ifaddrs.h> 
#import <arpa/inet.h> 

BOOL CheckWiFi() { 

    struct ifaddrs *interfaces = NULL; 
    struct ifaddrs *temp_addr = NULL; 

    BOOL hasWifi = NO; 

    int err = getifaddrs(&interfaces); 
    if(err == 0) { 

     temp_addr = interfaces; 

     while(temp_addr) { 

      if(temp_addr->ifa_addr->sa_family == AF_INET) { 

       struct sockaddr_in *addr = (struct sockaddr_in *)temp_addr->ifa_addr; 

       if(memcmp(temp_addr->ifa_name, "en", 2) == 0) { 
        hasWifi = YES; 
        break; 
       } 
      } 

      temp_addr = temp_addr->ifa_next; 
     } 
    } 

    freeifaddrs(interfaces); 
    return hasWifi; 
} 

要检查,如果你是在有wifi,这节省了建立连接的昂贵的检查。检查ifa_name“bridge”以检查Internet共享。

2

类方法如下

+(NSString*)connectedNetworkType { 
    Reachability *reachability = [Reachability reachabilityForInternetConnection]; 
     [reachability startNotifier]; 

     NetworkStatus status = [reachability currentReachabilityStatus]; 

     if(status == NotReachable) { 
      NSLog(@"none"); 
      //No internet 
     } 
     else if (status == ReachableViaWiFi) { 
      NSLog(@"Wifi"); 
      //WiFi 
      return @"Wifi"; 
     } 
     else if (status == ReachableViaWWAN){ 
      NSLog(@"WWAN"); 
      //connection type 
      CTTelephonyNetworkInfo *netinfo = [[CTTelephonyNetworkInfo alloc] init]; 
      // _carrier = [[netinfo subscriberCellularProvider] carrierName]; 
      if (([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) 
       ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) 
       ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x])) { 
       NSLog(@"2G"); 
       return @"2G"; 
      } 
      else if (([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) 
        ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA]) 
        ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]) 
        ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]) 
        ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]) 
        ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) 
        ||([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD])){ 
       NSLog(@"3G"); 
       return @"3G"; 
      } 
      else if ([netinfo.currentRadioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) { 
       NSLog(@"4G"); 
       return @"4G"; 

      } 
     } 
     return @"-1";//default unknown 
}