I am working on making our onboarding/installation process nicer. For that I decided it would be nice for SplashBuddy to say “Welcome to your ’MacBook (Air|Pro)/iMac/Mac (mini|Pro)”.
You can get the Mac model name easily enough from System Profiler:
$ system_profiler SPHardwareDataType
Hardware:
Hardware Overview:
Model Name: MacBook Pro
Model Identifier: MacBookPro14,3
However, this is only the “model family.” When you go into “About this Mac” it give you a more detailed “name” like “MacBook Pro (15-inch, 2017).”
Friendly people on the MacAdmins Slack pointed me towards a property list file in the ServerInformation framework:
/System/Library/PrivateFrameworks/ServerInformation.framework/Resources/English.lproj/SIMachineAttributes.plist
This contains the “Marketing Model Name” among other information for each type of Mac, sorted by the model identifier, which you can also get from system_profiler
or with sysctl -n hw.model
. Even better this plist is localized, so you can get the marketing name in the current user’s preferred language.
The easiest way to get the correct localization is to use the system’s NSBundle
class and methods and the read the property list. I chose Python to do this, since it offers access to NSBundle
with the Cocoa-bridge and reading and working with property lists is very easy. (Learn more about working with property lists in Python in my book: ‘Property Lists, Preferences and Profiles for Apple Administrators’)
You can run this script with a parameter:
$ ./modelinfo.py MacBookAir7,2
13" MacBook Air (Early 2015)
When you don’t give a parameter, it will use sysctl -n hw.model
to determine the current Mac’s model identifier and use that:
$ ./modelinfo.py
15" MacBook Pro with Thunderbolt 3 and Touch ID (Mid 2017)
Since the script uses NSBundle
and does not go directly to a specific localization of the property list file, it will give different language results depending on the preferred language of the user:
$ ./modelinfo.py # (Dutch)
15-inch MacBook Pro met Thunderbolt 3 en Touch ID (medio 2017)
$ ./modelinfo.py # (Japanese)
15インチMacBook Pro、Touch Barを搭載(Mid 2017)
Thanks for posting, Armin. Another option is to query a public web API provided by Apple. Erik Berglund has written a great blog post on that: http://erikberglund.github.io/2016/Apple_Product_Marketing_Name_Query/
Just discovered this, and deployed to some test Macs.
Sometimes I get good results like this: “MacBook Pro (13-inch, 2017, Four Thunderbolt 3 Ports)”
But other times I get this: “File Doesn’t Exist, Will Create: /var/root/Library/Preferences/com.apple.SystemProfiler.plist”
Any ideas about what’s going wrong, and/or suggestions on how to fix it?
Please ignore my last comment. I figured it out.