Jak uzyskać markę i model urządzenia na iOS?

246

Zastanawiałem się, czy można ustalić, jakiego rodzaju iPhone'a (na przykład) jest obecne urządzenie? Wiem, że można uzyskać model, przez
NSString *deviceType = [[UIDevice currentDevice] model];
który po prostu wróci, czy mam „iPhone”, czy „iPod”, ALE zastanawiałem się, czy można wykryć / wiedzieć, czy mam iPhone 3GS vs. i iPhone 4 vs. iPhone 4S (w rzeczywistości wszystko, co naprawdę chcę zrobić, to ustalić, czy mam 3G, czy nie, ponieważ robię dość intensywne prace graficzne) .

Więc tak, daj mi znać, dziękuję!

Nathan Fraenkel
źródło
ta odpowiedź może pomóc: stackoverflow.com/a/10240849/653513
Rok Jarc
1
„(w rzeczywistości wszystko, co naprawdę chcę zrobić, to ustalić, czy mam 3G, czy nie, ponieważ robię dość intensywne prace graficzne)”. - W twoim przypadku Apple mądrze zaleca sprawdzenie dostępności dostępnych funkcji zamiast sprawdzania rzeczywistego modelu urządzenia i dokonywania oceny (do czego potrzebowałbyś pewnego rodzaju tabeli). Zalecane podejście jest prostsze i przyszłościowe.
Nicolas Miari
To pytanie jest teraz bardzo stare i iPhone 3G praktycznie nie istnieje, ale w tym przypadku powinieneś sprawdzić dostępność API OpenGL ES 2.0, tworząc renderer i sprawdzając, czy się uda :-),
Nicolas Miari
Sprawdź to github.com/aleemrazzaq/ARCompactDeviceInfo to ma najnowszy model urządzenia, iPhone X, iPhone 8, 8 Plus i iPad 6. generacji 2018
Aleem
Tryb niezawodny sposób: stackoverflow.com/a/56145991/1107242
DawnSong

Odpowiedzi:

553

JEDNAK wypróbuj tę bibliotekę: http://github.com/erica/uidevice-extension/ (autor: Erica Sadun). (Biblioteka ma 7-8 lat i dlatego jest przestarzała)

(Przykładowy kod):

    [[UIDevice currentDevice] platformType]   // ex: UIDevice4GiPhone
    [[UIDevice currentDevice] platformString] // ex: @"iPhone 4G"

LUB Możesz użyć tej metody:

Numer modelu urządzenia można uzyskać za pomocą uname z sys / utsname.h. Na przykład:

Cel C

    #import <sys/utsname.h> // import it in your header or implementation file.

    NSString* deviceName()
    {
        struct utsname systemInfo;
        uname(&systemInfo);

        return [NSString stringWithCString:systemInfo.machine
                                  encoding:NSUTF8StringEncoding];
    }

Szybki 3

    extension UIDevice {
        var modelName: String {
            var systemInfo = utsname()
            uname(&systemInfo)
            let machineMirror = Mirror(reflecting: systemInfo.machine)
            let identifier = machineMirror.children.reduce("") { identifier, element in
                guard let value = element.value as? Int8, value != 0 else { return identifier }
                return identifier + String(UnicodeScalar(UInt8(value)))
            }
            return identifier
        }
    }

    print(UIDevice.current.modelName)

Wynik powinien być:

// Output on a simulator
@"i386"      on 32-bit Simulator
@"x86_64"    on 64-bit Simulator

// Output on an iPhone
@"iPhone1,1" on iPhone
@"iPhone1,2" on iPhone 3G
@"iPhone2,1" on iPhone 3GS
@"iPhone3,1" on iPhone 4 (GSM)
@"iPhone3,2" on iPhone 4 (GSM Rev A)
@"iPhone3,3" on iPhone 4 (CDMA/Verizon/Sprint)
@"iPhone4,1" on iPhone 4S
@"iPhone5,1" on iPhone 5 (model A1428, AT&T/Canada)
@"iPhone5,2" on iPhone 5 (model A1429, everything else)
@"iPhone5,3" on iPhone 5c (model A1456, A1532 | GSM)
@"iPhone5,4" on iPhone 5c (model A1507, A1516, A1526 (China), A1529 | Global)
@"iPhone6,1" on iPhone 5s (model A1433, A1533 | GSM)
@"iPhone6,2" on iPhone 5s (model A1457, A1518, A1528 (China), A1530 | Global)
@"iPhone7,1" on iPhone 6 Plus
@"iPhone7,2" on iPhone 6
@"iPhone8,1" on iPhone 6S
@"iPhone8,2" on iPhone 6S Plus
@"iPhone8,4" on iPhone SE
@"iPhone9,1" on iPhone 7 (CDMA)
@"iPhone9,3" on iPhone 7 (GSM)
@"iPhone9,2" on iPhone 7 Plus (CDMA)
@"iPhone9,4" on iPhone 7 Plus (GSM)
@"iPhone10,1" on iPhone 8 (CDMA)
@"iPhone10,4" on iPhone 8 (GSM)
@"iPhone10,2" on iPhone 8 Plus (CDMA)
@"iPhone10,5" on iPhone 8 Plus (GSM)
@"iPhone10,3" on iPhone X (CDMA)
@"iPhone10,6" on iPhone X (GSM)
@"iPhone11,2" on iPhone XS
@"iPhone11,4" on iPhone XS Max
@"iPhone11,6" on iPhone XS Max China
@"iPhone11,8" on iPhone XR
@"iPhone12,1" on iPhone 11
@"iPhone12,3" on iPhone 11 Pro
@"iPhone12,5" on iPhone 11 Pro Max
@"iPhone12,8" on iPhone SE (2nd Gen)

//iPad 1
@"iPad1,1" on iPad - Wifi (model A1219)
@"iPad1,2" on iPad - Wifi + Cellular (model A1337)

//iPad 2
@"iPad2,1" - Wifi (model A1395)
@"iPad2,2" - GSM (model A1396)
@"iPad2,3" - 3G (model A1397)
@"iPad2,4" - Wifi (model A1395)

// iPad Mini
@"iPad2,5" - Wifi (model A1432)
@"iPad2,6" - Wifi + Cellular (model  A1454)
@"iPad2,7" - Wifi + Cellular (model  A1455)

//iPad 3
@"iPad3,1" - Wifi (model A1416)
@"iPad3,2" - Wifi + Cellular (model  A1403)
@"iPad3,3" - Wifi + Cellular (model  A1430)

//iPad 4
@"iPad3,4" - Wifi (model A1458)
@"iPad3,5" - Wifi + Cellular (model  A1459)
@"iPad3,6" - Wifi + Cellular (model  A1460)

//iPad AIR
@"iPad4,1" - Wifi (model A1474)
@"iPad4,2" - Wifi + Cellular (model A1475)
@"iPad4,3" - Wifi + Cellular (model A1476)

// iPad Mini 2
@"iPad4,4" - Wifi (model A1489)
@"iPad4,5" - Wifi + Cellular (model A1490)
@"iPad4,6" - Wifi + Cellular (model A1491)

// iPad Mini 3
@"iPad4,7" - Wifi (model A1599)
@"iPad4,8" - Wifi + Cellular (model A1600)
@"iPad4,9" - Wifi + Cellular (model A1601)

// iPad Mini 4
@"iPad5,1" - Wifi (model A1538)
@"iPad5,2" - Wifi + Cellular (model A1550)

//iPad AIR 2
@"iPad5,3" - Wifi (model A1566)
@"iPad5,4" - Wifi + Cellular (model A1567)

// iPad PRO 9.7"
@"iPad6,3" - Wifi (model A1673)
@"iPad6,4" - Wifi + Cellular (model A1674)
@"iPad6,4" - Wifi + Cellular (model A1675)

//iPad PRO 12.9"
@"iPad6,7" - Wifi (model A1584)
@"iPad6,8" - Wifi + Cellular (model A1652)

//iPad (5th generation)
@"iPad6,11" - Wifi (model A1822)
@"iPad6,12" - Wifi + Cellular (model A1823)

//iPad PRO 12.9" (2nd Gen)
@"iPad7,1" - Wifi (model A1670)
@"iPad7,2" - Wifi + Cellular (model A1671)
@"iPad7,2" - Wifi + Cellular (model A1821)

//iPad PRO 10.5"
@"iPad7,3" - Wifi (model A1701)
@"iPad7,4" - Wifi + Cellular (model A1709)

// iPad (6th Gen)
@"iPad7,5" - WiFi
@"iPad7,6" - WiFi + Cellular

// iPad (7th Gen)
@"iPad7,11" - WiFi
@"iPad7,12" - WiFi + Cellular

//iPad PRO 11"
@"iPad8,1" - WiFi
@"iPad8,2" - 1TB, WiFi
@"iPad8,3" - WiFi + Cellular
@"iPad8,4" - 1TB, WiFi + Cellular

//iPad PRO 12.9" (3rd Gen)
@"iPad8,5" - WiFi
@"iPad8,6" - 1TB, WiFi
@"iPad8,7" - WiFi + Cellular
@"iPad8,8" - 1TB, WiFi + Cellular

//iPad PRO 11" (2nd Gen)
@"iPad8,9" - WiFi
@"iPad8,10" - 1TB, WiFi

//iPad PRO 12.9" (4th Gen)
@"iPad8,11" - (WiFi)
@"iPad8,12" - (WiFi+Cellular)

// iPad mini 5th Gen
@"iPad11,1" - WiFi
@"iPad11,2" - Wifi  + Cellular

// iPad Air 3rd Gen
@"iPad11,3" - Wifi 
@"iPad11,4" - Wifi  + Cellular

