21

我在从服务器接收数据的应用程序上,问题是当用户连接到cellular data(不是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;
}}

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

提前致谢。

4

3 回答 3

29

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

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

您将获得的定义的可能值如下 :CTRadioAccessTechnologyGPRS、、、CTRadioAccessTechnologyEdgeCTRadioAccessTechnologyWCDMACTRadioAccessTechnologyLTE

于 2013-12-19T19:27:52.000 回答
16

确保Status bar没有隐藏在您的应用程序中。如果它不可见,它将始终返回No wifi or cellular,因为您的代码读取了仅此而已的文本Status bar

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

于 2013-06-03T14:33:33.567 回答
0

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

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

于 2013-05-27T16:48:23.013 回答