MacintoshModels

last edited December 16, 2008 13:21:19 (216.113.168.147)
CocoaDev is sponsored by: Panic: Shockingly good Mac software!

This page maintains an up-to-date ASCII property list for translating sysctl hw.model into human-readable strings.

Save the following text as a file named "Macintosh.dict", and add it to your app's (localized) Resources folder.

{
    "ADP2,1" = "Developer Transition Kit";
    "iMac,1" = iMac; 
    "iMac4,1" = "iMac (Core Duo)";
    "iMac5,1" = "iMac (Core 2 Duo)"; 
    "iMac6,1" = "iMac (24-inch Core 2 Duo)";
    "iMac7,1" = "iMac (Aluminum Core 2 Duo)";
    "iMac8,1" = "iMac (Aluminum Core 2 Duo)";
    "M43ADP1,1"  = "Development Mac Pro";
    "MacBook1,1" = "MacBook (Core Duo)";
    "MacBook2,1" = "MacBook (Core 2 Duo)";
    "MacBook3,1" = "MacBook (Core 2 Duo)";
    "MacBook4,1" = "MacBook (Early 2008)";
    "MacBookAir1,1" = "MacBook Air";
    "MacBookPro1,1" = "MacBook Pro (15-inch Core Duo)"; 
    "MacBookPro1,2" = "MacBook Pro (17-inch Core Duo)";
    "MacBookPro2,1" = "MacBook Pro (17-inch Core 2 Duo)";
    "MacBookPro2,2" = "MacBook Pro (15-inch Core 2 Duo)";
    "MacBookPro3,1" = "MacBook Pro (15-inch or 17-inch LED, Core 2 Duo)";
    "MacBookPro4,1" = "MacBook Pro (15-inch or 17-inch LED, Early 2008)";
    "MacBookPro5,1" = "MacBook Pro (15-inch LED Unibody, Late 2008)";
    "Macmini1,1" = "Mac mini (Core Duo/Solo)";
    "MacPro1,1" = "Mac Pro (Quad Xeon)";
    "MacPro2,1" = "Mac Pro (Octal Xeon)";
    "MacPro3,1" = "Mac Pro (Early 2008)";
    "PowerBook1,1" = "PowerBook G3"; 
    "PowerBook2,1" = iBook; 
    "PowerBook2,2" = "iBook (FireWire)"; 
    "PowerBook3,1" = "PowerBook G3 (FireWire)"; 
    "PowerBook3,2" = "PowerBook G4"; 
    "PowerBook3,3" = "PowerBook G4 (Gigabit Ethernet)"; 
    "PowerBook3,4" = "PowerBook G4 (DVI)"; 
    "PowerBook3,5" = "PowerBook G4 (867, 1 GHz)"; 
    "PowerBook4,1" = "iBook G3"; 
    "PowerBook4,2" = "iBook G3"; 
    "PowerBook4,3" = "iBook G3"; 
    "PowerBook5,1" = "PowerBook G4 (17-inch)"; 
    "PowerBook5,2" = "PowerBook G4 (15-inch FW800)"; 
    "PowerBook5,3" = "PowerBook G4 (17-inch 1.33 GHz)"; 
    "PowerBook5,4" = "PowerBook G4 (15-inch 1.5/1.33 GHz)"; 
    "PowerBook5,5" = "PowerBook G4 (17-inch 1.5 GHz)"; 
    "PowerBook5,6" = "PowerBook G4 (15-inch 1.67/1.5 GHz)"; 
    "PowerBook5,7" = "PowerBook G4 (17-inch 1.67 GHz)"; 
    "PowerBook5,8" = "PowerBook G4 (Double-Layer SD, 15-inch)"; 
    "PowerBook5,9" = "PowerBook G4 (Double-Layer SD, 17-inch)"; 
    "PowerBook6,1" = "PowerBook G4 (12-inch)"; 
    "PowerBook6,2" = "PowerBook G4 (12-inch DVI)"; 
    "PowerBook6,3" = "iBook G4"; 
    "PowerBook6,4" = "PowerBook G4 (12-inch 1.33 GHz)"; 
    "PowerBook6,5" = "iBook G4"; 
    "PowerBook6,7" = "iBook G4"; 
    "PowerBook6,8" = "PowerBook G4 (12-inch 1.5 GHz)"; 
    "PowerMac1,1" = "Power Macintosh G3 (B&W)"; 
    "PowerMac1,2" = "Power Macintosh G4 (PCI-Graphics)"; 
    "PowerMac10,1" = "Mac mini"; 
    "PowerMac10,2" = "Mac mini"; 
    "PowerMac11,2" = "Power Macintosh G5 (PCIe)"; 
    "PowerMac12,1" = "iMac G5 (iSight)"; 
    "PowerMac2,1" = "iMac (Slot-Loading)"; 
    "PowerMac2,2" = "iMac (2000)"; 
    "PowerMac3,1" = "Power Macintosh G4 (AGP-Graphics)"; 
    "PowerMac3,2" = "Power Macintosh G4 (AGP-Graphics)"; 
    "PowerMac3,3" = "Power Macintosh G4 (Gigabit Ethernet)"; 
    "PowerMac3,4" = "Power Macintosh G4 (Digital Audio)"; 
    "PowerMac3,5" = "Power Macintosh G4 (Quick Silver)"; 
    "PowerMac3,6" = "Power Macintosh G4 (Mirrored Drive Doors)"; 
    "PowerMac4,1" = "iMac (2001)"; 
    "PowerMac4,2" = "iMac (Flat Panel)"; 
    "PowerMac4,4" = "eMac G3"; 
    "PowerMac4,5" = "iMac (17-inch Flat Panel)"; 
    "PowerMac5,1" = "Power Macintosh G4 Cube"; 
    "PowerMac6,1" = "iMac (USB 2.0)"; 
    "PowerMac6,3" = "iMac (20-inch Flat Panel)"; 
    "PowerMac6,4" = "eMac (USB 2.0)"; 
    "PowerMac7,2" = "Power Macintosh G5"; 
    "PowerMac7,3" = "Power Macintosh G5"; 
    "PowerMac8,1" = "iMac G5"; 
    "PowerMac8,2" = "iMac G5 (Ambient Light Sensor)"; 
    "PowerMac9,1" = "Power Macintosh G5 (Late 2004)"; 
    "RackMac1,1" = "Xserve G4"; 
    "RackMac1,2" = "Xserve G4 (Slot-Loading)"; 
    "RackMac3,1" = "Xserve G5";
    "Xserve1,1" = "Xserve Xeon";
    "Xserve2,1" = "Xserve Xeon";
}