//iPod Touch
@"iPod1,1"   on iPod Touch
@"iPod2,1"   on iPod Touch Second Generation
@"iPod3,1"   on iPod Touch Third Generation
@"iPod4,1"   on iPod Touch Fourth Generation
@"iPod5,1"   on iPod Touch 5th Generation
@"iPod7,1"   on iPod Touch 6th Generation
@"iPod9,1"   on iPod Touch 7th Generation

// Apple Watch
@"Watch1,1" on Apple Watch 38mm case
@"Watch1,2" on Apple Watch 38mm case
@"Watch2,6" on Apple Watch Series 1 38mm case
@"Watch2,7" on Apple Watch Series 1 42mm case
@"Watch2,3" on Apple Watch Series 2 38mm case
@"Watch2,4" on Apple Watch Series 2 42mm case
@"Watch3,1" on Apple Watch Series 3 38mm case (GPS+Cellular)
@"Watch3,2" on Apple Watch Series 3 42mm case (GPS+Cellular)
@"Watch3,3" on Apple Watch Series 3 38mm case (GPS)
@"Watch3,4" on Apple Watch Series 3 42mm case (GPS)
@"Watch4,1" on Apple Watch Series 4 40mm case (GPS)
@"Watch4,2" on Apple Watch Series 4 44mm case (GPS)
@"Watch4,3" on Apple Watch Series 4 40mm case (GPS+Cellular)
@"Watch4,4" on Apple Watch Series 4 44mm case (GPS+Cellular)
@"Watch5,1" on Apple Watch Series 5 40mm case (GPS)
@"Watch5,2" on Apple Watch Series 5 44mm case (GPS)
@"Watch5,3" on Apple Watch Series 5 40mm case (GPS+Cellular)
@"Watch5,4" on Apple Watch Series 5 44mm case (GPS+Cellular)
Aniruddh Joshi
źródło
7
Czy to naraża aprobatę mojej aplikacji na aplikację?
Alexis
5
@jafar Nie, nie ma. ;)
Aniruddh Joshi
2
Jak wywołać metodę machineName?
Marko
3
W jaki sposób możemy zidentyfikować iPhone'a X w symulatorze? Wygląda na to, że odpowiada „Symulatorem”
bendigi,
2
Aktualną
Sébastien
137

Rozwijając powyższą odpowiedź OhhMee, dodałem pewne zabezpieczenie przed awarią, aby obsługiwać przyszłe urządzenia niewymienione (jeszcze) na liście:

#import <sys/utsname.h>
#import "MyClass.h"

@implementation MyClass
{
    //(your private ivars)
}

- (NSString*) deviceName
{
    struct utsname systemInfo;

    uname(&systemInfo);

    NSString* code = [NSString stringWithCString:systemInfo.machine
                                        encoding:NSUTF8StringEncoding];

    static NSDictionary* deviceNamesByCode = nil;

    if (!deviceNamesByCode) {

        deviceNamesByCode = @{@"i386"      : @"Simulator",
                              @"x86_64"    : @"Simulator",
                              @"iPod1,1"   : @"iPod Touch",        // (Original)
                              @"iPod2,1"   : @"iPod Touch",        // (Second Generation)
                              @"iPod3,1"   : @"iPod Touch",        // (Third Generation)
                              @"iPod4,1"   : @"iPod Touch",        // (Fourth Generation)
                              @"iPod7,1"   : @"iPod Touch",        // (6th Generation)       
                              @"iPhone1,1" : @"iPhone",            // (Original)
                              @"iPhone1,2" : @"iPhone",            // (3G)
                              @"iPhone2,1" : @"iPhone",            // (3GS)
                              @"iPad1,1"   : @"iPad",              // (Original)
                              @"iPad2,1"   : @"iPad 2",            //
                              @"iPad3,1"   : @"iPad",              // (3rd Generation)
                              @"iPhone3,1" : @"iPhone 4",          // (GSM)
                              @"iPhone3,3" : @"iPhone 4",          // (CDMA/Verizon/Sprint)
                              @"iPhone4,1" : @"iPhone 4S",         //
                              @"iPhone5,1" : @"iPhone 5",          // (model A1428, AT&T/Canada)
                              @"iPhone5,2" : @"iPhone 5",          // (model A1429, everything else)
                              @"iPad3,4"   : @"iPad",              // (4th Generation)
                              @"iPad2,5"   : @"iPad Mini",         // (Original)
                              @"iPhone5,3" : @"iPhone 5c",         // (model A1456, A1532 | GSM)
                              @"iPhone5,4" : @"iPhone 5c",         // (model A1507, A1516, A1526 (China), A1529 | Global)
                              @"iPhone6,1" : @"iPhone 5s",         // (model A1433, A1533 | GSM)
                              @"iPhone6,2" : @"iPhone 5s",         // (model A1457, A1518, A1528 (China), A1530 | Global)
                              @"iPhone7,1" : @"iPhone 6 Plus",     //
                              @"iPhone7,2" : @"iPhone 6",          //
                              @"iPhone8,1" : @"iPhone 6S",         //
                              @"iPhone8,2" : @"iPhone 6S Plus",    //
                              @"iPhone8,4" : @"iPhone SE",         //
                              @"iPhone9,1" : @"iPhone 7",          //
                              @"iPhone9,3" : @"iPhone 7",          //
                              @"iPhone9,2" : @"iPhone 7 Plus",     //
                              @"iPhone9,4" : @"iPhone 7 Plus",     //
                              @"iPhone10,1": @"iPhone 8",          // CDMA
                              @"iPhone10,4": @"iPhone 8",          // GSM
                              @"iPhone10,2": @"iPhone 8 Plus",     // CDMA
                              @"iPhone10,5": @"iPhone 8 Plus",     // GSM
                              @"iPhone10,3": @"iPhone X",          // CDMA
                              @"iPhone10,6": @"iPhone X",          // GSM
                              @"iPhone11,2": @"iPhone XS",         //
                              @"iPhone11,4": @"iPhone XS Max",     //
                              @"iPhone11,6": @"iPhone XS Max",     // China
                              @"iPhone11,8": @"iPhone XR",         //
                              @"iPhone12,1": @"iPhone 11",         //
                              @"iPhone12,3": @"iPhone 11 Pro",     //
                              @"iPhone12,5": @"iPhone 11 Pro Max", //

                              @"iPad4,1"   : @"iPad Air",          // 5th Generation iPad (iPad Air) - Wifi
                              @"iPad4,2"   : @"iPad Air",          // 5th Generation iPad (iPad Air) - Cellular
                              @"iPad4,4"   : @"iPad Mini",         // (2nd Generation iPad Mini - Wifi)
                              @"iPad4,5"   : @"iPad Mini",         // (2nd Generation iPad Mini - Cellular)
                              @"iPad4,7"   : @"iPad Mini",         // (3rd Generation iPad Mini - Wifi (model A1599))
                              @"iPad6,7"   : @"iPad Pro (12.9\")", // iPad Pro 12.9 inches - (model A1584) 
                              @"iPad6,8"   : @"iPad Pro (12.9\")", // iPad Pro 12.9 inches - (model A1652) 
                              @"iPad6,3"   : @"iPad Pro (9.7\")",  // iPad Pro 9.7 inches - (model A1673)
                              @"iPad6,4"   : @"iPad Pro (9.7\")"   // iPad Pro 9.7 inches - (models A1674 and A1675)
                              };
    }

    NSString* deviceName = [deviceNamesByCode objectForKey:code];

    if (!deviceName) {
        // Not found on database. At least guess main device type from string contents:

        if ([code rangeOfString:@"iPod"].location != NSNotFound) {
            deviceName = @"iPod Touch";
        }
        else if([code rangeOfString:@"iPad"].location != NSNotFound) {
            deviceName = @"iPad";
        }
        else if([code rangeOfString:@"iPhone"].location != NSNotFound){
            deviceName = @"iPhone";
        }
        else {
            deviceName = @"Unknown";
        }
    }

    return deviceName;
}

// (rest of class implementation omitted)

@end

Pominąłem również szczegółowe informacje (np. „Model A1507, A1516, A1526 (Chiny), A1529 | Global”) i zamiast tego umieściłem je w komentarzach, na wypadek, gdybyś chciał użyć ich jako ciągów skierowanych do użytkownika i nie wystraszyć ich.


Edycja: Ta odpowiedź zapewnia podobną implementację przy użyciu Swift 2.

Edycja 2: Właśnie dodałem modele iPada Pro (oba rozmiary). W celu późniejszego wykorzystania numery modeli / itp. można znaleźć na Wiki Wiki .

Edycja 3: Dodaj obsługę iPhone'a XS, iPhone'a XS Max i iPhone'a XR.

Edycja 4: Dodaj obsługę iPhone'a 11, iPhone'a 11 Pro i iPhone'a 11 Pro Max.

Nicolas Miari
źródło
3
Przez pomyłkę szukałem w środku ciągów „iPhone”, „iPad” i „iPod” deviceName, kiedy zamierzałem wyszukiwać code. Ktoś zasugerował zmianę, ale nie mogłem jej zatwierdzić, zanim inne osoby ją odrzuciły, więc sam poprawiłem odpowiedź. Dzięki temu, kto to zasugerował.
Nicolas Miari
1
Używam tego. Działa świetnie. Dzięki Nicolas.
braden
@NicolasMiari Dodałem brakujące elementy.
tounaobun
jest unikalny kod. Nie ma oficjalnej dokumentacji dla systemInfo.machine. Czy identyfikator taki jak „iPhone7,2” będzie zawsze unikalny dla @ „iPhone 6”, czy może ulec zmianie w przyszłości.
Ashish Pisey
@AshishPisey Nie mam pojęcia. Wygląda na to, że od jakiegoś czasu się nie zmieniło i wydaje się, że tak się nie stanie. Wszyscy jednak korzystają z tego interfejsu API; Nie znam innych środków ...
Nicolas Miari
46

