Detect carrier connection type (3G / EDGE / GPRS)

后端 未结 4 1645
别那么骄傲
别那么骄傲 2020-11-27 13:21

How can i get the type of connection of a carrier network?

  • I\'m able to get if connection is WIFI or WWAN using Reachability class
  • I

相关标签:
4条回答
  • 2020-11-27 13:52

    I am working on an iPhone application that requires the ability to recognize which type of internet connection is currently being used (Wifi, 3G, Edge, etc). I found a simple way to check by using Apples Reachability sample code. There seems to be a shortage of information about this online, I hope this can help someone.

    First copy Reachability.m/.h into your project and include #include "Reachability.h" into your class.

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

    This code may not be the best way to accomplish this, but it appears to be the most simple approach.

    0 讨论(0)
  • 2020-11-27 13:53

    The accepted answer isn't working on iOS 10. I found a workaround and setup a timer in AppDelegate which is checking the property currentRadioAccessTechnology every 5 seconds. Therefore we also need a function to check if WIFI connection is available instead of radio access technology.

    Check if WIFI Connection is available:

    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
    }
    

    Setup the timer like this:

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

    Selector which is called every 5 seconds:

        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
    
    0 讨论(0)
  • 2020-11-27 14:04

    Here the OLD solution, using private API, in particular SoftwareUpdateServices.framework

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

    It returns:

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

    hope this helps community.

    0 讨论(0)
  • 2020-11-27 14:13

    From iOS 7 on you can use:

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

    I have also found this to detect a slow or fast connection:

    - (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;
    }
    
    0 讨论(0)
提交回复
热议问题