Tricking Xcode into Running on an ‘Unsupported’ macOS

Every year, with each major macOS update, we’re greeted by an annoying surprise—Xcode refuses to launch, insisting that we upgrade to a newer version. But sometimes, upgrading isn’t an option.

Maybe your team’s app isn’t ready yet due to build system issues, breaking API changes, or other compatibility problems. In my case, it usually takes a couple of months before our project is fully prepared for the latest Xcode release. While holding off on upgrading macOS is an option, sometimes the new macOS version has features that make the upgrade too tempting to resist. But if it’s your work machine, the priority is clear: you need to be able to do your job.

Fortunately, this limitation is entirely artificial—and we can work around it. Apple didn’t always enforce this, which makes it all the more frustrating. But let’s focus on the solution. There are two ways to bypass this restriction and get an older Xcode version running on a newer macOS.

Strategy 1: Updating the Info.plist File #

One way to convince Xcode to launch again is by modifying its Info.plist file, which contains metadata about the app. Specifically, we need to update the bundle version to match the latest Xcode version.

Here’s how:

  1. Right-click on the Xcode.app bundle and select “Show Package Contents”.
  2. Navigate to Contents/Info.plist.
  3. Open Info.plist in a text editor (or Xcode itself).
  4. Locate the CFBundleVersion key and set its value to the build number of the latest Xcode version. For example, for Xcode 16, use 23507.
  5. Save the file and try launching Xcode again.

With this change, Xcode will no longer be flagged as incompatible, and you’ll be able to use it as usual.

Strategy 2: Running the Xcode Executable Directly #

A simpler (and my preferred) method is bypassing macOS’s bundle check entirely by running Xcode’s executable directly.

macOS only verifies the Info.plist file when launching an app from the Finder or Dock. However, if you run the actual binary inside the .app bundle, this check is skipped.

Here’s how to do it:

  1. Open Terminal.

  2. Navigate to Xcode’s internal MacOS directory:

    cd /Applications/Xcode.app/Contents/MacOS
    
  3. Run Xcode manually:

This method works because .app bundles are just folders with an executable inside. Instead of launching Xcode through the Finder (which enforces the version check), we launch the executable directly.

Conclusion #

As you can see, older Xcode versions aren’t truly incompatible with newer macOS releases—they’re just artificially restricted. With a little effort, we can work around Apple’s restrictions and get back to work.

That said, I still don’t understand why Apple insists on making this process harder for developers. If anyone at Apple is reading this—please, just let us use older Xcode versions without unnecessary obstacles, or at least explain why this restriction exists!