Xcode Bug Installed Platforms

Hello,

I’m using the latest version of Xcode, 26.6.

I’m unable to permanently delete old installed iOS platform versions. I remove them from Xcode settings, and the deletion appears to complete successfully, but after rebooting my Mac they appear again, as if nothing had changed.

Do you have any suggestions for how to remove them correctly and permanently?

Answered by DTS Engineer in 895807022

Thanks for the post. I’m not very sure how you do that as is possible to do it on Xcode without any issue. However I normally I delete the dmg files and that’s the fastest way for me.

Since Xcode stores modern simulator runtimes as disk images try this and let me know.

  1. Quit Xcode
  2. Open Finder
  3. Go to Folder and paste the following path: /Library/Developer/CoreSimulator/Images/
  4. Inside this folder, you will see .dmg files. You might also see an images.plist file.
  5. Move the .dmg files for the iOS versions you no longer want to the Trash.
  6. Empty the Trash.
  7. Restart your Mac.

Let me know if that work for you. I would still recommend to use Xcode to remove the ones you do not want.

Albert  WWDR

Accepted Answer

Thanks for the post. I’m not very sure how you do that as is possible to do it on Xcode without any issue. However I normally I delete the dmg files and that’s the fastest way for me.

Since Xcode stores modern simulator runtimes as disk images try this and let me know.

  1. Quit Xcode
  2. Open Finder
  3. Go to Folder and paste the following path: /Library/Developer/CoreSimulator/Images/
  4. Inside this folder, you will see .dmg files. You might also see an images.plist file.
  5. Move the .dmg files for the iOS versions you no longer want to the Trash.
  6. Empty the Trash.
  7. Restart your Mac.

Let me know if that work for you. I would still recommend to use Xcode to remove the ones you do not want.

Albert  WWDR

It works! Thank you!

@danielecalz No problem, I believe I have failed in my attempt to determine if there is an issue with using Xcode for that purpose. I will attempt your workflow and see if it is works for me. Thank you.

Albert  WWDR

Hello, I'm back on this thread because during a routine check I found the iOS 18.6 runtime is still present, even though I removed it earlier using the steps above. I'd like to understand whether this is expected, and what the supported removal path is.

Environment

  • macOS 26.6.2 (25G83)
  • Xcode 26.6 (17F113) — only the iOS 26.5 SDK installed
  • SIP enabled
  • Runtime in question: iOS 18.6 (22G86), originally installed 31 Jul 2025 under Xcode 16.x

What I see

simctl lists the runtime:

$ xcrun simctl list runtimes
iOS 18.6 (18.6 - 22G86) - com.apple.CoreSimulator.SimRuntime.iOS-18-6
iOS 26.5 (26.5 - 23F77) - com.apple.CoreSimulator.SimRuntime.iOS-26-5

But the disk-image registry knows only one image, and standaloneBundles is empty:

$ xcrun simctl runtime list -v
iOS 26.5 (23F77) - E74767EC-… (Ready, Deletable: YES)
Total Disk Images: 1 (7.9G)

Consequently Xcode → Settings → Components does not list iOS 18.6 at all, and every delete attempt fails:

$ xcrun simctl runtime delete 22G86 --dry-run
No runtime disk images or bundles found matching '22G86'. Try 'runtime list'.

$ xcrun simctl runtime delete com.apple.CoreSimulator.SimRuntime.iOS-18-6 --dry-run
No runtime disk images or bundles found matching '…iOS-18-6'.

It is nonetheless mounted at every boot, in a two-stage chain:

AssetsV2/…/7fd8477b….asset/AssetData/043-18670-100.dmg  (8.5 GB)
  → mounts at Cryptex/Images/bundle/SimRuntimeBundle-B4381322-…
      → its Restore/043-19278-100.dmg
          → mounts at /Library/Developer/CoreSimulator/Volumes/iOS_22G86

No simulator device targets it (both my devices are on 26.5).

What I tried

Unmounting works, and 18.6 then disappears from simctl list runtimes — but only until the next reboot, when CoreSimulator re-mounts it from the asset:

kill <SimLaunchHost pid>        # held liblaunch_sim.dylib from the 18.6 runtime
hdiutil detach /dev/diskN       # inner iOS_22G86 volume
hdiutil detach /dev/diskM       # outer SimRuntimeBundle mount

Deleting the asset is blocked by two separate layers:

  • /Library/Developer/CoreSimulator/** returns EPERM (errno 1), not EACCES — granting the terminal Full Disk Access resolved that part.
  • The asset directory itself carries the SIP restricted flag, so FDA doesn't help:
drwxr-xr-x@ 5 _nsurlsessiond wheel restricted …/7fd8477b….asset

Re-registering it so that simctl runtime delete could handle it fails structurally — runtime add tries to copy the inner dmg onto the read-only volume it has just mounted:

$ xcrun simctl runtime add ".../AssetData/043-18670-100.dmg"
C: 8FB44FD5-… <unknown platform> (Unusable - Copy/Move Failed:
   You can't save the file "043-19278-100.dmg" because the volume
   "iOS 18.6 Simulator Bundle" is read only.
   … NSPOSIXErrorDomain Code=30 "Read-only file system"
   NSFilePath=/Library/Developer/CoreSimulator/Cryptex/Images/bundle/
              SimRuntimeBundle-BD4BDFE5-…/Restore/043-19278-100.dmg)

Worth noting: that failed add left an 8.2 GB staging file behind in /Library/Developer/CoreSimulator/Images/Inbox/, and I found an identical orphan from an earlier attempt. simctl runtime delete <uuid> cleaned up the registry entry and the copied bundle dmg, but not the Inbox file — that needed a manual sudo rm (with FDA).

My working hypothesis (assisted by Claude, so I'd appreciate a sanity check)

The runtime is an orphan of the storage-format change. Xcode ≤16 delivered runtimes as MobileAssets under AssetsV2, mounted as cryptex bundles; Xcode 26 manages them through the secure storage area registry at /Library/Developer/CoreSimulator/Images/images.plist. My 18.6 asset was never migrated into that registry, producing a split brain: the Components pane and simctl runtime delete read only the registry and see nothing, while simctl list runtimes reports the runtime because CoreSimulator separately scans and auto-mounts legacy assets at boot. Present enough to be listed, absent enough to be unmanageable.

If that's right, only a process entitled to drive mobileassetd can remove the asset — which would mean the Components pane of an Xcode version that still understands the legacy format. I have not tested this: would installing Xcode 16.x alongside 26.6 surface iOS 18.6 in its Platforms pane with a working Delete?

Questions

  1. Is this split state (listed by simctl, absent from images.plist) expected after upgrading from Xcode 16 to Xcode 26, or is it a migration bug worth a report?
  2. What is the supported way to delete a legacy MobileAsset runtime that never made it into the registry — without disabling SIP?
  3. Should simctl runtime add be able to adopt a bundle-format asset dmg, or is that input simply unsupported? The read-only copy target looks like it can never succeed.
  4. Is the leftover .cxbd in Images/Inbox/ after a failed add expected, or should simctl clean up its own staging file?
  5. Will mobileassetd eventually garbage-collect this asset? Its Info.plist shows no supersede or purge markers.

For context, this is 8.5 GB I'd like back, but I'm more interested in the correct procedure than the space — I'd rather not disable SIP on a work machine.

Thanks!

Xcode Bug Installed Platforms
 
 
Q