20

Làm thế nào tôi có thể nhận được loại kết nối của mạng vận chuyển?Phát hiện loại kết nối của nhà cung cấp dịch vụ (3G/EDGE/GPRS)

  • tôi có thể nhận được nếu kết nối được WIFI hoặc WWAN sử dụng Reachability lớp
  • Tôi có thể nhận được cờ mạng

    reachability Cờ Tình trạng: WR t ----- - localWiFiStatusForFlags

  • tôi có thể có được wIFI SSID sử dụng CaptiveNetwork

giao diện hỗ trợ: (en0)

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

Nhưng tôi không thể differenziate 3G, EDGE hoặc kết nối GPRS.

Bất kỳ ý tưởng nào cũng sử dụng API riêng tư trên iOS?

cảm ơn.

Trả lời

58

Từ iOS 7 trên bạn có thể sử dụng:

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

Tôi cũng đã tìm thấy này để phát hiện một kết nối chậm hoặc nhanh:

- (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 cho đúng, giải pháp được đề nghị –

+1

Thực hiện tốt Ben! Với iOS7 là cách tốt nhất. – elp

+2

Đừng quên đặt #import ở đầu tệp của bạn. –

-1

Tôi đang làm việc trên ứng dụng iPhone yêu cầu khả năng nhận dạng loại kết nối internet hiện đang được sử dụng (Wifi, 3G, Cạnh, v.v.). Tôi đã tìm thấy một cách đơn giản để kiểm tra bằng cách sử dụng mã mẫu của Apples Reachability. Dường như thiếu thông tin về trực tuyến này, tôi hy vọng điều này có thể giúp một người nào đó.

Khả năng hiển thị bản sao đầu tiên.m/.h vào dự án của bạn và bao gồm #include "Reachability.h" vào lớp học của bạn.

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

Mã này có thể không phải là cách tốt nhất để thực hiện điều này, nhưng nó dường như là cách tiếp cận đơn giản nhất.

+1

Tôi đã sử dụng lớp reachability để phát hiện sự khác biệt giữa WIFI hoặc CARRIER. Tôi muốn phát hiện GPRS hoặc EDGE hoặc 3G, không phải tất cả đều phải! – elp

+1

Không thể nhận dạng GPRS hoặc EDGE hoặc 3G. Cách duy nhất là nhận ra tất cả cùng với cờ kSCNetworkReachabilityFlagsIsWWAN – mientus

5

Dưới đây là giải pháp OLD, sử dụng API tin, đặc biệt SoftwareUpdateServices.framework

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

Nó trả về:

0: Không có dữ liệu
1: WIFI
2: GPRS/EDGE
3: 3G

hy vọng điều này sẽ giúp cộng đồng.

+0

thực sự bạn phải gọi NSLog (@ "TYPE:% d", [[[NetworkMonitor alloc] init] currentNetworkType]); – DanEEStar

+5

Apple có không từ chối nguyên nhân của API riêng tư này không? –

+1

@BenGroot Có lẽ là có. Phương pháp này sử dụng api riêng. – elp

1

Câu trả lời được chấp nhận không hoạt động trên iOS 10.Tôi tìm thấy một workaround và thiết lập một bộ đếm thời gian trong AppDelegate đó là kiểm tra tài sản hiện tạiRadioAccessTechnology mỗi 5 giây. Vì vậy, chúng tôi cũng cần một chức năng để kiểm tra xem kết nối WIFI có sẵn thay cho công nghệ truy cập vô tuyến hay không.

Kiểm tra nếu WIFI kết nối có sẵn:

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 
} 

Cài đặt bộ đếm thời gian như thế này:

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

Selector được gọi là mỗi 5 giây:

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 
Các vấn đề liên quan