Déterminer la 3G par rapport à Edge

Je sais que l'exemple d'accessibilité permet de détecter si le réseau est accessible via Wifi ou Cell, mais existe-t-il un moyen de déterminer si la connection de la cellule est sur 3G ou EDGE?

Non, il n'y a pas de détection publique de la technologie réseau dans la connectivité cellulaire.

Depuis iOS 7, il existe désormais un moyen public de le faire:

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); }]; 

Lire plus sur mon article dans objc.io.

Version marginalement simplifiée du code de nst pour faire taire les avertissements du compilateur que j'avais dans 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:[NSClassFromSsortingng(@"UIStatusBarDataNetworkItemView") class]]) { dataNetworkItemView = subview; break; } } return [dataNetworkItemView valueForKey:@"dataNetworkType"]; } 

Et les keys de valeur que j'ai trouvées jusqu'à maintenant:

  • 0 = Pas de wifi ou cellulaire
  • 1 = 2G et plus tôt? (pas confirmé)
  • 2 = 3G? (pas encore confirmé)
  • 3 = 4G
  • 4 = LTE
  • 5 = Wifi

En utilisant des API privées, vous pouvez lire ces informations directement dans la barre d'état.

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:[NSClassFromSsortingng(@"UIStatusBarDataNetworkItemView") class]]) { dataNetworkItemView = subview; break; } } return [dataNetworkItemView valueForKey:@"dataNetworkType"]; } 

telephonyInfo.currentRadioAccessTechnology Valeurs:

 CORETELEPHONY_EXTERN NSSsortingng * const CTRadioAccessTechnologyGPRS __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSSsortingng * const CTRadioAccessTechnologyEdge __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSSsortingng * const CTRadioAccessTechnologyWCDMA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSSsortingng * const CTRadioAccessTechnologyHSDPA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSSsortingng * const CTRadioAccessTechnologyHSUPA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSSsortingng * const CTRadioAccessTechnologyCDMA1x __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSSsortingng * const CTRadioAccessTechnologyCDMAEVDORev0 __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSSsortingng * const CTRadioAccessTechnologyCDMAEVDORevA __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSSsortingng * const CTRadioAccessTechnologyCDMAEVDORevB __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSSsortingng * const CTRadioAccessTechnologyeHRPD __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); CORETELEPHONY_EXTERN NSSsortingng * const CTRadioAccessTechnologyLTE __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_7_0); 

Je pense que ce sont toutes les valeurs possibles.