Xcode 27 では iOS 17 が実機デバッグ・シミュレータ実行の下限になってしまいましたが、とはいえ様々な事情によって iOS 15 や iOS 16 のシミュレータを使いたい時もあるかと思います。
私が開発しているアプリも iOS 16.4 が下限なので iOS 16.4 のシミュレータを動かしたく、いろいろやったところとりあえず動きはしたので誰かのために残しておきます。
(オチが付いているので実際に試す前に一度最後まで読むことをおすすめします)
旧 Simulator アプリを Xcode 26 から持ってくる
Xcode 27 から Simulator.app がディスコンになり新しい Device Hub.app になりましたが、これは iOS 17 以降のシミュレータしか表示してくれないので、古い Simulator.app をどうにかして使う必要があります。
Xcode 26 を丸ごと持っておける方は Xcode 26 内の Simulator.app を使えば動くかもしれませんが (未検証)、ストレージに余裕がないので Simulator.app を Xcode 27 に無理矢理移植する方法を取ります。
といっても簡単で、Xcode 26 内の Xcode.app/Contents/Developer/Applications と Xcode.app/Contents/Library/Developer/Library/PrivateFrameworks を Xcode 27 内の同じ箇所にコピペすれば完了です。
ついでですが、Simulator.app を起動した時に最後に使ったシミュレータを自動起動する設定を切っておくとよいでしょう。
defaults write com.apple.iphonesimulator StartLastDeviceOnLaunch -bool NO
ここで一度 Simulator.app を起動して、動作するか確認しておくとよいでしょう。PrivateFrameworks のコピーがうまくできていないと起動直後にクラッシュします。
CoreSimulator のバージョン下限を無視させる
CoreSimulator 側で macOS 27 では iOS 17 以降しか起動できないような制限がかかっていますが、これも defaults で回避できます。
defaults write com.apple.CoreSimulator RuntimeEnforceHostVersionRequirements -bool NO
これを実行した後 Simulator.app を一旦終了して再起動すれば、Simulator.app のデバイス一覧に iOS 15 / 16 のデバイスが表示されるようになっているはずです (ターミナルから xcrun simctl create でシミュレータを作成する必要があるかもしれません)。
無効化されているのにはワケがある
ここまでの手順を踏めば恐らく SpringBoard を拝んだり Xcode からアプリをデバッグ実行したりはできるようになると思います。
なーんだ動くじゃん、Apple め余計な手間をかけさせやがって……と思ったのですが、デカい問題として、JavaScriptCore が EXC_BAD_ACCESS (SIGBUS) / KERN_PROTECTION_FAILURE でめちゃくちゃクラッシュすることがわかりました。私のアプリは SafariServices 経由でしか WebKit/JavaScriptCore を使っていないので JavaScriptCore を直接使っているアプリがどうかはわかりませんが、少なくとも WebKit はとにかくクラッシュします。
Safari の場合、設定で JavaScript を無効化すると開けるサイトが増えますが、今時 JavaScript なしで閲覧できるページはそんなに多くないですし (わざわざ Simulator で開きたいようなページと考えると尚更)、JavaScript を切ったとしても開けないサイトは一定数あるようです (apple.com や github.com など)。
うちのアプリではログイン部分で ASWebAuthenticationSession を呼ぶも中身が出ない、というような落ち方をしたので、シミュレータ用に #if targetEnvironment(simulator) で開くはずのURLをコピーするボタンを追加して乗り切りました。