Objective-C决定了iOS设备的数据networkingtypes

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

我已经从这个答案实现了这个代码,但我不知道它是否有效,有时它给我一个准确的types,有时它不。

这里是我的代码:

 - (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但对我来说没有帮助。

提前致谢。

确保Status bar没有隐藏在您的应用程序中。 如果它不可见,它将总是返回No wifi or cellular因为你的代码读取Status bar的文本,所有。

这是解决您的问题的最好方法,只是使Status bar不隐藏,然后应用程序将获得有关networkingtypes的文本。

如果使用iOS 7 +,则可以从CoreTelephony框架获取信息,方法如下:

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

定义的可能值如下: CTRadioAccessTechnologyGPRSCTRadioAccessTechnologyEdgeCTRadioAccessTechnologyWCDMACTRadioAccessTechnologyLTE

情况1,与NSLog(@"2G"); 手机是常规蜂窝数据,而不是3G,不是4G,而不是WiFi。

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