[iOS] 複数回起動後のブラック起動画面バグに対する一時的な対処法
XCode Build & Run アプリの黒画面問題を一時的に回避する方法

Photo by Etienne Girardet
問題
XCodeのどのバージョンからかは不明ですが(おそらく14以降)、一部のプロジェクトでシミュレーターに対して複数回Build & Runを行うと、黒画面で「Launching Application…」のままフリーズする問題が発生します。再度Build & Runしても改善せず、手動でシミュレーターを完全に終了して再起動する必要があります。
新しいプロジェクトや新しいプロジェクト設定ではこの問題にあまり遭遇しません。古いプロジェクトでよく発生しますが、歴史が長く設定も複雑なため、ネットで確実な原因を見つけることはできません。多くは XCode のバグ(または M1 の問題)と推測されています。しかし、この問題は非常に厄介で、成果を確認するために Build & Run しても画面が真っ暗になり、最初からやり直さなければならず、毎回1〜2分ほど無駄になり、開発の妨げになります。
回避策
ここでは、山を動かせないなら道を変えるというワークアラウンドを紹介します。問題の黒画面は避けられず、また黒画面はシミュレーターの初回起動時の Build & Run では発生しないため、毎回 Build & Run の前にシミュレーターを完全に再起動すれば問題を回避できます。
まず、実行したいシミュレーターの Device UUID を取得します
ターミナルで実行:
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]を使用したいシミュレーターの Device 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 -> Edit Behaviors…
XCode -> Behaviors -> 動作を編集…

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

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

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



コメント