Getting xCode to run on unsupported versions of macOS
My MacBook Air 2017 has been running macOS Monterey (12.6.5), the last version to support my MacBook model, which in turns supports up to Xcode 14.2. xCode 14.3 requires macOS Ventura 13 (which can’t be run on Macbook Air 2017), so I had postponed the update for so long as I could still use xCode to publish iOS and macOS apps. However, when a new project requires iOS 17 SDK (which comes with xCode 15), I decided to find a way to get xCode 15 to run on macOS Monterey, which is not officially supported.
The first thing to know is that the macOS version shown in the About This Mac screen is simple retrieved from /System/Library/CoreServices/SystemVersion.plist:
On versions up to OS X El Capitan (10.11, released in 2015), all you need to do to change the reported version number is to edit this file, update various version fields and reboot:
<?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>ProductBuildVersion</key> <string>21G217</string> <key>ProductCopyright</key> <string>1983-2022 Apple Inc.</string> <key>ProductName</key> <string>macOS</string> <key>ProductUserVisibleVersion</key> <string>12.6.1</string> <key>ProductVersion</key> <string>12.6.1</string> <key>iOSSupportVersion</key> <string>15.7</string> </dict> </plist>
If you try this, start with changing the only minor build number (e.g. 12.6.1 to 12.6.4). If the version check is purely a formality, changing the version number will cheat applications into thinking they are running on the expected macOS version, allowing them to start. Obviously, if a certain functionality from the application really requires features from the newer OS version, merely changing the version field will not get things to work. Do not try to update System Software after changing the version number, as the updater might download packages meant for the newer version and corrupt the system. Finally, only change the major build number (e.g. 12.6 to 13.0) as a last resort, as some libraries will refuse to start if the wrong major build number is detected, which could result in serious system serious issues.
On recent versions of macOS which implement System Integrity Protection (SIP), you will need to boot into recovery mode and disable SIP before the SystemVersion.plist can be updated. Otherwise, nano will report “Operation not permitted” when saving the file:
In my case, getting xCode 15 to work on macOS Monterey would require setting the version number to 13.4, a change I am totally not comfortable with. Fortunately, there is another way to change the Info.plist of the xCode application package to lower the system requirement. To do this, right click xCode application icon and choose Show Package Contents:
Inside Info.plist file you will see a field named Minimum system version. By default, the field is set to 13.4 which means that xCode will refuse to run on older versions. To get it to run on Monterey, set this field to 12.5:
Save the file and reboot the machine (as the plist contents of each application package may be cached until reboot). After that, you should see that xCode 15 now works just fine on Monterey. This method of changing xCode’s Info,plist is better as it does not require disabling System Integrity Protection and modifying SystemVersion.plist which could potential affects other apps. Obviously if you use functionalities of xCode 15 which make use of macOS Ventura’s specific features, then things will not work. However, in my case, I was able to build and submit my iOS application using iOS 17 SDK on xCode 15 running on macOS Monterey with this simple change.
I hope this note will be helpful to you. In any case, I hate forced obsolescence – it treats users like idiots and serves no purpose except to force you to buy new devices unnecessarily, wasting money and harming the environment in the process.