PC パソコン

Xcode Preview『Timeout waiting for connection to DTServiceHub』の解決方法

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だけ表示されないケースもあります。

確認手順

  1. 通常のBuild(Command + B)が成功するか確認します。
  2. 実機またはSimulatorでRunできるか確認します。
  3. 別のSimulator端末へ切り替えてPreviewが表示されるか確認します。
  4. XcodeのPreview Diagnosticsに別のエラーが出ていないか確認します。
  5. 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環境側の問題を優先して確認してください。