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

Знайте, есть ли у iOS устройства сотовые возможности данных

У меня есть переключатель в моем приложении, который "загружает только на Wi-Fi". Однако этот переключатель бесполезен для iPod touch или WiFi-iPads.

Есть ли способ узнать, обладает ли устройство сотовыми данными в коде? Что-то, что будет работать в будущем, тоже будет здорово (например, если iPod touch 5-го поколения с 3G выходит).

4b9b3361

Ответ 1

Привет, вы должны проверить, имеет ли он интерфейс pdp_ip0

#import <ifaddrs.h>

- (bool) hasCellular {
    struct ifaddrs * addrs;
    const struct ifaddrs * cursor;
    bool found = false;
    if (getifaddrs(&addrs) == 0) {
        cursor = addrs;
        while (cursor != NULL) {
            NSString *name = [NSString stringWithUTF8String:cursor->ifa_name];
            if ([name isEqualToString:@"pdp_ip0"]) {
                found = true;
                break;
            }
            cursor = cursor->ifa_next;
        }
        freeifaddrs(addrs);
    }
    return found;
}

Это не использует частные API.

Ответ 2

3G сам по себе сложно найти. Вы можете узнать, может ли устройство совершать звонки с помощью [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"tel://"]]. Вы можете проверить, может ли устройство получить доступ в Интернет, период (и по какому методу, который может в настоящее время), используя Досягаемость code:

NetworkStatus currentStatus = [[Reachability reachabilityForInternetConnection] 
                               currentReachabilityStatus];

if(currentStatus == kReachableViaWWAN) // 3G

else if(currentStatus == kReachableViaWifi) // ...wifi

else if(currentStatus == kNotReachable) // no connection currently possible

.., но помимо этого, я не думаю, что вы можете проверить наличие 3G-модема в устройстве. ***** Если он не может позвонить, и в настоящее время не имеет ячейки данные включены и Wi-Fi выключен, вы не сможете узнать, поддерживает ли он 3G.

Альтернативный способ (не совместимый с переходом, хотя, возможно, вы этого не хотите) заключается в сравнении модели устройства с исчерпывающим списком, зная, какие из них имеют 3G-модемы, как показано .

***** В соответствии с ответом bentech, если вы хотите перекопать имена устройств (это может перестать работать без предварительного предупреждения, если Apple решит изменить имя интерфейса 3g), вызовите getifaddrs и проверьте интерфейс pdp_ip0.

Ответ 3

В iOS 6.1 я смог использовать Core Telephony, чтобы успешно проверить наличие возможностей сотовой базовой полосы. Это работает на всех проверенных мной iPad: Verizon с активированной услугой и без AT & T с отключенной услугой, входом и выходом SIM-карты и iPad с Wi-Fi.

Используемый мной код выглядит следующим образом:

CTTelephonyNetworkInfo* ctInfo = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier* carrier = ctInfo.subscriberCellularProvider;
self.hasWWANCapability = carrier != nil;

Для всех iPads с аппаратным обеспечением сотовой базовой полосы carrier не равно нулю. Для iPad с поддержкой Wi-Fi carrier равен нулю.

Ответ 4

Я думаю, вы должны использовать CoreTelephony Framework.

Он действительно выдает, что он предназначен для использования операторами, поэтому я не уверен, что он против TOS для доступа к нему.

Перевозчики могут использовать эту информацию для написания приложений, которые предоставляют услуги только для своих собственных подписчиков.

Ответ 5

Swift 3.0 (UIDevice + Extension) ответа @bentech

Добавьте эту строку в свой BridgingHeader.h:

#import <ifaddrs.h>

Где-то еще:

extension UIDevice {
    /// A Boolean value indicating whether the device has cellular data capabilities (true) or not (false).
    var hasCellularCapabilites: Bool {
        var addrs: UnsafeMutablePointer<ifaddrs>?
        var cursor: UnsafeMutablePointer<ifaddrs>?

        defer { freeifaddrs(addrs) }

        guard getifaddrs(&addrs) == 0 else { return false }
        cursor = addrs

        while cursor != nil {
            guard
                let utf8String = cursor?.pointee.ifa_name,
                let name = NSString(utf8String: utf8String),
                name == "pdp_ip0"
                else {
                    cursor = cursor?.pointee.ifa_next
                    continue
            }
            return true
        }
        return false
    }
}

Ответ 6

Один из способов сделать это - попросить местоположение пользователей. Когда это так точно, как возможно, вы узнаете, есть ли у устройства GPS. Все устройства с GPS будут иметь 3G. А тем, у кого GPS нет, 3G не будет.

Ответ 7

Apple предоставила код здесь. https://developer.apple.com/library/ios/samplecode/Reachability/Introduction/Intro.html

Вы должны скопировать Reachability.h и Reachability.m в свой проект и импортировать Reachability.h в ваш класс, затем

Reachability *networkReachability = [Reachability reachabilityForInternetConnection];
NetworkStatus networkStatus = [networkReachability currentReachabilityStatus];

while (networkStatus==NotReachable) {
    NSLog(@"not reachable");
//no  internet connection 
    return;
}
while (networkStatus==ReachableViaWWAN) {
    NSLog(@" ReachableViaWWAN ");
}

while (networkStatus==ReachableViaWiFi) {
    NSLog(@"ReachableViaWiFi");
}

Ответ 8

Другой способ - это: https://github.com/monospacecollective/UIDevice-Hardware/blob/master/UIDevice-Hardware.m с этим:

-(bool) hasCellular:(NSString*)modelIdentifier {
    if ([modelIdentifier hasPrefix:@"iPhone"]) return YES;
    if ([modelIdentifier hasPrefix:@"iPod"]) return NO;

    if ([modelIdentifier isEqualToString:@"iPad1,1"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad2,1"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad2,2"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad2,3"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad2,4"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad2,5"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad2,6"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad2,7"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad3,1"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad3,2"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad3,3"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad3,4"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad3,5"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad3,6"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad4,1"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad4,2"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad2,5"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad2,6"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad2,7"])      return YES;
    if ([modelIdentifier isEqualToString:@"iPad4,4"])      return NO;
    if ([modelIdentifier isEqualToString:@"iPad4,5"])      return YES;

    if ([modelIdentifier isEqualToString:@"i386"])         return NO;
    if ([modelIdentifier isEqualToString:@"x86_64"])       return NO;

return YES;

}

(Ясно, что его можно было отредактировать, чтобы удалить NO или YES только в зависимости от того, каким способом вы хотите ошибиться, если есть новая модель...)