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

时间:2013-05-27 14:01:22

标签: iphone ios objective-c internet-connection cellular-network

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

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

这是我的代码:

- (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;
}}

这是我能做的最好吗??,我试过Apple Reachability example,但它可以确定reachabilityForInternetConnection还是reachabilityForLocalWiFi,但在我的情况下没有帮助。

提前致谢。

3 个答案:

答案 0 :(得分:28)

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

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

您将获得的可能值定义如下: CTRadioAccessTechnologyGPRSCTRadioAccessTechnologyEdgeCTRadioAccessTechnologyWCDMACTRadioAccessTechnologyLTE

答案 1 :(得分:15)

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

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

答案 2 :(得分:0)

案例1,NSLog(@"2G");是手机使用常规手机数据的情况,而不是3G,而不是4G,而不是WiFi。

您应该做的是在NSLog for 2G下面插入代码以防止数据传输。