2011-10-29 9 views
101

これが可能かどうかはわかりませんが、このシナリオがあります。iOS 3GまたはWiFiを検出

UISegmentedControllerにリンクが設定されたUIWebViewにWebサイトが表示されています。 ウェブサイトでは、Wi-Fiまたは3gネットワークに接続しているかどうかを検出できます。

Nowセグメント化されたコントローラは2つの異なるページを指します。 1 - iPhone優しいログイン画面 2 - ホーム・ページ、ログインすると

今これは質問です:

は、私は(それは無線LANまたは3G上にあるかどうかを検出するために自分のアプリケーションをプログラムすることができます。私は)あなたがこれを行うことができます知っているが、その後の回答に基づいてセグメントに行き、このような1または2

種類:コードのりんごを使用して

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

可能重複[iPhoneのSDK検出無線LANとキャリアネットワーク(http://stackoverflow.com/questions/1625158/iphone-sdk-detect-wifi-and-キャリアネットワーク) –

答えて

204

here

01を提供します
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'は暗黙的に呼び出されます。 –

0

AppleのSimplePingも含まれているiOS 6のアップデート版です。それはARCと互換性があり、私は別の人の修正からReachabilityに着手しました。 http://elbsolutions.com/projects/reachability-with-simpleping-wrapper/

私はこれが誰かを助けてくれることを願っています。

+0

もしあなたがその使用例であれば。 –

-1

を呼び出します使いやすさと使いやすさは、統合するコードのほんの数行です。接続が http://huytd.github.io/datatify/

+0

これをもう一度使うReachability – 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

インポートAppleの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"); 
    } 

    } 

参考文献(今後リンクが壊れる可能性があります):

012私たちが使用することができます迅速については
+0

最初にSystemConfigurationフレームワークを追加し、このリンクを開き、https://github.com/tonymillion/Reachabilit 'を開き、ファイルをダウンロードしてReachability.h、.mをプロジェクトにコピーし、#import "Reachability.h"をインポートします。 #import 最後にコードを貼り付けます..... – Marking

5

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; 
} 

をあなたが無線LANであるかどうかを確認するには、これは、接続を行うの高価なチェックが保存されます。インターネット共有を確認するifa_name "bridge"を確認してください。従うよう

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 
} 
関連する問題