检测载波连接类型(3G/EDGE/GPRS)

elp*_*elp 21 iphone network-programming objective-c iphone-privateapi ios

如何获得运营商网络的连接类型?

  • 如果使用Reachability类 连接是WIFI或WWAN,我能够得到
  • 我能够获得网络标志

    可达性标志状态:WR t ------ localWiFiStatusForFlags

  • 我可以使用WIFI SSID CaptiveNetwork

支持的接口:(en0)

en0 => {  
    BSSID = "xx:xx:xx:xx:xx:xx";  
    SSID = MyWifiNetwork;  
    SSIDDATA = <x1x1x1x1 x1x1x1x1 x1>;  
}  
Run Code Online (Sandbox Code Playgroud)

但我无法区分3G,EDGE或GPRS连接.

任何想法也使用iOS私有API?

谢谢.

Ben*_*oot 61

从iOS 7开始,您可以使用:

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);
}];
Run Code Online (Sandbox Code Playgroud)

我还发现这可以检测慢速或快速连接:

- (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;
}
Run Code Online (Sandbox Code Playgroud)

  • 不要忘记将#import <CoreTelephony/CTTelephonyNetworkInfo.h>放在文件的顶部. (2认同)

elp*_*elp 5

这里是OLD解决方案,特别是使用私有APISoftwareUpdateServices.framework

Class NetworkMonitor = NSClassFromString(@"SUNetworkMonitor");
NSLog(@"TYPE: %d", [NetworkMonitor currentNetworkType]);
Run Code Online (Sandbox Code Playgroud)

它返回:

0:无数据
1:WIFI
2:GPRS/EDGE
3:3G

希望这有助于社区.

  • Apple不会拒绝这个私有API的原因吗? (5认同)