วิธีรับยี่ห้อและรุ่นอุปกรณ์บน iOS


246

ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะระบุว่า iPhone ประเภทใด (เช่น) อุปกรณ์ปัจจุบันคืออะไร ฉันรู้ว่าเป็นไปได้ที่จะได้รับรุ่น
NSString *deviceType = [[UIDevice currentDevice] model];
ที่เพิ่งจะกลับมาว่าฉันมี "iPhone" หรือ "iPod" แต่ฉันสงสัยว่ามันเป็นไปได้ที่จะตรวจสอบ / รู้ว่าฉันมี iPhone 3GS กับ iPhone 4 หรือเทียบกับ มี iPhone 4S (ในความเป็นจริงทั้งหมดที่ฉันอยากจะทำคือการตรวจสอบว่าฉันมี 3G หรือไม่เพราะฉันทำอย่างเป็นธรรมกราฟิกสิ่งเข้มข้น)

ใช่บอกฉันด้วยขอบคุณ!


คำตอบนี้อาจช่วยได้: stackoverflow.com/a/10240849/653513
Rok Jarc

1
"(ในความเป็นจริงสิ่งที่ฉันต้องทำคือกำหนดว่าฉันมี 3G หรือไม่เพราะฉันกำลังทำกราฟิกค่อนข้างเข้มข้น)" - ในกรณีของคุณ Apple แนะนำให้คุณตรวจสอบความพร้อมใช้งานของฟีเจอร์ต่าง ๆอย่างชาญฉลาดแทนที่จะตรวจสอบรุ่นอุปกรณ์จริงและใช้วิจารณญาณ (ซึ่งคุณต้องมีตารางบางประเภท) วิธีที่แนะนำนั้นง่ายกว่าและมีหลักฐานในอนาคต
Nicolas Miari

คำถามนี้เก่ามากและ iPhone 3G แทบจะไม่มีอยู่จริง แต่ในกรณีนี้คุณควรตรวจสอบความพร้อมใช้งานของ OpenGL ES 2.0 API ด้วยการสร้าง renderer และดูว่าสำเร็จ :-),
Nicolas Miari

ตรวจสอบ github.com/aleemrazzaq/ARCompactDeviceInfo นี้มีรุ่นอุปกรณ์ล่าสุด, iPhone X, iPhone 8, 8 Plus และ iPad รุ่นที่ 6 2018
Aleem

วิธีที่เชื่อถือได้ในโหมด: stackoverflow.com/a/56145991/1107242
DawnSong

คำตอบ:


553

ทั้งสองลองห้องสมุดนี้: http://github.com/erica/uidevice-extension/ (โดย Erica Sadun) (ห้องสมุดมีอายุ 7-8 ปีและล้าสมัย)

(รหัสตัวอย่าง):

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

หรือคุณสามารถใช้วิธีนี้:

คุณสามารถรับหมายเลขรุ่นอุปกรณ์โดยใช้ uname จาก sys / utsname.h ตัวอย่างเช่น:

Objective-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];
    }

สวิฟท์ 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)

ผลลัพธ์ควรเป็น:

// 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)

7
สิ่งนี้ทำให้การอนุมัติ appstore ของแอพอยู่ในความเสี่ยงหรือไม่?
Alexis

5
@jafar ไม่ไม่ได้ ;)
Aniruddh Joshi

2
ฉันจะเรียกเมธอด machineName ได้อย่างไร
Marko

3
วิธีใดที่เราสามารถระบุ iPhone X ในเครื่องจำลองได้ ดูเหมือนว่ามันตอบสนองด้วย "Simulator"
bendigi

2
รายการอุปกรณ์ที่ทันสมัยสามารถพบได้ที่นี่: gist.github.com/adamawolf/3048717
Sébastien

137

เมื่อเพิ่มคำตอบของ OhhMee ด้านบนฉันได้เพิ่มบางส่วนที่ไม่ปลอดภัยเพื่อรองรับอุปกรณ์ในอนาคตที่ยังไม่รวมอยู่ในรายการ:

#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

ฉันยังละเว้นข้อมูลรายละเอียด (เช่น "รุ่น A1507, A1516, A1526 (จีน), A1529 | ทั่วโลก") และวางไว้ในความคิดเห็นแทนในกรณีที่คุณต้องการใช้สิ่งนี้เป็นสตริงที่ผู้ใช้หันหน้าไปทางและไม่ทำให้พวกเขาประหลาด