Zrobiłem plik plist, aby pomóc ci uzyskać pełną nazwę dla każdego urządzenia (kod źródłowy na końcu mojej odpowiedzi)

Na podstawie odpowiedzi OhhMee możesz użyć jej w następujący sposób:

Swift 4.0

static func deviceName() -> String {

        var systemInfo = utsname()
        uname(&systemInfo)

        guard let iOSDeviceModelsPath = Bundle.main.path(forResource: "iOSDeviceModelMapping", ofType: "plist") else { return "" }
        guard let iOSDevices = NSDictionary(contentsOfFile: iOSDeviceModelsPath) else { return "" }

        let machineMirror = Mirror(reflecting: systemInfo.machine)
        let identifier = machineMirror.children.reduce("") { identifier, element in
            guard let value = element.value as? Int8, value != 0 else { return identifier }
            return identifier + String(UnicodeScalar(UInt8(value)))
        }

        return iOSDevices.value(forKey: identifier) as! String
    }

Nie zapomnij dodać #import <sys/utsname.h> nagłówka pomostowego.

Cel C

#import <sys/utsname.h>

NSString *machineName()
{
    struct utsname systemInfo;
    uname(&systemInfo);

    NSString *iOSDeviceModelsPath = [[NSBundle mainBundle] pathForResource:@"iOSDeviceModelMapping" ofType:@"plist"];
    NSDictionary *iOSDevices = [NSDictionary dictionaryWithContentsOfFile:iOSDeviceModelsPath];

    NSString* deviceModel = [NSString stringWithCString:systemInfo.machine
                                               encoding:NSUTF8StringEncoding];

    return [iOSDevices valueForKey:deviceModel];
}

Plik Plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>x86_64</key>
    <string>Simulator</string>
    <key>i386</key>
    <string>Simulator</string>
    <key>iPod1,1</key>
    <string>iPod Touch 1st Gen</string>
    <key>iPod2,1</key>
    <string>iPod Touch 2nd Gen</string>
    <key>iPod3,1</key>
    <string>iPod Touch 3rd Gen</string>
    <key>iPod4,1</key>
    <string>iPod Touch 4th Gen</string>
    <key>iPod5,1</key>
    <string>iPod Touch 5th Gen</string>
    <key>iPod7,1</key>
    <string>iPod Touch 6th Gen</string>
    <key>iPhone1,1</key>
    <string>iPhone</string>
    <key>iPhone1,2</key>
    <string>iPhone 3G</string>
    <key>iPhone2,1</key>
    <string>iPhone 3GS</string>
    <key>iPhone3,1</key>
    <string>iPhone 4</string>
    <key>iPhone3,2</key>
    <string>iPhone 4</string>
    <key>iPhone3,3</key>
    <string>iPhone 4</string>
    <key>iPhone4,1</key>
    <string>iPhone 4S</string>
    <key>iPhone5,1</key>
    <string>iPhone 5 model A1428</string>
    <key>iPhone5,2</key>
    <string>iPhone 5 model A1429</string>
    <key>iPhone5,3</key>
    <string>iPhone 5C</string>
    <key>iPhone5,4</key>
    <string>iPhone 5C</string>
    <key>iPhone6,1</key>
    <string>iPhone 5S</string>
    <key>iPhone6,2</key>
    <string>iPhone 5S</string>
    <key>iPhone7,2</key>
    <string>iPhone 6</string>
    <key>iPhone7,1</key>
    <string>iPhone 6 Plus</string>
    <key>iPhone8,1</key>
    <string>iPhone 6S</string>
    <key>iPhone8,2</key>
    <string>iPhone 6S Plus</string>
    <key>iPhone8,4</key>
    <string>iPhone SE</string>
    <key>iPhone9,1</key>
    <string>iPhone 7</string>
    <key>iPhone9,2</key>
    <string>iPhone 7 Plus</string>
    <key>iPhone9,3</key>
    <string>iPhone 7</string>
    <key>iPhone9,4</key>
    <string>iPhone 7 Plus</string>
    <key>iPhone10,1</key>
    <string>iPhone 8</string>
    <key>iPhone10,4</key>
    <string>iPhone 8</string>
    <key>iPhone10,2</key>
    <string>iPhone 8 Plus</string>
    <key>iPhone10,5</key>
    <string>iPhone 8 Plus</string>
    <key>iPhone10,3</key>
    <string>iPhone X</string>
    <key>iPhone10,6</key>
    <string>iPhone X</string>
    <key>iPhone11,2</key>
    <string>iPhone XS</string>
    <key>iPhone11,4</key>
    <string>iPhone XS Max</string>
    <key>iPhone11,6</key>
    <string>iPhone XS Max</string>
    <key>iPhone11,8</key>
    <string>iPhone XR</string>
    <key>iPad1,1</key>
    <string>iPad</string>
    <key>iPad2,1</key>
    <string>iPad 2</string>
    <key>iPad2,2</key>
    <string>iPad 2</string>
    <key>iPad2,3</key>
    <string>iPad 2</string>
    <key>iPad2,4</key>
    <string>iPad 2</string>
    <key>iPad3,1</key>
    <string>iPad 3rd Gen</string>
    <key>iPad3,2</key>
    <string>iPad 3rd Gen</string>
    <key>iPad3,3</key>
    <string>iPad 3rd Gen</string>
    <key>iPad3,4</key>
    <string>iPad 4th Gen</string>
    <key>iPad3,5</key>
    <string>iPad 4th Gen</string>
    <key>iPad3,6</key>
    <string>iPad 4th Gen</string>
    <key>iPad4,1</key>
    <string>iPad Air</string>
    <key>iPad4,2</key>
    <string>iPad Air</string>
    <key>iPad4,3</key>
    <string>iPad Air</string>
    <key>iPad2,5</key>
    <string>iPad Mini 1st Gen</string>
    <key>iPad2,6</key>
    <string>iPad Mini 1st Gen</string>
    <key>iPad2,7</key>
    <string>iPad Mini 1st Gen</string>
    <key>iPad4,4</key>
    <string>iPad Mini 2nd Gen</string>
    <key>iPad4,5</key>
    <string>iPad Mini 2nd Gen</string>
    <key>iPad4,6</key>
    <string>iPad Mini 2nd Gen</string>
    <key>iPad4,7</key>
    <string>iPad Mini 3rd Gen</string>
    <key>iPad4,8</key>
    <string>iPad Mini 3rd Gen</string>
    <key>iPad4,9</key>
    <string>iPad Mini 3rd Gen</string>
    <key>iPad5,1</key>
    <string>iPad Mini 4</string>
    <key>iPad5,2</key>
    <string>iPad Mini 4</string>
    <key>iPad5,3</key>
    <string>iPad Air 2</string>
    <key>iPad5,4</key>
    <string>iPad Air 2</string>
    <key>iPad6,3</key>
    <string>iPad Pro 9.7 inch</string>
    <key>iPad6,4</key>
    <string>iPad Pro 9.7 inch</string>
    <key>iPad6,7</key>
    <string>iPad Pro 12.9 inch</string>
    <key>iPad6,8</key>
    <string>iPad Pro 12.9 inch</string>
    <key>iPad7,1</key>
    <string>iPad Pro 12.9 inch 2nd Gen</string>
    <key>iPad7,2</key>
    <string>iPad Pro 12.9 inch 2nd Gen</string>
    <key>iPad7,3</key>
    <string>iPad Pro 10.5 inch</string>
    <key>iPad7,4</key>
    <string>iPad Pro 10.5 inch</string>
    <key>iPad8,1</key>
    <string>iPad Pro 11 inch</string>
    <key>iPad8,2</key>
    <string>iPad Pro 11 inch</string>
    <key>iPad8,3</key>
    <string>iPad Pro 11 inch</string>
    <key>iPad8,4</key>
    <string>iPad Pro 11 inch</string>
    <key>iPad8,5</key>
    <string>iPad Pro 12.9 inch 3rd Gen</string>
    <key>iPad8,6</key>
    <string>iPad Pro 12.9 inch 3rd Gen</string>
    <key>iPad8,7</key>
    <string>iPad Pro 12.9 inch 3rd Gen</string>
    <key>iPad8,8</key>
    <string>iPad Pro 12.9 inch 3rd Gen</string>
</dict>
</plist>
Tib
źródło
zaktualizowane o najnowsze urządzenia (iPhone 6S, iPad Pro itp.)
Tib
1
Proszę wstawić zawartość swojego pliku plist w swojej odpowiedzi (mam nadzieję, sformatowany jako kod). Te same zasady, które odnoszą się do odpowiedzi tylko do linku, dotyczą podstawowego pliku przechowywanego poza SO: może on kiedyś zniknąć.
Nicolas Miari
3
Zaktualizowany o najnowsze urządzenia: iPhone 8 (Plus), iPhone X, iPad Pro 12,9 cala drugiej generacji, iPad Pro 10,5 cala
vilmoskörte
2
Zaktualizowany o nowe urządzenia: iPhone XS, XS Max i XR
vilmoskörte
2
dodał iPada pro 3. generacji (iPad 8,1 do iPad 8,8) do listy
Cory Trese
20

[[UIDevice currentDevice] model] właśnie wraca iPhone lubiPod nie dostajesz numerów modelu, które pozwoliłyby ci rozróżnić różne generacje urządzeń.

Koduj tę metodę:

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

