我在从服务器接收数据的应用程序上,问题是当用户连接到cellular data
(非3G
或WIFI
)时,接收数据需要很长时间。
我已经从这个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
,但在我的情况下没有帮助。
提前致谢。
答案 0 :(得分:28)
如果使用iOS 7
+,那么您可以按照以下方法从CoreTelephony
框架获取信息:
CTTelephonyNetworkInfo *telephonyInfo = [CTTelephonyNetworkInfo new];
NSLog(@"Current Radio Access Technology: %@", telephonyInfo.currentRadioAccessTechnology);
您将获得的可能值定义如下:
CTRadioAccessTechnologyGPRS
,CTRadioAccessTechnologyEdge
,CTRadioAccessTechnologyWCDMA
,CTRadioAccessTechnologyLTE
等
答案 1 :(得分:15)
确保您的应用中未隐藏Status bar
。
如果它不可见,它将始终返回No wifi or cellular
,因为您的代码会读取Status bar
中的所有文本。
这是解决问题的最佳方法,只是让Status bar
不隐藏,然后应用程序将获得有关网络类型的文本。
答案 2 :(得分:0)
案例1,NSLog(@"2G");
是手机使用常规手机数据的情况,而不是3G,而不是4G,而不是WiFi。
您应该做的是在NSLog for 2G下面插入代码以防止数据传输。