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

21

我在使用一个从服务器接收数据的应用程序,问题是当用户连接到移动数据(而不是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 可达性示例,但它只能确定是否reachabilityForInternetConnectionreachabilityForLocalWiFi,但这对我没有帮助。

提前致谢。


它的运行很好,但我认为它是私有API,所以可能会被苹果拒绝。您能否给我建议,您是否上传应用程序到苹果商店并获得批准?请评论,以便我可以继续上传我的应用程序到商店。提前感谢您的帮助。 - Nikunj Jadav
iPhone X上崩溃。 - Illia Vlasov
3个回答

29

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

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

可能的取值如下所示: CTRadioAccessTechnologyGPRSCTRadioAccessTechnologyEdgeCTRadioAccessTechnologyWCDMACTRadioAccessTechnologyLTE等。


3
这是实际答案,其余部分是技巧性操作,可能随时停止运作。 - Marin Todorov
文档显示它从iOS 4开始可用:https://developer.apple.com/library/ios/documentation/NetworkingInternet/Reference/CTTelephonyNetworkInfo/Reference/Reference.html - Brian Colavito
1
дҪҶжҳҜ currentRadioAccessTechnology д»Һ iOS7 ејҖе§ӢеҸҜз”ЁгҖӮ@BrianColavito - Carina
@muzz currentRadioAccessTechnology 总是返回 CTRadioAccessTechnologyEdge,即使我将 WiFi 更改为蜂窝数据。有任何想法吗? - Nikunj Jadav

16

确保应用程序中的 状态栏 没有被隐藏。 如果不可见,由于您的代码读取 状态栏 中的文本,它将始终返回 No wifi or cellular

这是解决问题的最佳方法,只需使 状态栏 不隐藏,应用程序便能获取网络类型的文本。


4
我并没有意识到如果状态栏被隐藏会导致无法读取数值,非常感谢。 - Mutawe
@Atrash,它运行良好,但我认为它是私有API,因此可能被苹果拒绝。您能否给我建议,您是否将应用程序上传到Apple Store并获得批准?请评论,以便我可以继续上传我的应用程序到商店。提前感谢您的帮助。 - Nikunj Jadav

0

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

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


这是我能做到的最好方式吗? - Mutawe
据我所知,是的?关于您在悬赏中请求更多细节,您需要告诉我们如何防止您的“数据传输”。由于我们没有那个代码,实际上无法帮助您。 - arjunyg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接