确定3G vs边缘
我知道可达性示例允许检测networking是否可以通过Wifi或Cell访问,但有没有方法可以确定单元连接是通过3G还是EDGE?
不,networking技术在小区连接性中不存在公共检测。
从iOS 7开始,现在有一种公开的方式来做到这一点:
CTTelephonyNetworkInfo *telephonyInfo = [CTTelephonyNetworkInfo new]; NSLog(@"Current Radio Access Technology: %@", telephonyInfo.currentRadioAccessTechnology); [NSNotificationCenter.defaultCenter addObserverForName:CTRadioAccessTechnologyDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) { NSLog(@"New Radio Access Technology: %@", telephonyInfo.currentRadioAccessTechnology); }];
阅读更多关于我在objc.io上的文章。
nx代码的简化版本,用于静默编译器警告我在XCode 4.5中获得了:
- (NSNumber *) dataNetworkTypeFromStatusBar { UIApplication *app = [UIApplication sharedApplication]; NSArray *subviews = [[[app valueForKey:@"statusBar"] valueForKey:@"foregroundView"] subviews]; NSNumber *dataNetworkItemView = nil; for (id subview in subviews) { if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) { dataNetworkItemView = subview; break; } } return [dataNetworkItemView valueForKey:@"dataNetworkType"]; }
而我迄今为止发现的价值键:
- 0 =没有wifi或蜂窝
- 1 = 2G和更早? (还没有确定)
- 2 = 3G? (尚未确认)
- 3 = 4G
- 4 = LTE
- 5 = Wifi
使用私有API,您可以直接在状态栏中读取这些信息。
https://github.com/nst/MobileSignal/blob/master/Classes/UIApplication+MS.m
+ (NSNumber *)dataNetworkTypeFromStatusBar { UIApplication *app = [UIApplication sharedApplication]; UIStatusBar *statusBar = [app valueForKey:@"statusBar"]; UIStatusBarForegroundView *foregroundView = [statusBar valueForKey:@"foregroundView"]; NSArray *subviews = [foregroundView subviews]; UIStatusBarDataNetworkItemView *dataNetworkItemView = nil; for (id subview in subviews) { if([subview isKindOfClass:[NSClassFromString(@"UIStatusBarDataNetworkItemView") class]]) { dataNetworkItemView = subview; break; } } return [dataNetworkItemView valueForKey:@"dataNetworkType"]; }
telephonyInfo.currentRadioAccessTechnology值:
CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyGPRS __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyEdge __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyWCDMA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSDPA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyHSUPA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMA1x __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORev0 __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyCDMAEVDORevB __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyeHRPD __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSString * const CTRadioAccessTechnologyLTE __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0);
我认为这些都是可能的价值。