确定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); 

我认为这些都是可能的价值。