+ (NSString *)getModel {
    size_t size;
    sysctlbyname("hw.machine", NULL, &size, NULL, 0);
    char *model = malloc(size);
    sysctlbyname("hw.machine", model, &size, NULL, 0);
    NSString *deviceModel = [NSString stringWithCString:model encoding:NSUTF8StringEncoding];
    free(model);
    return deviceModel;
}

I wywołaj metodę [self getModel] ilekroć potrzebujesz modelu, a otrzymasz: „iPhone5,1” dla absurdalnie cienkiego i szybkiego iPhone'a 5.

Jedną dobrą praktyką jest utworzenie klasy o nazwie Utils.h/Utils.mi umieszczenie takich metod, getModelaby można było uzyskać te informacje z dowolnego miejsca w aplikacji, po prostu importując klasę i wywołując[Utils getModel];

Oscar Salguero
źródło
12

Zoptymalizowałem implementację NicolasMiari i dodałem Simulatortutaj:

+ (NSString*)deviceName {

  static NSDictionary* deviceNamesByCode = nil;
  static NSString* deviceName = nil;

  if (deviceName) {
    return deviceName;
  }

  deviceNamesByCode = @{
    @"i386"      :@"Simulator",
    @"iPod1,1"   :@"iPod Touch",      // (Original)
    @"iPod2,1"   :@"iPod Touch",      // (Second Generation)
    @"iPod3,1"   :@"iPod Touch",      // (Third Generation)
    @"iPod4,1"   :@"iPod Touch",      // (Fourth Generation)
    @"iPhone1,1" :@"iPhone",          // (Original)
    @"iPhone1,2" :@"iPhone",          // (3G)
    @"iPhone2,1" :@"iPhone",          // (3GS)
    @"iPad1,1"   :@"iPad",            // (Original)
    @"iPad2,1"   :@"iPad 2",          //
    @"iPad3,1"   :@"iPad",            // (3rd Generation)
    @"iPhone3,1" :@"iPhone 4",        //
    @"iPhone4,1" :@"iPhone 4S",       //
    @"iPhone5,1" :@"iPhone 5",        // (model A1428, AT&T/Canada)
    @"iPhone5,2" :@"iPhone 5",        // (model A1429, everything else)
    @"iPad3,4"   :@"iPad",            // (4th Generation)
    @"iPad2,5"   :@"iPad Mini",       // (Original)
    @"iPhone5,3" :@"iPhone 5c",       // (model A1456, A1532 | GSM)
    @"iPhone5,4" :@"iPhone 5c",       // (model A1507, A1516, A1526 (China), A1529 | Global)
    @"iPhone6,1" :@"iPhone 5s",       // (model A1433, A1533 | GSM)
    @"iPhone6,2" :@"iPhone 5s",       // (model A1457, A1518, A1528 (China), A1530 | Global)
    @"iPad4,1"   :@"iPad Air",        // 5th Generation iPad (iPad Air) - Wifi
    @"iPad4,2"   :@"iPad Air",        // 5th Generation iPad (iPad Air) - Cellular
    @"iPad4,4"   :@"iPad Mini",       // (2nd Generation iPad Mini - Wifi)
    @"iPad4,5"   :@"iPad Mini"        // (2nd Generation iPad Mini - Cellular)
  };

  struct utsname systemInfo;
  uname(&systemInfo);
  NSString* code = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];

  deviceName = [deviceNamesByCode objectForKey:code];

  if (!deviceName) {
    // Not found in database. At least guess main device type from string contents:

    if ([code rangeOfString:@"iPod"].location != NSNotFound) {
      deviceName = @"iPod Touch";
    } else if([code rangeOfString:@"iPad"].location != NSNotFound) {
      deviceName = @"iPad";
    } else if([code rangeOfString:@"iPhone"].location != NSNotFound){
      deviceName = @"iPhone";
    } else {
      deviceName = @"Simulator";
    }
  }

  return deviceName;
}

``

Adam W. Dennis
źródło
1
Musimy przekształcić to w repozytorium GitHub i aktualizować za każdym razem, gdy nowe iPhone'y / iPady / etc. zostań dodany do składu!
Nicolas Miari,
1
Być może nawet cocoapod
Adam W. Dennis
12

Poniżej znajduje się kod do tego ( kod może nie zawierać całego ciągu urządzenia, jestem z innymi facetami utrzymującymi ten sam kod na GitHub, więc proszę wziąć najnowszy kod stamtąd )

Cel 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;
}
Inder Kumar Rathore
źródło
11

Kategoria ucieczki od opisu NSString

Zasadniczo pożądane jest unikanie arbitralnych porównań ciągów w całym kodzie. Lepiej jest zaktualizować ciągi w jednym miejscu i ukryć magiczny ciąg przed aplikacją. W UIDevicetym celu podaję kategorię.

Ze względu na moje specyficzne potrzeby muszę wiedzieć, z którego urządzenia korzystam, bez potrzeby znajomości możliwości sieciowych, które można łatwo odzyskać na inne sposoby. Znajdziesz więc grubszą, ziarnistą enumniż stale rosnącą listę urządzeń.

Aktualizacja polega na dodaniu urządzenia do wyliczenia i tabeli odnośników.

UIDevice + NTNUExtension.h

typedef NS_ENUM(NSUInteger, NTNUDeviceType) {
    DeviceAppleUnknown,
    DeviceAppleSimulator,
    DeviceAppleiPhone,
    DeviceAppleiPhone3G,
    DeviceAppleiPhone3GS,
    DeviceAppleiPhone4,
    DeviceAppleiPhone4S,
    DeviceAppleiPhone5,
    DeviceAppleiPhone5C,
    DeviceAppleiPhone5S,
    DeviceAppleiPhone6,
    DeviceAppleiPhone6_Plus,
    DeviceAppleiPhone6S,
    DeviceAppleiPhone6S_Plus,
    DeviceAppleiPhoneSE,
    DeviceAppleiPhone7,
    DeviceAppleiPhone7_Plus,
    DeviceAppleiPodTouch,
    DeviceAppleiPodTouch2G,
    DeviceAppleiPodTouch3G,
    DeviceAppleiPodTouch4G,
    DeviceAppleiPad,
    DeviceAppleiPad2,
    DeviceAppleiPad3G,
    DeviceAppleiPad4G,
    DeviceAppleiPad5G_Air,
    DeviceAppleiPadMini,
    DeviceAppleiPadMini2G,
    DeviceAppleiPadPro12,
    DeviceAppleiPadPro9
};



@interface UIDevice (NTNUExtensions)

- (NSString *)ntnu_deviceDescription;
- (NTNUDeviceType)ntnu_deviceType;

@end

UIDevice + NTNUExtensions.m

#import <sys/utsname.h>
#import "UIDevice+NTNUExtensions.h"

@implementation UIDevice (NTNUExtensions)

- (NSString *)ntnu_deviceDescription
{
    struct utsname systemInfo;
    uname(&systemInfo);

    return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}

- (NTNUDeviceType)ntnu_deviceType
{
    NSNumber *deviceType = [[self ntnu_deviceTypeLookupTable] objectForKey:[self ntnu_deviceDescription]];
    return [deviceType unsignedIntegerValue];
}

- (NSDictionary *)ntnu_deviceTypeLookupTable
{
    return @{
             @"i386": @(DeviceAppleSimulator),
             @"x86_64": @(DeviceAppleSimulator),
             @"iPod1,1": @(DeviceAppleiPodTouch),
             @"iPod2,1": @(DeviceAppleiPodTouch2G),
             @"iPod3,1": @(DeviceAppleiPodTouch3G),
             @"iPod4,1": @(DeviceAppleiPodTouch4G),
             @"iPhone1,1": @(DeviceAppleiPhone),
             @"iPhone1,2": @(DeviceAppleiPhone3G),
             @"iPhone2,1": @(DeviceAppleiPhone3GS),
             @"iPhone3,1": @(DeviceAppleiPhone4),
             @"iPhone3,3": @(DeviceAppleiPhone4),
             @"iPhone4,1": @(DeviceAppleiPhone4S),
             @"iPhone5,1": @(DeviceAppleiPhone5),
             @"iPhone5,2": @(DeviceAppleiPhone5),
             @"iPhone5,3": @(DeviceAppleiPhone5C),
             @"iPhone5,4": @(DeviceAppleiPhone5C),
             @"iPhone6,1": @(DeviceAppleiPhone5S),
             @"iPhone6,2": @(DeviceAppleiPhone5S),
             @"iPhone7,1": @(DeviceAppleiPhone6_Plus),
             @"iPhone7,2": @(DeviceAppleiPhone6),
             @"iPhone8,1" :@(DeviceAppleiPhone6S),
             @"iPhone8,2" :@(DeviceAppleiPhone6S_Plus),
             @"iPhone8,4" :@(DeviceAppleiPhoneSE),
             @"iPhone9,1" :@(DeviceAppleiPhone7),
             @"iPhone9,3" :@(DeviceAppleiPhone7),
             @"iPhone9,2" :@(DeviceAppleiPhone7_Plus),
             @"iPhone9,4" :@(DeviceAppleiPhone7_Plus),
             @"iPad1,1": @(DeviceAppleiPad),
             @"iPad2,1": @(DeviceAppleiPad2),
             @"iPad3,1": @(DeviceAppleiPad3G),
             @"iPad3,4": @(DeviceAppleiPad4G),
             @"iPad2,5": @(DeviceAppleiPadMini),
             @"iPad4,1": @(DeviceAppleiPad5G_Air),
             @"iPad4,2": @(DeviceAppleiPad5G_Air),
             @"iPad4,4": @(DeviceAppleiPadMini2G),
             @"iPad4,5": @(DeviceAppleiPadMini2G),
             @"iPad4,7":@(DeviceAppleiPadMini),
             @"iPad6,7":@(DeviceAppleiPadPro12),
             @"iPad6,8":@(DeviceAppleiPadPro12),
             @"iPad6,3":@(DeviceAppleiPadPro9),
             @"iPad6,4":@(DeviceAppleiPadPro9)
             };
}