and add these two methods to one of your classes:

#import <sys/sysctl.h>

+ (NSString *)hardwareModel
{
    static NSString *hardwareModel = nil;
    if (!hardwareModel) {
        char buffer[128];
        size_t length = sizeof(buffer);
        if (sysctlbyname("hw.model", &buffer, &length, NULL, 0) == 0) {
            hardwareModel = [[NSString allocWithZone:NULL] initWithCString:buffer encoding:NSASCIIStringEncoding];
        }
        if (!hardwareModel || [hardwareModel length] == 0) {
            hardwareModel = @"Unknown";
        }
    }
    return hardwareModel;    
}

+ (NSString *)computerModel
{
    static NSString *computerModel = nil;
    if (!computerModel) {
        NSString *path, *hardwareModel = [self hardwareModel];
        if ((path = [[NSBundle mainBundle] pathForResource:@"Macintosh" ofType:@"dict"])) {
            computerModel = [[[NSDictionary dictionaryWithContentsOfFile:path] objectForKey:hardwareModel] copy];
        }
        if (!computerModel) {
            char buffer[128];
            size_t length = sizeof(buffer);
            if (sysctlbyname("hw.machine", &buffer, &length, NULL, 0) == 0) {
                computerModel = [[NSString allocWithZone:NULL] initWithCString:buffer encoding:NSASCIIStringEncoding];
            }
        }
        if (!computerModel || [computerModel length] == 0) {
            computerModel = [[NSString allocWithZone:NULL] initWithFormat:@"%@ computer model", hardwareModel];
        }
    }
    return computerModel;
}


Revision History

  • 07/29/06 - created page - ShaunWexler, MacFOH?
  • 08/08/06 - added MacPro?1,1 - ShaunWexler
  • 09/07/06 - added iMac5,1/6,1 - ShaunWexler
  • 09/24/06 - rewritten to use sysctlbyname instead of IOKit - ShaunWexler
  • 09/25/06 - added MacBookPro?1,2 - AngusHardie?
  • 11/05/06 - added MacBookPro?2,1/2,2 - ShaunWexler
  • 12/14/06 - added MacBook?2,1 - ShaunWexler
  • 06/05/07 - added MacBookPro?3,1/3,2 - ShaunWexler
  • 11/10/07 - added MacBook?3,1 - SteveCheckoway?
  • 11/11/07 - MacBookPro?3,1 covers both 15" and 17" - Dan Griscom
  • 11/11/07 - added iMac7,1 and iMac8,1 for Aluminum iMacs - Mike Taylor
  • 12/16/08 - added MacBookPro?5,1 - Dallas Brown