20

キャリアネットワークの接続タイプを取得するにはどうすればよいですか? ----- WRのT:キャリア接続タイプ(3G/EDGE/GPRS)を検出

  • 私は、接続は無線LANやWWANはReachabilityクラス
  • 私はネットワークフラグ

    到達可能フラグのステータスを取得することができるよ

    を使用している場合は取得することができますよ - localWiFiStatusForFlags

  • 私が使用してWIFIのSSIDを取得することができるよCaptiveNetwork

サポートされているインタフェース:(EN0)

en0 => { 
    BSSID = "xx:xx:xx:xx:xx:xx"; 
    SSID = MyWifiNetwork; 
    SSIDDATA = <x1x1x1x1 x1x1x1x1 x1>; 
} 

しかし、私は、3G、EDGEまたはGPRS接続をdifferenziateすることはできませんよ。

アイデアでもiOSプライベートAPIを使用していますか?

ありがとうございます。

答えて

58

CTTelephonyNetworkInfo *telephonyInfo = [CTTelephonyNetworkInfo new]; 
NSLog(@"Current Radio Access Technology: %@", telephonyInfo.currentRadioAccessTechnology); 
[NSNotificationCenter.defaultCenter addObserverForName:CTRadioAccessTechnologyDidChangeNotification 
               object:nil 
               queue:nil 
              usingBlock:^(NSNotification *note) 
{ 
    NSLog(@"New Radio Access Technology: %@", telephonyInfo.currentRadioAccessTechnology); 
}]; 

私はまた、これは、低速または高速接続を検出することが分かっています

- (BOOL)isFast:(NSString*)radioAccessTechnology { 
    if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyGPRS]) { 
     return NO; 
    } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyEdge]) { 
     return NO; 
    } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyWCDMA]) { 
     return YES; 
    } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSDPA]) { 
     return YES; 
    } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyHSUPA]) { 
     return YES; 
    } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMA1x]) { 
     return NO; 
    } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORev0]) { 
     return YES; 
    } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevA]) { 
     return YES; 
    } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyCDMAEVDORevB]) { 
     return YES; 
    } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyeHRPD]) { 
     return YES; 
    } else if ([radioAccessTechnology isEqualToString:CTRadioAccessTechnologyLTE]) { 
     return YES; 
    } 

    return YES; 
} 
+1

+1、正しい、推奨される解決策 –

+1

よくできたベン! iOS7は最善の方法です。 – elp

+2

ファイルの先頭に#import を置くことを忘れないでください。 –

-1

現在使用されているインターネット接続の種類(Wifi、3G、Edgeなど)を認識する必要のあるiPhoneアプリケーションを作成しています。 Apples Reachabilityのサンプルコードを使用して確認する簡単な方法を見つけました。このオンラインに関する情報が不足しているようですが、これが誰かを助けることができれば幸いです。

最初にReachability.m/.hをプロジェクトにコピーし、クラスに#include "Reachability.h"を含めます。

Reachability *reach = [[Reachability alloc]init]; 
if (reach.internetConnectionStatus == NotReachable) { 
    NSLog(@"No Connection Found"); 
} else if (reach.internetConnectionStatus == ReachableViaCarrierDataNetwork) { 
    NSLog(@"3G or Edge"); 
} else if (reach.internetConnectionStatus == ReachableViaWiFiNetwork) { 
    NSLog(@"Wifi Connection"); 
} 
[reach release]; 

このコードは、これを実行する最善の方法ではないかもしれませんが、最も簡単な方法です。ここで

+1

私はすでに到達可能性クラスを使用しますWIFIまたはCARRIERの違いを検出します。私はGPRSまたはEDGEまたは3Gを検出したいのですが、すべてのことをする必要はありません! – elp

+1

GPRSまたはEDGEまたは3Gを認識することはできません。唯一の方法は、フラグkSCNetworkReachabilityFlagsIsWWAN – mientus

5

プライベートAPIを使用してOLDソリューション、は、特にSoftwareUpdateServices.framework

Class NetworkMonitor = NSClassFromString(@"SUNetworkMonitor"); 
NSLog(@"TYPE: %d", [NetworkMonitor currentNetworkType]); 

それを返します:

0:NO DATA
1:WIFI
2:GPRS/EDGE
3:3G

これはコミュニティに役立つことを願っています。

使用できる上のiOS 7から
+0

と一緒にすべてを認識することです。実際にはあなたは NSLog(@ "TYPE:%d"、[[NetworkMonitor alloc] init] currentNetworkType]); – DanEEStar

+5

アップルはプライベートAPIのこの原因を拒否しませんか? –

+1

@BenGrootおそらくはい。このメソッドはプライベートAPIを使用します。 – elp

1

受け入れ答えは、iOS 10に取り組んでいません。私は回避策を見つけ、5秒ごとにcurrentRadioAccessTechnologyプロパティをチェックしているAppDelegateでタイマーを設定しました。無線アクセス技術の代わりにWIFI接続が利用できるかどうかを確認する機能も必要です。

WiFi接続が利用可能かどうかを確認します。このような

class func isConnectedToWlan() -> Bool { 
    var zeroAddress = sockaddr_in(sin_len: 0, sin_family: 0, sin_port: 0, 
         sin_addr: in_addr(s_addr: 0), sin_zero: (0, 0, 0, 0, 0, 0, 0, 0)) 
    zeroAddress.sin_len = UInt8(MemoryLayout.size(ofValue: zeroAddress)) 
    zeroAddress.sin_family = sa_family_t(AF_INET) 

    let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) { 
     $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in 
      SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress) 
     } 
    } 

    var flags: SCNetworkReachabilityFlags = SCNetworkReachabilityFlags(rawValue: 0) 
    if SCNetworkReachabilityGetFlags(defaultRouteReachability!, &flags) == false { 
     return false 
    } 

    //Only Working for WIFI 
    let isReachable = flags == .reachable 
    let needsConnection = flags == .connectionRequired 

    return isReachable && !needsConnection 
} 

セットアップタイマー:

Timer.scheduledTimer(timeInterval: TimeInterval.seconds(5.0), target: self, selector:  
          #selector(showNetworkMessage), userInfo: nil, repeats: true) 

5秒ごとに呼び出されたセレクター:

guard !Reachability.isConnecteToWlan() else { 
     //Connected to WLAN 
     return 
    } 
    guard let currentRadioAccessTechnology = info.currentRadioAccessTechnology else { 
     // No internet connection 
     return 
    } 
    guard (currentRadioAccessTechnology == CTRadioAccessTechnologyGPRS 
      || currentRadioAccessTechnology == CTRadioAccessTechnologyEdge) else { 
     // 3G, LTE fast radio access Technology 
     return 
    } 

    if lastRadioAccessTechnology != nil { 
     guard let lastRadioAccessTechnology = lastRadioAccessTechnology, 
      (lastInfo != currentRadioAccessTechnology || 
       lastInfo != currentRadioAccessTechnology) else { 
      //Internet connection did not change 
      return 
     } 
    } 
    // Internet connection changed to Edge or GPRS 
    // Store lastRadioAccessTechnology to check if internet connection changed 
    lastRadioAccessTechnology = currentRadioAccessTechnology 
関連する問題