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
- 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? - What is the supported way to delete a legacy MobileAsset runtime that never made it into the registry — without disabling SIP?
- 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. - Is the leftover
.cxbd in Images/Inbox/ after a failed add expected, or should simctl clean up its own staging file? - 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!