Objective-C определить тип сети передачи данных устройства iOS
Im в приложении, которое принимает данные с сервера, проблема заключается в том, когда пользователь подключается к cellular data
(Not 3G
или WIFI
), для получения данных требуется возраст.
Я реализовал этот код из этого Ответ, но я не уверен, эффективен он или нет, иногда он дает мне точный тип, а иногда он не.
вот мой код:
- (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 Reachability, но он может определить, если reachabilityForInternetConnection
или просто reachabilityForLocalWiFi
но это не полезно в моем случае.
Спасибо заранее.
Ответы
Ответ 1
Убедитесь, что Status bar
не скрыт в приложении.
если он не отображается, он всегда будет возвращать No wifi or cellular
, потому что ваш код читает текст в Status bar
thats all.
это лучший способ решить вашу проблему, просто сделайте Status bar
не скрытым, тогда приложение получит текст о сетевом типе.
Ответ 2
если вы используете iOS 7
+, тогда вы можете получить информацию из следующего метода CoreTelephony
:
CTTelephonyNetworkInfo *telephonyInfo = [CTTelephonyNetworkInfo new];
NSLog(@"Current Radio Access Technology: %@", telephonyInfo.currentRadioAccessTechnology);
Познаваемые значения, которые вы получите, следующие:
CTRadioAccessTechnologyGPRS
, CTRadioAccessTechnologyEdge
, CTRadioAccessTechnologyWCDMA
, CTRadioAccessTechnologyLTE
и т.д.
Ответ 3
случай 1, с NSLog(@"2G");
- это тот случай, когда телефон находится в обычных сотовых данных, а не 3G, а не 4G, а не WiFi.
Что вам нужно сделать, это вставить код под NSLog для 2G, чтобы предотвратить передачу данных.