แก้ไข: คำตอบนี้ให้การใช้งานที่คล้ายกันโดยใช้ Swift 2

แก้ไข 2:ฉันเพิ่งเพิ่มรุ่น iPad Pro (ทั้งสองขนาด) สำหรับการอ้างอิงในอนาคตหมายเลขรุ่น / ฯลฯ สามารถพบได้ในThe iPhone Wikiที่วิกิพีเดีย

แก้ไข 3:เพิ่มการรองรับ iPhone XS, iPhone XS Max และ iPhone XR

แก้ไข 4:เพิ่มการรองรับสำหรับ iPhone 11, iPhone 11 Pro และ iPhone 11 Pro Max


3
ผมก็เข้าใจผิดค้นหาสตริง "iPhone", "iPad" และ "ไอพอด" ในเมื่อฉันตั้งใจที่จะค้นหาdeviceName codeมีคนแนะนำการแก้ไข แต่ฉันไม่สามารถอนุมัติได้ก่อนที่คนอื่นจะปฏิเสธดังนั้นฉันจึงแก้ไขคำตอบด้วยตนเอง ขอบคุณใครก็ตามที่แนะนำมัน
Nicolas Miari

1
ฉันใช้สิ่งนี้ ใช้งานได้ดี ขอบคุณ Nicolas
braden

@NicolasMiari ฉันได้เพิ่มสิ่งที่ขาดหายไป
tounaobun

เป็นรหัสที่ไม่ซ้ำกัน ไม่มีเอกสารอย่างเป็นทางการสำหรับ systemInfo.machine ตัวระบุเช่น "iPhone7,2" จะไม่ซ้ำกันสำหรับ @ "iPhone 6" หรือจะเปลี่ยนในอนาคต
Ashish Pisey

@AshishPisey ไม่มีความคิด ดูเหมือนจะไม่มีการเปลี่ยนแปลงในขณะที่และมันรู้สึกเหมือนว่ามันจะไม่ ทุกคนใช้ API นี้แม้ว่า; ฉันไม่ทราบวิธีอื่นใด ...
Nicolas Miari

46

ฉันได้สร้างไฟล์ plist เพื่อช่วยให้คุณได้รับชื่อที่สมบูรณ์สำหรับแต่ละอุปกรณ์ (ซอร์สโค้ดตรงท้ายคำตอบของฉัน)

จากคำตอบของ OhhMeeคุณสามารถใช้สิ่งนี้:

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
    }

อย่าลืมเพิ่ม #import <sys/utsname.h>ในส่วนหัว Bridging ของคุณ

วัตถุประสงค์ 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];
}

ไฟล์ 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>

อัปเดตด้วยอุปกรณ์ล่าสุด (iPhone 6S, iPad Pro, ฯลฯ )
Tib

1
โปรดใส่เนื้อหาของไฟล์ plist ลงในคำตอบของคุณ (หวังว่าจะได้รับการจัดรูปแบบเป็นรหัส) กฎเดียวกันกับที่ใช้กับคำตอบแบบลิงก์เท่านั้นใช้กับไฟล์สำคัญที่เก็บไว้นอก SO: มันอาจหายไปในบางวัน
Nicolas Miari

3
อัปเดตกับอุปกรณ์ล่าสุด: iPhone 8 (บวก), iPhone X, iPad Pro 12.9 นิ้ว 2nd Gen, iPad Pro 10.5 นิ้ว
vilmoskörte

2
อัปเดตด้วยอุปกรณ์ใหม่: iPhone XS, XS Max และ XR
vilmoskörte

2
เพิ่ม ipad pro รุ่นที่ 3 (iPad 8,1 ไปยัง iPad 8,8) ไปยังแพลตฟอร์ม
Cory Trese

20

[[UIDevice currentDevice] model]เพียงแค่ส่งคืนiPhoneหรือiPodคุณจะไม่ได้รับหมายเลขรุ่นที่จะให้คุณแยกความแตกต่างระหว่างอุปกรณ์รุ่นต่าง ๆ

รหัสวิธีนี้:

#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;
}

และเรียกวิธีการ [self getModel]เมื่อใดก็ตามที่คุณต้องการโมเดลและคุณจะได้รับเช่น: "iPhone5,1" สำหรับ iPhone 5 ที่บางและรวดเร็ว

