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

Возможные значения модели UIDevice currentDevice

Каковы все возможные значения, возвращаемые [[UIDevice currentDevice] model];? Это не документально.

4b9b3361

Ответ 1

Возможные значения: iPod touch, iPhone, iPhone Simulator, iPad, iPad Simulator

Если вы хотите узнать, какое аппаратное обеспечение iOS разрушается, например iPhone3, iPhone4, iPhone5 и т.д. ниже, это код для


ПРИМЕЧАНИЕ.. В приведенном ниже коде может не содержаться вся строка устройства, я с другими ребятами поддерживаю тот же код на GitHub, поэтому, пожалуйста,

Objective-C: GitHub/DeviceUtil

Swift: GitHub/DeviceGuru


#include <sys/types.h>
#include <sys/sysctl.h>

- (NSString*)hardwareDescription {
    NSString *hardware = [self hardwareString];
    if ([hardware isEqualToString:@"iPhone1,1"]) return @"iPhone 2G";
    if ([hardware isEqualToString:@"iPhone1,2"]) return @"iPhone 3G";
    if ([hardware isEqualToString:@"iPhone3,1"]) return @"iPhone 4";
    if ([hardware isEqualToString:@"iPhone4,1"]) return @"iPhone 4S";
    if ([hardware isEqualToString:@"iPhone5,1"]) return @"iPhone 5";
    if ([hardware isEqualToString:@"iPod1,1"]) return @"iPodTouch 1G";
    if ([hardware isEqualToString:@"iPod2,1"]) return @"iPodTouch 2G";
    if ([hardware isEqualToString:@"iPad1,1"]) return @"iPad";
    if ([hardware isEqualToString:@"iPad2,6"]) return @"iPad Mini";
    if ([hardware isEqualToString:@"iPad4,1"]) return @"iPad Air WIFI";
    //there are lots of other strings too, checkout the github repo
    //link is given at the top of this answer

    if ([hardware isEqualToString:@"i386"]) return @"Simulator";
    if ([hardware isEqualToString:@"x86_64"]) return @"Simulator";

    return nil;
}

- (NSString*)hardwareString {
    size_t size = 100;
    char *hw_machine = malloc(size);
    int name[] = {CTL_HW,HW_MACHINE};
    sysctl(name, 2, hw_machine, &size, NULL, 0);
    NSString *hardware = [NSString stringWithUTF8String:hw_machine];
    free(hw_machine);
    return hardware;
}

Ответ 2

Я только что сделал тест на iPod Touch, iPhone, Phone Retina, iPhone 5, iPad, iPad Retina и iPad Mini. Итак, это мой вывод:

iPod touch
iPhone
iPad

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

iPhone Simulator
iPad Simulator

Ответ 3

Я считаю, что лучший ответ для объяснения (то, что здесь не было написано) Скажем, что само значение является значением String. и возможные ответы - строка, например: "iPhone", "iPad" и т.д.

Ответ 4

Ни один из этих ответов не расширяется для новых номеров моделей. Вот перечисление:

public enum DeviceType {
 case iPad(String?)
 case iPhone(String?)
 case simulator(String?)
 case appleTV(String?)
 case unknown
}

И Extension я написал, что, по-моему, немного чище и немного более расширяем, когда появляется новый номер модели.

extension UIDevice {
    public static func getDevice() -> DeviceType {
        var info = utsname()
        uname(&info)
        let machineMirror = Mirror(reflecting: info.machine)
        let code = machineMirror.children.reduce("") { identifier, element in
            guard let value = element.value as? Int8, value != 0 else {
                return identifier
            }
            return identifier + String(UnicodeScalar(UInt8(value)))
        }

        if code.lowercased().range(of: "ipad") != nil {
            if let range = code.lowercased().range(of: "ipad") {
                var mutate = code
                mutate.removeSubrange(range)
                return .iPad(mutate)
            }else{
                return .iPad(nil)
            }
        }else if code.lowercased().range(of: "iphone") != nil {
            if let range = code.lowercased().range(of: "iphone") {
                var mutate = code
                mutate.removeSubrange(range)
                return .iPhone(mutate)
            }else{
                return .iPhone(nil)
            }
        }else if code.lowercased().range(of: "i386") != nil || code.lowercased().range(of: "x86_64") != nil{
            return .simulator(code)
        }else if code.lowercased().range(of: "appletv") != nil {
            if let range = code.lowercased().range(of: "appletv") {
                var mutate = code
                mutate.removeSubrange(range)
                return .appleTV(mutate)
            }else{
                return .appleTV(nil)
            }
        }else{
            return .unknown
        }
    }
}