Подтвердить что ты не робот

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 но это не полезно в моем случае.

Спасибо заранее.

4b9b3361

Ответ 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, чтобы предотвратить передачу данных.