Objective-C确定iOS设备的数据网络类型

Mut*_*awe 20 iphone objective-c internet-connection cellular-network ios

我在一个从服务器接收数据的应用程序,问题是当用户连接到cellular data(Not 3GWIFI)时,接收数据需要很长时间.

我已经从这个答案中实现了这个代码,但我不确定它是否有效,有时候它给了我一个准确的类型,有时却没有.

这是我的代码:

- (void)newtworkType {

NSArray *subviews = [[[[UIApplication sharedApplication] valueForKey:@"statusBar"] valueForKey:@"foregroundView"]subviews];
NSNumber *dataNetworkItemView = nil;

for (id subview in subviews) {
    if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) {
        dataNetworkItemView = subview;
        break;
    }
}

switch ([[dataNetworkItemView valueForKey:@"dataNetworkType"]integerValue]) {
    case 0:
        NSLog(@"No wifi or cellular");
        break;

    case 1:
        NSLog(@"2G");
        break;

    case 2:
        NSLog(@"3G");
        break;

    case 3:
        NSLog(@"4G");
        break;

    case 4:
        NSLog(@"LTE");
        break;

    case 5:
        NSLog(@"Wifi");
        break;


    default:
        break;
}}
Run Code Online (Sandbox Code Playgroud)

这是我能做的最好吗??,我尝试了Apple Reachability的例子,但它可以确定是否reachabilityForInternetConnection或只是reachabilityForLocalWiFi但在我的情况下没有帮助.

提前致谢.

muz*_*uzz 28

如果使用iOS 7+那么您可以从CoreTelephony框架中获取以下方法的信息:

CTTelephonyNetworkInfo *telephonyInfo = [CTTelephonyNetworkInfo new];
NSLog(@"Current Radio Access Technology: %@", telephonyInfo.currentRadioAccessTechnology);
Run Code Online (Sandbox Code Playgroud)

是定义你会得到候选条件值如下: CTRadioAccessTechnologyGPRS,CTRadioAccessTechnologyEdge,CTRadioAccessTechnologyWCDMA,CTRadioAccessTechnologyLTE

  • 这是实际答案,剩下的就是hackery,可以随时停止工作 (2认同)

M.A*_*ash 15

确保Status bar您的应用程序中没有隐藏它.如果它不可见,它将始终返回,No wifi or cellular因为您的代码读取Status bar所有内容中的文本.

这是解决问题的最佳方法,只需使Status bar隐藏,然后应用程序将获得有关网络类型的文本.

  • 我没想到,如果状态栏设置为隐藏将导致不读取值,谢谢你一百万 (4认同)