@end
Cameron Lowell Palmer
źródło
To miłe rozwiązanie. Przydatnym rozszerzeniem tego jest sortowanie wyliczenia na podstawie procesora urządzenia, co pozwala na użycie prostego porównania <lub> w celu ustalenia, czy urządzenie ma mniejszą lub większą moc niż cel. Na przykład, jeśli chcesz ograniczyć animacje tła na urządzeniach sprzed iPhone'a 4S.
Mischinab,
9

Nazwa urządzenia i nazwy komputera, na podstawie sprzętu Real Device iOS

Moje rozwiązanie tego problemu jest w zasadzie związane z odpowiedzią @NicolasMiari w tym wątku. Oddzielna klasa narzędzi ma wstępnie zdefiniowany zestaw nazw urządzeń i komputerów, a następnie w zależności od rzeczywistej nazwy komputera pobierz nazwę urządzenia.

Uwaga: Ta odpowiedź i powiązany z nią projekt GitHub zostały zaktualizowane w celu identyfikacji aktualnych najnowszych iPhone'ów (iPhone 8, 8+, X) od października 2017 r. I to działa również na iOS11 . Proszę odwiedzić repozytorium GitHub i zobaczyć i przekazać mi informację zwrotną, jeśli coś jest nie tak.

/*
 * Retrieves back the device name or if not the machine name.
 */
+ (NSString*)deviceModelName {
    struct utsname systemInfo;
    uname(&systemInfo);
    NSString *machineName = [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
    
    //MARK: More official list is at
    //http://theiphonewiki.com/wiki/Models
    //MARK: You may just return machineName. Following is for convenience
    
    NSDictionary *commonNamesDictionary =
    @{
      @"i386":     @"i386 Simulator",
      @"x86_64":   @"x86_64 Simulator",

      @"iPhone1,1":    @"iPhone",
      @"iPhone1,2":    @"iPhone 3G",
      @"iPhone2,1":    @"iPhone 3GS",
      @"iPhone3,1":    @"iPhone 4",
      @"iPhone3,2":    @"iPhone 4(Rev A)",
      @"iPhone3,3":    @"iPhone 4(CDMA)",
      @"iPhone4,1":    @"iPhone 4S",
      @"iPhone5,1":    @"iPhone 5(GSM)",
      @"iPhone5,2":    @"iPhone 5(GSM+CDMA)",
      @"iPhone5,3":    @"iPhone 5c(GSM)",
      @"iPhone5,4":    @"iPhone 5c(GSM+CDMA)",
      @"iPhone6,1":    @"iPhone 5s(GSM)",
      @"iPhone6,2":    @"iPhone 5s(GSM+CDMA)",
  
      @"iPhone7,1":    @"iPhone 6+(GSM+CDMA)",
      @"iPhone7,2":    @"iPhone 6(GSM+CDMA)",
  
      @"iPhone8,1":    @"iPhone 6S(GSM+CDMA)",
      @"iPhone8,2":    @"iPhone 6S+(GSM+CDMA)",
      @"iPhone8,4":    @"iPhone SE(GSM+CDMA)",
      @"iPhone9,1":    @"iPhone 7(GSM+CDMA)",
      @"iPhone9,2":    @"iPhone 7+(GSM+CDMA)",
      @"iPhone9,3":    @"iPhone 7(GSM+CDMA)",
      @"iPhone9,4":    @"iPhone 7+(GSM+CDMA)",
  
      @"iPad1,1":  @"iPad",
      @"iPad2,1":  @"iPad 2(WiFi)",
      @"iPad2,2":  @"iPad 2(GSM)",
      @"iPad2,3":  @"iPad 2(CDMA)",
      @"iPad2,4":  @"iPad 2(WiFi Rev A)",
      @"iPad2,5":  @"iPad Mini 1G (WiFi)",
      @"iPad2,6":  @"iPad Mini 1G (GSM)",
      @"iPad2,7":  @"iPad Mini 1G (GSM+CDMA)",
      @"iPad3,1":  @"iPad 3(WiFi)",
      @"iPad3,2":  @"iPad 3(GSM+CDMA)",
      @"iPad3,3":  @"iPad 3(GSM)",
      @"iPad3,4":  @"iPad 4(WiFi)",
      @"iPad3,5":  @"iPad 4(GSM)",
      @"iPad3,6":  @"iPad 4(GSM+CDMA)",
  
      @"iPad4,1":  @"iPad Air(WiFi)",
      @"iPad4,2":  @"iPad Air(GSM)",
      @"iPad4,3":  @"iPad Air(GSM+CDMA)",
  
      @"iPad5,3":  @"iPad Air 2 (WiFi)",
      @"iPad5,4":  @"iPad Air 2 (GSM+CDMA)",
  
      @"iPad4,4":  @"iPad Mini 2G (WiFi)",
      @"iPad4,5":  @"iPad Mini 2G (GSM)",
      @"iPad4,6":  @"iPad Mini 2G (GSM+CDMA)",
  
      @"iPad4,7":  @"iPad Mini 3G (WiFi)",
      @"iPad4,8":  @"iPad Mini 3G (GSM)",
      @"iPad4,9":  @"iPad Mini 3G (GSM+CDMA)",
  
      @"iPod1,1":  @"iPod 1st Gen",
      @"iPod2,1":  @"iPod 2nd Gen",
      @"iPod3,1":  @"iPod 3rd Gen",
      @"iPod4,1":  @"iPod 4th Gen",
      @"iPod5,1":  @"iPod 5th Gen",
      @"iPod7,1":  @"iPod 6th Gen",
      };
    
    NSString *deviceName = commonNamesDictionary[machineName];
    
    if (deviceName == nil) {
        deviceName = machineName;
    }
    
    return deviceName;
}

Dodałem tę implementację i kilka innych wygodnych metod narzędziowych w klasie i umieściłem ją w tym repozytorium GitHub . A także można znaleźć aktualną listę informacji o urządzeniu na tej stronie Wiki .

Odwiedź go i skorzystaj z niego.

Aktualizacja:

Może być konieczne zaimportowanie frameworka sys,

#import <sys/utsname.h>
Randika Vishman
źródło
1
Kasun, dziękuję za zaktualizowane wdrożenie tego. Spróbuj w przyszłości aktualizować go dla nowych modeli.
Hemang
7

Kompatybilny z Swift 3

// MARK: - UIDevice Extension -

private let DeviceList = [
/* iPod 5 */          "iPod5,1": "iPod Touch 5",
/* iPhone 4 */        "iPhone3,1":  "iPhone 4", "iPhone3,2": "iPhone 4", "iPhone3,3": "iPhone 4",
/* iPhone 4S */       "iPhone4,1": "iPhone 4S",
/* iPhone 5 */        "iPhone5,1": "iPhone 5", "iPhone5,2": "iPhone 5",
/* iPhone 5C */       "iPhone5,3": "iPhone 5C", "iPhone5,4": "iPhone 5C",
/* iPhone 5S */       "iPhone6,1": "iPhone 5S", "iPhone6,2": "iPhone 5S",
/* iPhone 6 */        "iPhone7,2": "iPhone 6",
/* iPhone 6 Plus */   "iPhone7,1": "iPhone 6 Plus",
/* iPhone 6S */       "iPhone8,1": "iPhone 6S",
/* iPhone 6S Plus */  "iPhone8,2": "iPhone 6S Plus",
/* iPhone SE */       "iPhone8,4": "iPhone SE",
/* iPhone 7 */        "iPhone9,1": "iPhone 7",
/* iPhone 7 */        "iPhone9,3": "iPhone 7",
/* iPhone 7 Plus */   "iPhone9,2": "iPhone 7 Plus",
/* iPhone 7 Plus */   "iPhone9,4": "iPhone 7 Plus",
/* iPad 2 */          "iPad2,1": "iPad 2", "iPad2,2": "iPad 2", "iPad2,3": "iPad 2", "iPad2,4": "iPad 2",
/* iPad 3 */          "iPad3,1": "iPad 3", "iPad3,2": "iPad 3", "iPad3,3":     "iPad 3",
/* iPad 4 */          "iPad3,4": "iPad 4", "iPad3,5": "iPad 4", "iPad3,6": "iPad 4",
/* iPad Air */        "iPad4,1": "iPad Air", "iPad4,2": "iPad Air", "iPad4,3": "iPad Air",
/* iPad Air 2 */      "iPad5,1": "iPad Air 2", "iPad5,3": "iPad Air 2", "iPad5,4": "iPad Air 2",
/* iPad Mini */       "iPad2,5": "iPad Mini 1", "iPad2,6": "iPad Mini 1", "iPad2,7": "iPad Mini 1",
/* iPad Mini 2 */     "iPad4,4": "iPad Mini 2", "iPad4,5": "iPad Mini 2", "iPad4,6": "iPad Mini 2",
/* iPad Mini 3 */     "iPad4,7": "iPad Mini 3", "iPad4,8": "iPad Mini 3", "iPad4,9": "iPad Mini 3",
/* iPad Pro 12.9 */   "iPad6,7": "iPad Pro 12.9", "iPad6,8": "iPad Pro 12.9",
/* iPad Pro  9.7 */   "iPad6,3": "iPad Pro 9.7", "iPad6,4": "iPad Pro 9.7",
/* Simulator */       "x86_64": "Simulator", "i386": "Simulator"
]

extension UIDevice {

    static var modelName: String {
        var systemInfo = utsname()
        uname(&systemInfo)

        let machine = systemInfo.machine
        let mirror = Mirror(reflecting: machine)

        var identifier = ""

        for child in mirror.children {
            if let value = child.value as? Int8, value != 0 {
                identifier += String(UnicodeScalar(UInt8(value)))
            }
        }
        return DeviceList[identifier] ?? identifier
    }

    static var isIphone4: Bool {
        return modelName == "iPhone 5" || modelName == "iPhone 5C" || modelName == "iPhone 5S" || UIDevice.isSimulatorIPhone4
    }

    static var isIphone5: Bool {
        return modelName == "iPhone 4S" || modelName == "iPhone 4" || UIDevice.isSimulatorIPhone5
    }

    static var isIphone6: Bool {
        return modelName == "iPhone 6" || UIDevice.isSimulatorIPhone6
    }
    static var isIphone6Plus: Bool {
        return modelName == "iPhone 6 Plus" || UIDevice.isSimulatorIPhone6Plus
    }

    static var isIpad: Bool {
        if UIDevice.current.model.contains("iPad") {
            return true
        }
        return false
    }

    static var isIphone: Bool {
        return !self.isIpad
    }

    /// Check if current device is iPhone4S (and earlier) relying on screen heigth
    static var isSimulatorIPhone4: Bool {
        return UIDevice.isSimulatorWithScreenHeigth(480)
    }

    /// Check if current device is iPhone5 relying on screen heigth
    static var isSimulatorIPhone5: Bool {
        return UIDevice.isSimulatorWithScreenHeigth(568)
    }

    /// Check if current device is iPhone6 relying on screen heigth
    static var isSimulatorIPhone6: Bool {
        return UIDevice.isSimulatorWithScreenHeigth(667)
    }

    /// Check if current device is iPhone6 Plus relying on screen heigth
    static var isSimulatorIPhone6Plus: Bool {
        return UIDevice.isSimulatorWithScreenHeigth(736)
    }

    private static func isSimulatorWithScreenHeigth(_ heigth: CGFloat) -> Bool {
        let screenSize: CGRect = UIScreen.main.bounds
        return modelName == "Simulator" && screenSize.height == heigth
    }

}
Luca Davanzo
źródło
5

To rozwiązanie działa zarówno na urządzeniach fizycznych, jak i na symulatorze iOS w taki sposób, że symulator zwraca ten sam model, co urządzenie fizyczne zwraca model, np. „IPhone10,6” dla iPhone X (GSM) zamiast „x86_64”.

Definicja - Swift 4:

import UIKit

extension UIDevice {
    var modelName: String {
        var systemInfo = utsname()
        uname(&systemInfo)
        let machineMirror = Mirror(reflecting: systemInfo.machine)
        let identifier = 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 let value = ProcessInfo.processInfo.environment["SIMULATOR_MODEL_IDENTIFIER"] {
            return value
        } else {
            return identifier
        }
    }
}

Stosowanie:

print(UIDevice.current.modelName)
Vedrano
źródło
4
#import <sys/utsname.h>

#define HARDWARE @{@"i386": @"Simulator",@"x86_64": @"Simulator",@"iPod1,1": @"iPod Touch",@"iPod2,1": @"iPod Touch 2nd Generation",@"iPod3,1": @"iPod Touch 3rd Generation",@"iPod4,1": @"iPod Touch 4th Generation",@"iPhone1,1": @"iPhone",@"iPhone1,2": @"iPhone 3G",@"iPhone2,1": @"iPhone 3GS",@"iPhone3,1": @"iPhone 4",@"iPhone4,1": @"iPhone 4S",@"iPhone5,1": @"iPhone 5",@"iPhone5,2": @"iPhone 5",@"iPhone5,3": @"iPhone 5c",@"iPhone5,4": @"iPhone 5c",@"iPhone6,1": @"iPhone 5s",@"iPhone6,2": @"iPhone 5s",@"iPad1,1": @"iPad",@"iPad2,1": @"iPad 2",@"iPad3,1": @"iPad 3rd Generation ",@"iPad3,4": @"iPad 4th Generation ",@"iPad2,5": @"iPad Mini",@"iPad4,4": @"iPad Mini 2nd Generation - Wifi",@"iPad4,5": @"iPad Mini 2nd Generation - Cellular",@"iPad4,1": @"iPad Air 5th Generation - Wifi",@"iPad4,2": @"iPad Air 5th Generation - Cellular"}

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    struct utsname systemInfo;
    uname(&systemInfo);
    NSLog(@"hardware: %@",[HARDWARE objectForKey:[NSString stringWithCString: systemInfo.machine encoding:NSUTF8StringEncoding]]);
}
Ocelot
źródło
3

