[iOS] 複数回起動後の黒い起動画面バグの一時的対処法
XCode Build & Run アプリの黒画面問題の一時的な回避策

Photo by Etienne Girardet
問題
XCode のどのバージョンからかは不明ですが(おそらく14以降)、一部のプロジェクトでシミュレーターに対して何度も Build & Run を行うと、黒画面で「Launching Application…」から進まなくなる問題が発生します。再度 Build & Run をしても改善せず、シミュレーターを手動で完全に終了して再起動しないと直りません。
新しいプロジェクトや新しいプロジェクト設定ではこの問題はあまり発生しません。古いプロジェクトでよく起きますが、歴史が長く設定も複雑なため、ネットで確実な原因は見つかりません。多くは XCode のバグ(または M1 チップの影響)と推測されています。しかし、この問題は非常に厄介で、ビルド&ランして成果を確認しようとすると真っ暗な画面になり、最初からやり直さなければならず、毎回1〜2分ほど無駄になり、開発が大きく中断されます。
回避策
こちらは回避策のご提案です。問題の黒画面は避けられず、かつ黒画面はシミュレーターの初回起動時の Build & Run では発生しないため、毎回 Build & Run 時にシミュレーターを完全に再起動すればよい、という考え方です。
まず、実行したいシミュレーターの Device UUID を取得します。
Terminalで実行:
xcrun simctl list devices

-
使用したいシミュレーターのデバイスとその Device UUID を見つける
-
こちらは私の iPhone 15 Pro (iOS 17.5) の例です
Device UUID =08C43D34–9BF0–42CF-B1B9–1E92838413CC
次に auto-reboot.sh シェルスクリプトファイルを新規作成します
-
cd /あなたがこのスクリプトを置きたいディレクトリ/ -
vi auto-reboot.sh
以下のスクリプトを貼り付けてください:
-
[Device UUID]を使用したいシミュレーターのデバイス UUID に置き換えてください -
エミュレーターを変更した場合は、このスクリプトの Device UUID を必ず変更してください。そうしないと無効になります。
#!/bin/bash
## 使用したいシミュレーターのデバイスUUIDを調べるには、以下のコマンドを使います:
## xcrun simctl list devices
# シミュレーターをシャットダウン
xcrun simctl shutdown [Device UUID]
# シミュレーターを再起動
xcrun simctl boot [Device UUID]
-
スクリプトのロジックはシンプルで単純で、使用したいシミュレーターを終了して再起動するだけです。
-
ESCと:wq!

auto-reboot.sh の実行権限を変更:
chmod +x auto-reboot.sh

XCode 設定に戻る
それぞれの人が使うシミュレーターが異なるため、私は XCode Behaviors に設定しています。これによりプロジェクトの設定を変更せず、git にも影響を与えずチームの他のメンバーに影響しません。ただし、簡単にチーム全体で同期したい場合は、Scheme -> Build -> Pre-actions に sh /あなたがこのスクリプトを置きたいディレクトリ/auto-reboot.sh を直接設定することも可能です。
XCodeのビヘイビア

- XCode -> Behaviors -> Behaviorsを編集…

-
Runningセクションを見つける -
Completesオプションを選択
Completes のタイミング = Stop または Rebuild -
右側の「Run」にチェックを入れる

-
Choose Script…を選択し、先ほど作成したauto-reboot.shファイルの場所を指定してください -
完了
原理と結論

Demo はクリーンなプロジェクトなので、ビルド時間が非常に短いです。
私たちは XCode Behaviors を利用して、Completes (Stop or Rebuild) のタイミングでシミュレーターを再起動しています。再起動はビルド開始前に行われ、ほとんどの場合、Build → Run が終わる前に再起動が完了します。
再起動ボタンを連打すると、再起動が遅すぎて Run がターゲットを見つけられず、別の黒画面が発生する可能性もありますが、その場合は考慮しません。少なくともこの方法で日常的な使用では Build & Run が正常に動作します。
速度への影響はあまり気になりません。Build & Run 自体に時間がかかるため、その間にシミュレーターを再起動する十分な時間があります。
Post は ZMediumToMarkdown によって Medium から変換されました。



コメント