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:
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.