วิธีปฏิบัติที่ดีอย่างหนึ่งคือการสร้างคลาสที่เรียกว่าUtils.h/Utils.mและวางวิธีเช่นgetModelนั้นเพื่อให้คุณสามารถรับข้อมูลนี้ได้จากทุกที่ในแอปของคุณเพียงแค่นำเข้าคลาสและเรียก[Utils getModel];


12

ฉันปรับการใช้งานของ NicolasMiari ให้เหมาะสมแล้วเพิ่มSimulatorที่นี่:

+ (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;
}

`` `


1
เราจำเป็นต้องเปลี่ยนให้เป็น GitHub repo และอัปเดตทุกครั้งที่มี iPhones / iPads / etc ใหม่ รับเพิ่มเข้าแถว!
Nicolas Miari

1
บางทีแม้แต่ cocoapod
Adam W. Dennis

12

ด้านล่างเป็นรหัสสำหรับ ( รหัสอาจไม่มีสตริงของอุปกรณ์ทั้งหมดฉันกับผู้ชายคนอื่น ๆ กำลังรักษารหัสเดียวกันบนGitHubดังนั้นโปรดใช้รหัสล่าสุดจากที่นั่น )

วัตถุประสงค์ -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;
}

11

หมวดหมู่สำหรับการหนีจากคำอธิบาย NSString

โดยทั่วไปเป็นสิ่งที่พึงประสงค์เพื่อหลีกเลี่ยงการเปรียบเทียบสตริงโดยพลการตลอดโค้ดของคุณ มันจะดีกว่าที่จะปรับปรุงสตริงในที่เดียวและซ่อนสายมายากลจากแอปของคุณ ฉันจัดให้มีหมวดหมู่UIDeviceเพื่อจุดประสงค์นั้น

สำหรับความต้องการเฉพาะของฉันฉันจำเป็นต้องรู้ว่าฉันใช้อุปกรณ์ใดโดยไม่จำเป็นต้องรู้เฉพาะเกี่ยวกับความสามารถในการเชื่อมต่อเครือข่ายที่สามารถเรียกคืนได้อย่างง่ายดายในวิธีอื่น ดังนั้นคุณจะพบว่าหยาบยิ่งenumกว่ารายการอุปกรณ์ที่กำลังเติบโต

การอัปเดตเป็นเรื่องของการเพิ่มอุปกรณ์ในตาราง enum และค้นหา

UIDevice + NTNUExtensions.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

นี่เป็นทางออกที่ดี ส่วนขยายที่มีประโยชน์คือการเรียงลำดับ enum ตามโปรเซสเซอร์ของอุปกรณ์ซึ่งให้คุณใช้การเปรียบเทียบ <หรือ> อย่างง่ายเพื่อตรวจสอบว่าอุปกรณ์มีประสิทธิภาพน้อยกว่าหรือมีประสิทธิภาพมากกว่าเป้าหมายของคุณหรือไม่ ตัวอย่างเช่นหากคุณต้องการ จำกัด ภาพเคลื่อนไหวพื้นหลังบนอุปกรณ์ที่มาก่อน iPhone 4S
Mischinab

9

ชื่ออุปกรณ์และชื่อเครื่องตามฮาร์ดแวร์อุปกรณ์ iOS จริง

วิธีแก้ปัญหาของฉันในเรื่องนี้โดยทั่วไปดูเหมือนจะเกี่ยวข้องกับ@NicolasMiariคำตอบในชุดข้อความนี้ คลาสยูทิลิตี้แยกมีชุดชื่ออุปกรณ์และเครื่องที่กำหนดไว้ล่วงหน้าและจากนั้นขึ้นอยู่กับชื่อเครื่องจริงเรียกชื่ออุปกรณ์

หมายเหตุ:คำตอบนี้และมีการเชื่อมโยงโครงการ GitHub ได้รับการอัปเดตเพื่อระบุiPhonesล่าสุดปัจจุบัน(iPhone 8, 8+, X)ณ เดือนตุลาคม 2017 และใช้กับiOS11 ได้เช่นกัน กรุณาเยี่ยมชม repo GitHub และดูและให้ข้อเสนอแนะถ้ามีอะไรผิดปกติ

/*
 * 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;
}

ฉันได้เพิ่มการใช้งานนี้และวิธีการอรรถประโยชน์อื่น ๆ ที่สะดวกสบายในชั้นเรียนและวางไว้ในGitHub Repositoryนี้ และคุณสามารถค้นหารายการข้อมูลอุปกรณ์ล่าสุดภายในหน้า Wiki นี้หน้าวิกิพีเดีย

กรุณาเยี่ยมชมและใช้ประโยชน์จากมัน

ปรับปรุง:

คุณอาจต้องนำเข้ากรอบ sys

#import <sys/utsname.h>

1
Kasun ขอบคุณสำหรับการดำเนินการปรับปรุงนี้ โปรดลองอัปเดตต่อไปสำหรับรุ่นใหม่ในอนาคต
Hemang

7

รองรับ 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
    }

}

5

โซลูชันนี้ใช้งานได้ทั้งอุปกรณ์ทางกายภาพและอุปกรณ์จำลอง iOS ในลักษณะที่เครื่องมือจำลองส่งคืนรุ่นเดียวกันกับอุปกรณ์ทางกายภาพที่จะกลับมาเป็นรุ่นเช่น "iPhone10,6" สำหรับ iPhone X (GSM) แทนที่จะเป็น "x86_64"

คำจำกัดความ - 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
        }
    }
}

การใช้งาน:

print(UIDevice.current.modelName)

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]]);
}

3

ฟังก์ชั่นด้านล่างทำงานได้อย่างสมบูรณ์แบบบน iOS7 หรือเวอร์ชั่นใหม่กว่าใน 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

    }

ขอบคุณสำหรับการอัพเดท! และโปรดอัปเดตสำหรับอุปกรณ์ใหม่ด้วย
Sohil R. Memon

3

เพิ่มไฟล์ใหม่ด้วยรหัสต่อไปนี้และเรียกง่ายๆว่าUIDevice.modelNameนี้ประกอบด้วยทุกรุ่นที่วางจำหน่ายจนถึงปัจจุบันรวมถึงiPhone 11 series และใน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
    }()
}

2

เพื่อประหยัดเวลาของผู้อื่น เพราะยอมรับแล้วต้องโหวตตอบไลบรารี่ที่ใช้ API ส่วนตัวและแอพของฉันถูกปฏิเสธเพราะ uidevice-extension เมื่อวานนี้! ฉันเปลี่ยนไปใช้ไลบรารี GBDeviceInfo ติดตั้งเป็นพ็อดด้วยตอนนี้มันดูดีดูแลรักษาและอัปเดตเป็นอุปกรณ์ล่าสุด


2

Swift 4 หรือใหม่กว่า

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"

1
มันง่ายกว่าProcessInfo.processInfo.environment["SIMULATOR_DEVICE_NAME"]นี้มากพอ
DawnSong

1
//
//  UIDevice+Hardware.h
//  gauravds
//

#import <UIKit/UIKit.h>

@interface UIDevice (Hardware)

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

@end

ทำไมไม่สร้างหมวดหมู่ อย่าใช้ปัญหาการรั่วไหลของความปลอดภัยของเมธอด malloc ใช้ฟังก์ชั่นที่ปลอดภัย

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

ดูการปลูกฝัง

//
//  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

0

หากคุณมีอุปกรณ์มากมาย (เช่นดูแลโดย @Tib ด้านบนในhttps://stackoverflow.com/a/17655825/849616 ) เพื่อจัดการหาก 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
    }
}

UIDevice.modelName()หลังจากนั้นคุณสามารถเรียกมันใช้

เครดิตเพิ่มเติมไปที่ @Tib (สำหรับผู้มีรายละเอียด), @Aniruddh Joshi (สำหรับdeviceSystemCode()ฟังก์ชั่น)


0

แล้วการใช้ideviceinfoเพื่อรับค่าเหล่านี้ล่ะ? ควรจะสามารถติดตั้งได้โดยใช้brew install ideviceinfo

จากนั้นเรียกใช้:

PRODUCT_NAME=$(ideviceinfo --udid $DEVICE_UDID --key ProductName)
PRODUCT_TYPE=$(ideviceinfo --udid $DEVICE_UDID --key ProductType)
PRODUCT_VERSION=$(ideviceinfo --udid $DEVICE_UDID --key ProductVersion)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.