Poniżej funkcji Idealnie działa na iOS7 lub nowszej wersji w Swift

func DeviceName()-> String {

        var myDeviceName : String = String()

        var systemInfo = [UInt8](count: sizeof(utsname), repeatedValue: 0)

        let model = systemInfo.withUnsafeMutableBufferPointer { (inout body: UnsafeMutableBufferPointer<UInt8>) -> String? in

            if uname(UnsafeMutablePointer(body.baseAddress)) != 0 {
                return nil
            }

            return String.fromCString(UnsafePointer(body.baseAddress.advancedBy(Int(_SYS_NAMELEN * 4))))
        }

        let deviceNamesByCode : [String: String] = ["iPod1,1":"iPod Touch 1",
                                                    "iPod2,1":"iPod Touch 2",
                                                    "iPod3,1":"iPod Touch 3",
                                                    "iPod4,1":"iPod Touch 4",
                                                    "iPod5,1":"iPod Touch 5",
                                                    "iPod7,1":"iPod Touch 6",
                                                    "iPhone1,1":"iPhone",
                                                    "iPhone1,2":"iPhone ",
                                                    "iPhone2,1":"iPhone ",
                                                    "iPhone3,1":"iPhone 4",
                                                    "iPhone3,2":"iPhone 4",
                                                    "iPhone3,3":"iPhone 4",
                                                    "iPhone4,1":"iPhone 4s",
                                                    "iPhone5,1":"iPhone 5",
                                                    "iPhone5,2":"iPhone 5",
                                                    "iPhone5,3":"iPhone 5c",
                                                    "iPhone5,4":"iPhone 5c",
                                                    "iPhone6,1":"iPhone 5s",
                                                    "iPhone6,2":"iPhone 5s",
                                                    "iPhone7,2":"iPhone 6",
                                                    "iPhone7,1":"iPhone 6 Plus",
                                                    "iPhone8,1":"iPhone 6s",
                                                    "iPhone8,2":"iPhone 6s Plus",
                                                    "iPhone8,4":"iPhone SE",
                                                    "iPad2,1":"iPad 2",
                                                    "iPad2,2":"iPad 2",
                                                    "iPad2,3":"iPad 2",
                                                    "iPad2,4":"iPad 2",
                                                    "iPad3,1":"iPad 3",
                                                    "iPad3,2":"iPad 3",
                                                    "iPad3,3":"iPad 3",
                                                    "iPad3,4":"iPad 4",
                                                    "iPad3,5":"iPad 4",
                                                    "iPad3,6":"iPad 4",
                                                    "iPad4,1":"iPad Air",
                                                    "iPad4,2":"iPad Air",
                                                    "iPad4,3":"iPad Air",
                                                    "iPad5,3":"iPad Air 2",
                                                    "iPad5,4":"iPad Air 2",
                                                    "iPad2,5":"iPad Mini",
                                                    "iPad2,6":"iPad Mini",
                                                    "iPad2,7":"iPad Mini",
                                                    "iPad4,4":"iPad Mini 2",
                                                    "iPad4,5":"iPad Mini 2",
                                                    "iPad4,6":"iPad Mini 2",
                                                    "iPad4,7":"iPad Mini 3",
                                                    "iPad4,8":"iPad Mini 3",
                                                    "iPad4,9":"iPad Mini 3",
                                                    "iPad5,1":"iPad Mini 4",
                                                    "iPad5,2":"iPad Mini 4",
                                                    "iPad6,3":"iPad Pro",
                                                    "iPad6,4":"iPad Pro",
                                                    "iPad6,7":"iPad Pro",
                                                    "iPad6,8":"iPad Pro",
                                                    "AppleTV5,3":"Apple TV",
                                                    "i386":"Simulator",
                                                    "x86_64":"Simulator"

        ]

        if model!.characters.count > 0 {
            myDeviceName = deviceNamesByCode[model!]!
        }else{
            myDeviceName = UIDevice.currentDevice().model
        }

        print("myDeviceName==\(myDeviceName)")
        return myDeviceName

    }
Renish Dadhaniya
źródło
Dziękuję za aktualizację! Zaktualizuj także nowe urządzenia.
Sohil R. Memon
3

Dodaj nowy plik z następującym kodem i po prostu zadzwoń. UIDevice.modelNameObejmuje to wszystkie modele wydane do tej pory, w tym iPhone'a 11 i Swift 5.0

