XcodeのSwiftUI PreviewやSimulator実行時に「Timeout waiting for connection to DTServiceHub」や「Timed out waiting for connection to DTServiceHub after 15.0 seconds」と表示される場合、XcodeとSimulator側のサービス接続が正常に確立できていない可能性があります。コード自体のコンパイルに成功していても、Previewの起動段階で止まることがあります。この記事では、主な原因、確認手順、複数の解決方法を順番に解説します。
エラーの意味
TimeoutError: Timed out waiting for connection to DTServiceHub after 15.0 seconds
DTServiceHubは、XcodeがSimulatorやPreview関連サービスと通信する際に関係する開発支援プロセスの一部です。この接続が一定時間内に確立できないと、PreviewやSimulator起動がタイムアウトします。
主な原因
- Simulatorが不完全な状態で残っている
- SwiftUI PreviewのCanvasが固まっている
- Xcode更新後にSimulator Runtimeやキャッシュの状態が崩れている
- DerivedDataやPreview関連キャッシュに不整合がある
- 特定のSimulator端末だけが異常状態になっている
- メモリ不足やCPU負荷が高く、Preview起動がタイムアウトしている
- Swift Packageや依存ライブラリの解決に時間がかかっている
代表的な発生状況
特に、macOSやXcodeを更新した直後、Simulatorを強制終了した後、Previewを長時間使い続けた後などに発生しやすい傾向があります。通常のBuildは成功するのにCanvasだけ表示されないケースもあります。
確認手順
- 通常のBuild(Command + B)が成功するか確認します。
- 実機またはSimulatorでRunできるか確認します。
- 別のSimulator端末へ切り替えてPreviewが表示されるか確認します。
- XcodeのPreview Diagnosticsに別のエラーが出ていないか確認します。
- Activity MonitorでメモリやCPUが極端に逼迫していないか確認します。
解決方法1:Canvasを停止して再開する
まずはPreviewを再起動します。Canvas上のResumeまたは再読み込み操作を行い、それでも改善しない場合はCanvasを一度閉じてから再表示します。
Previewだけが固まっている場合、アプリ本体のコードを変更しなくてもCanvasの再起動だけで復旧することがあります。
解決方法2:別のSimulatorへ切り替える
特定のSimulator端末だけが壊れた状態になっている場合があります。Previewの対象を別のiPhoneモデルへ変更し、表示できるか確認してください。
別端末で正常に表示された後、元の端末へ戻すと復旧することもあります。
解決方法3:Simulatorを完全終了して再起動する
Simulatorを閉じた後、Xcodeも終了してから再起動します。必要に応じてMacも再起動してください。
xcrun simctl shutdown all
上記コマンドで起動中のSimulatorをまとめて終了できます。
解決方法4:Simulatorの状態をリセットする
Simulatorの内部状態が破損している場合は、対象SimulatorをEraseして初期化します。
xcrun simctl list devices
xcrun simctl erase all
xcrun simctl erase allを実行するとSimulator内のアプリやデータが削除されます。必要なデータがある場合は先に確認してください。
解決方法5:DerivedDataを削除する
ビルドキャッシュの不整合が疑われる場合はDerivedDataを削除します。
rm -rf ~/Library/Developer/Xcode/DerivedData/*
その後Xcodeを再起動し、再度BuildしてからPreviewを開きます。
解決方法6:Swift Packageのキャッシュを見直す
Swift Package Managerの依存解決でPreviewが止まっている場合は、XcodeのFileメニューからPackages関連のキャッシュリセットや依存関係の再解決を行います。
rm -rf ~/Library/Caches/org.swift.swiftpm
rm -rf ~/Library/org.swift.swiftpm
プロジェクトによっては再ダウンロードに時間がかかるため、ネットワークが安定している状態で行ってください。
解決方法7:Previewの自動更新を一時的に無効にする
大規模プロジェクトでは、編集のたびにPreviewが自動更新されることで負荷が高くなる場合があります。Canvasの自動更新を一時的に無効にし、必要なタイミングだけ手動更新すると改善することがあります。
解決方法8:XcodeとSimulator Runtimeを更新する
Xcode本体とSimulator Runtimeの組み合わせが不安定な場合は、Xcodeの最新安定版と対応するRuntimeを利用してください。Xcode更新後に古いRuntimeが残っている場合は、新しいRuntimeで再確認します。
解決方法9:新しいSimulatorを作成する
既存Simulatorを修復できない場合は、XcodeのDevices and Simulatorsから新しいSimulator端末を作成します。新規端末でPreviewが動くなら、元のSimulator側の状態異常である可能性が高いです。
解決方法10:最小構成のPreviewで切り分ける
Preview対象Viewが重い場合は、まず最小構成にして確認します。
import SwiftUI
struct TestView: View {
var body: some View {
Text("Hello, world!")
}
}
#Preview {
TestView()
}
この最小構成でも同じDTServiceHubタイムアウトが出る場合は、View実装よりXcode・Simulator環境側の問題を疑いやすくなります。
注意点
DerivedData削除やSimulator初期化は環境を大きくリセットします。まずはCanvas再起動、別Simulatorへの切り替え、Xcode再起動など影響の小さい方法から試すのがおすすめです。
また、DTServiceHubのタイムアウトはアプリのソースコードに直接原因がないことも多いため、BuildエラーとPreview環境エラーを分けて考えることが重要です。
まとめ
「Timeout waiting for connection to DTServiceHub」は、Xcode PreviewまたはSimulatorとの接続が一定時間内に確立できないときに発生するエラーです。まずCanvasとSimulatorを再起動し、次に別のSimulator、DerivedData削除、Simulator初期化、Swift Packageキャッシュ確認の順で切り分けると効率的です。通常のBuildが成功するのにPreviewだけ失敗する場合は、Xcode・Simulator環境側の問題を優先して確認してください。