import UIKit
import SystemConfiguration

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

        let deviceMapping = ["iPod5,1": "iPod Touch 5",
                             "iPod7,1": "iPod Touch 6",
                             "iPhone3,1": "iPhone 4",
                             "iPhone3,2": "iPhone 4",
                             "iPhone3,3": "iPhone 4",
                             "iPhone4,1": "iPhone 4s",
                             "iPhone5,1": "iPhone 5",
                             "iPhone5,2": "iPhone 5",
                             "iPhone5,3": "iPhone 5c",
                             "iPhone5,4": "iPhone 5c",
                             "iPhone6,1": "iPhone 5s",
                             "iPhone6,2": "iPhone 5s",
                             "iPhone7,2": "iPhone 6",
                             "iPhone7,1": "iPhone 6 Plus",
                             "iPhone8,1": "iPhone 6s",
                             "iPhone8,2": "iPhone 6s Plus",
                             "iPhone9,1": "iPhone 7",
                             "iPhone9,3": "iPhone 7",
                             "iPhone9,2": "iPhone 7 Plus",
                             "iPhone9,4": "iPhone 7 Plus",
                             "iPhone8,4": "iPhone SE",
                             "iPhone10,1": "iPhone 8",
                             "iPhone10,4": "iPhone 8",
                             "iPhone10,2": "iPhone 8 Plus",
                             "iPhone10,5": "iPhone 8 Plus",
                             "iPhone10,3": "iPhone X",
                             "iPhone10,6": "iPhone X",
                             "iPhone11,2": "iPhone XS",
                             "iPhone11,4": "iPhone XS Max",
                             "iPhone11,6": "iPhone XS Max",
                             "iPhone11,8": "iPhone XR",
                             "iPhone12,1": "iPhone 11",
                             "iPhone12,3": "iPhone 11 Pro",
                             "iPhone12,5": "iPhone 11 Pro Max",
                             "iPad2,1": "iPad 2",
                             "iPad2,2": "iPad 2",
                             "iPad2,3": "iPad 2",
                             "iPad2,4": "iPad 2",
                             "iPad3,1": "iPad 3",
                             "iPad3,2": "iPad 3",
                             "iPad3,3": "iPad 3",
                             "iPad3,4": "iPad 4",
                             "iPad3,5": "iPad 4",
                             "iPad3,6": "iPad 4",
                             "iPad4,1": "iPad Air",
                             "iPad4,2": "iPad Air",
                             "iPad4,3": "iPad Air",
                             "iPad5,3": "iPad Air 2",
                             "iPad5,4": "iPad Air 2",
                             "iPad6,11": "iPad 5",
                             "iPad6,12": "iPad 5",
                             "iPad7,5": "iPad 6",
                             "iPad7,6": "iPad 6",
                             "iPad2,5": "iPad Mini",
                             "iPad2,6": "iPad Mini",
                             "iPad2,7": "iPad Mini",
                             "iPad4,4": "iPad Mini 2",
                             "iPad4,5": "iPad Mini 2",
                             "iPad4,6": "iPad Mini 2",
                             "iPad4,7": "iPad Mini 3",
                             "iPad4,8": "iPad Mini 3",
                             "iPad4,9": "iPad Mini 3",
                             "iPad5,1": "iPad Mini 4",
                             "iPad5,2": "iPad Mini 4",
                             "iPad6,3": "iPad Pro (9.7-inch)",
                             "iPad6,4": "iPad Pro (9.7-inch)",
                             "iPad6,7": "iPad Pro (12.9-inch)",
                             "iPad6,8": "iPad Pro (12.9-inch)",
                             "iPad7,1": "iPad Pro (12.9-inch) (2nd generation)",
                             "iPad7,2": "iPad Pro (12.9-inch) (2nd generation)",
                             "iPad7,3": "iPad Pro (10.5-inch)",
                             "iPad7,4": "iPad Pro (10.5-inch)",
                             "iPad8,1": "iPad Pro (11-inch)",
                             "iPad8,2": "iPad Pro (11-inch)",
                             "iPad8,3": "iPad Pro (11-inch)",
                             "iPad8,4": "iPad Pro (11-inch)",
                             "iPad8,5": "iPad Pro (12.9-inch) (3rd generation)",
                             "iPad8,6": "iPad Pro (12.9-inch) (3rd generation)",
                             "iPad8,7": "iPad Pro (12.9-inch) (3rd generation)",
                             "iPad8,8": "iPad Pro (12.9-inch) (3rd generation)",
                             "AppleTV5,3": "Apple TV",
                             "AppleTV6,2": "Apple TV 4K",
                             "AudioAccessory1,1": "HomePod",
                             "i386": "32 bit Simulator",
                             "x86_64": "64 bit Simulator"]
        return deviceMapping[identifier] ?? identifier
    }()
}
Mohammed Shakeer
źródło
2

Zaoszczędź czas innym. Ponieważ zaakceptowano, musi głosować odpowiedź zaproponować bibliotekę, która korzysta z prywatnego interfejsu API, a moja aplikacja została odrzucona z powodu rozszerzenia uidevice jeszcze wczoraj! Przechodzę do biblioteki GBDeviceInfo, również zainstalowanej jako kapsuła, na razie wygląda ładnie, jest utrzymywana i aktualizowana do najnowszych urządzeń.

Renetik
źródło
2

Swift 4 lub nowszy

extension UIDevice {
    var modelName: String {
        if let modelName = ProcessInfo.processInfo.environment["SIMULATOR_MODEL_IDENTIFIER"] { return modelName }
        var info = utsname()
        uname(&info)
        return String(String.UnicodeScalarView(
                   Mirror(reflecting: info.machine)
                    .children
                    .compactMap {
                        guard let value = $0.value as? Int8 else { return nil }
                        let unicode = UnicodeScalar(UInt8(value))
                        return unicode.isASCII ? unicode : nil
                    }))
    }
}

UIDevice.current.modelName   // "iPad6,4"
Leo Dabus
źródło
1
To może być znacznie prostsze, ProcessInfo.processInfo.environment["SIMULATOR_DEVICE_NAME"]wystarczy.
DawnSong
1
//
//  UIDevice+Hardware.h
//  gauravds
//

#import <UIKit/UIKit.h>

@interface UIDevice (Hardware)

- (NSString *)modelIdentifier;
- (NSString *)modelName;

@end

Dlaczego nie stworzyć kategorii. Nie używaj problemu z przeciekami bezpieczeństwa metody Malloc. Używaj bezpiecznych funkcji.

NSLog(@"%@ %@", [[UIDevice currentDevice] modelName], [[UIDevice currentDevice] modelIdentifier]);

Zobacz implanty

//
//  UIDevice+Hardware.m
//  gauravds
//

#import "UIDevice+Hardware.h"
#import <sys/utsname.h>

@implementation UIDevice (Hardware)

- (NSString *)modelIdentifier {
    struct utsname systemInfo;
    uname(&systemInfo);
    return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}

- (NSString *)modelName {
    return [self modelNameForModelIdentifier:[self modelIdentifier]];
}

- (NSString *)modelNameForModelIdentifier:(NSString *)modelIdentifier {
    // iPhone http://theiphonewiki.com/wiki/IPhone

    if ([modelIdentifier isEqualToString:@"iPhone1,1"])    return @"iPhone 1G";
    if ([modelIdentifier isEqualToString:@"iPhone1,2"])    return @"iPhone 3G";
    if ([modelIdentifier isEqualToString:@"iPhone2,1"])    return @"iPhone 3GS";
    if ([modelIdentifier isEqualToString:@"iPhone3,1"])    return @"iPhone 4 (GSM)";
    if ([modelIdentifier isEqualToString:@"iPhone3,2"])    return @"iPhone 4 (GSM Rev A)";
    if ([modelIdentifier isEqualToString:@"iPhone3,3"])    return @"iPhone 4 (CDMA)";
    if ([modelIdentifier isEqualToString:@"iPhone4,1"])    return @"iPhone 4S";
    if ([modelIdentifier isEqualToString:@"iPhone5,1"])    return @"iPhone 5 (GSM)";
    if ([modelIdentifier isEqualToString:@"iPhone5,2"])    return @"iPhone 5 (Global)";
    if ([modelIdentifier isEqualToString:@"iPhone5,3"])    return @"iPhone 5c (GSM)";
    if ([modelIdentifier isEqualToString:@"iPhone5,4"])    return @"iPhone 5c (Global)";
    if ([modelIdentifier isEqualToString:@"iPhone6,1"])    return @"iPhone 5s (GSM)";
    if ([modelIdentifier isEqualToString:@"iPhone6,2"])    return @"iPhone 5s (Global)";
    if ([modelIdentifier isEqualToString:@"iPhone7,1"])    return @"iPhone 6 Plus";
    if ([modelIdentifier isEqualToString:@"iPhone7,2"])    return @"iPhone 6";
    if ([modelIdentifier isEqualToString:@"iPhone8,1"])    return @"iPhone 6s";
    if ([modelIdentifier isEqualToString:@"iPhone8,2"])    return @"iPhone 6s Plus";
    if ([modelIdentifier isEqualToString:@"iPhone8,4"])    return @"iPhone SE";
    if ([modelIdentifier isEqualToString:@"iPhone9,1"])    return @"iPhone 7";
    if ([modelIdentifier isEqualToString:@"iPhone9,2"])    return @"iPhone 7 Plus";
    if ([modelIdentifier isEqualToString:@"iPhone9,3"])    return @"iPhone 7";
    if ([modelIdentifier isEqualToString:@"iPhone9,4"])    return @"iPhone 7 Plus";
    if ([modelIdentifier isEqualToString:@"iPhone10,1"])   return @"iPhone 8";          // US (Verizon), China, Japan
    if ([modelIdentifier isEqualToString:@"iPhone10,2"])   return @"iPhone 8 Plus";     // US (Verizon), China, Japan
    if ([modelIdentifier isEqualToString:@"iPhone10,3"])   return @"iPhone X";          // US (Verizon), China, Japan
    if ([modelIdentifier isEqualToString:@"iPhone10,4"])   return @"iPhone 8";          // AT&T, Global
    if ([modelIdentifier isEqualToString:@"iPhone10,5"])   return @"iPhone 8 Plus";     // AT&T, Global
    if ([modelIdentifier isEqualToString:@"iPhone10,6"])   return @"iPhone X";          // AT&T, Global

    // iPad http://theiphonewiki.com/wiki/IPad

    if ([modelIdentifier isEqualToString:@"iPad1,1"])      return @"iPad 1G";
    if ([modelIdentifier isEqualToString:@"iPad2,1"])      return @"iPad 2 (Wi-Fi)";
    if ([modelIdentifier isEqualToString:@"iPad2,2"])      return @"iPad 2 (GSM)";
    if ([modelIdentifier isEqualToString:@"iPad2,3"])      return @"iPad 2 (CDMA)";
    if ([modelIdentifier isEqualToString:@"iPad2,4"])      return @"iPad 2 (Rev A)";
    if ([modelIdentifier isEqualToString:@"iPad3,1"])      return @"iPad 3 (Wi-Fi)";
    if ([modelIdentifier isEqualToString:@"iPad3,2"])      return @"iPad 3 (GSM)";
    if ([modelIdentifier isEqualToString:@"iPad3,3"])      return @"iPad 3 (Global)";
    if ([modelIdentifier isEqualToString:@"iPad3,4"])      return @"iPad 4 (Wi-Fi)";
    if ([modelIdentifier isEqualToString:@"iPad3,5"])      return @"iPad 4 (GSM)";
    if ([modelIdentifier isEqualToString:@"iPad3,6"])      return @"iPad 4 (Global)";
    if ([modelIdentifier isEqualToString:@"iPad6,11"])     return @"iPad (5th gen) (Wi-Fi)";
    if ([modelIdentifier isEqualToString:@"iPad6,12"])     return @"iPad (5th gen) (Cellular)";

    if ([modelIdentifier isEqualToString:@"iPad4,1"])      return @"iPad Air (Wi-Fi)";
    if ([modelIdentifier isEqualToString:@"iPad4,2"])      return @"iPad Air (Cellular)";
    if ([modelIdentifier isEqualToString:@"iPad5,3"])      return @"iPad Air 2 (Wi-Fi)";
    if ([modelIdentifier isEqualToString:@"iPad5,4"])      return @"iPad Air 2 (Cellular)";

    // iPad Mini http://theiphonewiki.com/wiki/IPad_mini

    if ([modelIdentifier isEqualToString:@"iPad2,5"])      return @"iPad mini 1G (Wi-Fi)";
    if ([modelIdentifier isEqualToString:@"iPad2,6"])      return @"iPad mini 1G (GSM)";
    if ([modelIdentifier isEqualToString:@"iPad2,7"])      return @"iPad mini 1G (Global)";
    if ([modelIdentifier isEqualToString:@"iPad4,4"])      return @"iPad mini 2G (Wi-Fi)";
    if ([modelIdentifier isEqualToString:@"iPad4,5"])      return @"iPad mini 2G (Cellular)";
    if ([modelIdentifier isEqualToString:@"iPad4,6"])      return @"iPad mini 2G (Cellular)"; // TD-LTE model see https://support.apple.com/en-us/HT201471#iPad-mini2
    if ([modelIdentifier isEqualToString:@"iPad4,7"])      return @"iPad mini 3G (Wi-Fi)";
    if ([modelIdentifier isEqualToString:@"iPad4,8"])      return @"iPad mini 3G (Cellular)";
    if ([modelIdentifier isEqualToString:@"iPad4,9"])      return @"iPad mini 3G (Cellular)";
    if ([modelIdentifier isEqualToString:@"iPad5,1"])      return @"iPad mini 4G (Wi-Fi)";
    if ([modelIdentifier isEqualToString:@"iPad5,2"])      return @"iPad mini 4G (Cellular)";

    // iPad Pro https://www.theiphonewiki.com/wiki/IPad_Pro

    if ([modelIdentifier isEqualToString:@"iPad6,3"])      return @"iPad Pro (9.7 inch) 1G (Wi-Fi)"; // http://pdadb.net/index.php?m=specs&id=9938&c=apple_ipad_pro_9.7-inch_a1673_wifi_32gb_apple_ipad_6,3
    if ([modelIdentifier isEqualToString:@"iPad6,4"])      return @"iPad Pro (9.7 inch) 1G (Cellular)"; // http://pdadb.net/index.php?m=specs&id=9981&c=apple_ipad_pro_9.7-inch_a1675_td-lte_32gb_apple_ipad_6,4
    if ([modelIdentifier isEqualToString:@"iPad6,7"])      return @"iPad Pro (12.9 inch) 1G (Wi-Fi)"; // http://pdadb.net/index.php?m=specs&id=8960&c=apple_ipad_pro_wifi_a1584_128gb
    if ([modelIdentifier isEqualToString:@"iPad6,8"])      return @"iPad Pro (12.9 inch) 1G (Cellular)"; // http://pdadb.net/index.php?m=specs&id=8965&c=apple_ipad_pro_td-lte_a1652_32gb_apple_ipad_6,8
    if ([modelIdentifier isEqualToString:@"iPad 7,1"])     return @"iPad Pro (12.9 inch) 2G (Wi-Fi)";
    if ([modelIdentifier isEqualToString:@"iPad 7,2"])     return @"iPad Pro (12.9 inch) 2G (Cellular)";
    if ([modelIdentifier isEqualToString:@"iPad 7,3"])     return @"iPad Pro (10.5 inch) 1G (Wi-Fi)";
    if ([modelIdentifier isEqualToString:@"iPad 7,4"])     return @"iPad Pro (10.5 inch) 1G (Cellular)";

    // iPod http://theiphonewiki.com/wiki/IPod

    if ([modelIdentifier isEqualToString:@"iPod1,1"])      return @"iPod touch 1G";
    if ([modelIdentifier isEqualToString:@"iPod2,1"])      return @"iPod touch 2G";
    if ([modelIdentifier isEqualToString:@"iPod3,1"])      return @"iPod touch 3G";
    if ([modelIdentifier isEqualToString:@"iPod4,1"])      return @"iPod touch 4G";
    if ([modelIdentifier isEqualToString:@"iPod5,1"])      return @"iPod touch 5G";
    if ([modelIdentifier isEqualToString:@"iPod7,1"])      return @"iPod touch 6G"; // as 6,1 was never released 7,1 is actually 6th generation

    // Apple TV https://www.theiphonewiki.com/wiki/Apple_TV

    if ([modelIdentifier isEqualToString:@"AppleTV1,1"])      return @"Apple TV 1G";
    if ([modelIdentifier isEqualToString:@"AppleTV2,1"])      return @"Apple TV 2G";
    if ([modelIdentifier isEqualToString:@"AppleTV3,1"])      return @"Apple TV 3G";
    if ([modelIdentifier isEqualToString:@"AppleTV3,2"])      return @"Apple TV 3G"; // small, incremental update over 3,1
    if ([modelIdentifier isEqualToString:@"AppleTV5,3"])      return @"Apple TV 4G"; // as 4,1 was never released, 5,1 is actually 4th generation

    // Simulator
    if ([modelIdentifier hasSuffix:@"86"] || [modelIdentifier isEqual:@"x86_64"])
    {
        BOOL smallerScreen = ([[UIScreen mainScreen] bounds].size.width < 768.0);
        return (smallerScreen ? @"iPhone Simulator" : @"iPad Simulator");
    }

    return modelIdentifier;
}

@end
dayitv89
źródło
0

Jeśli masz wiele urządzeń (np. Utrzymywanych przez @Tib powyżej w https://stackoverflow.com/a/17655825/849616 ) do obsługi, jeśli korzystasz z Swift 3:

extension UIDevice {
    /// Fetches the information about the name of the device.
    ///
    /// - Returns: Should return meaningful device name, if not found will return device system code.
    public static func modelName() -> String {
        let physicalName = deviceSystemCode()
        if let deviceTypes = deviceTypes(), let modelName = deviceTypes[physicalName] as? String {
            return modelName
        }
        return physicalName
    }
}

private extension UIDevice {
    /// Fetches from system the code of the device
    static func deviceSystemCode() -> String {
        var systemInfo = utsname()
        uname(&systemInfo)
        let machineMirror = Mirror(reflecting: systemInfo.machine)
        let identifier = machineMirror.children.reduce("") { identifier, element in
            guard let value = element.value as? Int8, value != 0 else { return identifier }
            return identifier + String(UnicodeScalar(UInt8(value)))
        }
        return identifier
    }

    /// Fetches the plist entries from plist maintained in https://stackoverflow.com/a/17655825/849616
    ///
    /// - Returns: A dictionary with pairs of deviceSystemCode <-> meaningfulDeviceName.
    static func deviceTypes() -> NSDictionary? {
        if let fileUrl = Bundle.main.url(forResource: "your plist name", withExtension: "plist"),
            let configurationDictionary = NSDictionary(contentsOf: fileUrl) {
            return configurationDictionary
        }
        return nil
    }
}

Później możesz to nazwać za pomocą UIDevice.modelName().

Dodatkowe kredyty trafiają do @Tib (dla plist), @Aniruddh Joshi (dla deviceSystemCode()funkcji).

Vive
źródło
0

Co z użyciem ideviceinfo, aby uzyskać te wartości? Powinien być w stanie zainstalować go za pomocąbrew install ideviceinfo

Następnie uruchomić:

PRODUCT_NAME=$(ideviceinfo --udid $DEVICE_UDID --key ProductName)
PRODUCT_TYPE=$(ideviceinfo --udid $DEVICE_UDID --key ProductType)
PRODUCT_VERSION=$(ideviceinfo --udid $DEVICE_UDID --key ProductVersion)
jmp
źródło