Home iOS TemporaryWorkaround for Black Launch Screen Bug After Several Launches
Post
Cancel

iOS TemporaryWorkaround for Black Launch Screen Bug After Several Launches

[iOS] TemporaryWorkaround for Black Launch Screen Bug After Several Launches

暫時 Workaround 解決 XCode Build & Run App 卡黑屏問題

Photo by [Etienne Girardet](https://unsplash.com/@etiennegirardet?utm_content=creditCopyText&utm_medium=referral&utm_source=unsplash){:target="_blank"}

Photo by Etienne Girardet

問題

不知道是 XCode 幾開始 (應該是 14?) 有些專案在 Build & Run 到模擬器多次之後會出現卡死在黑屏的問題,狀態卡在 Launching Application… 就沒有反映了;重新 Build & Run 也沒用,需要手動砍掉整個模擬器讓他重啟才能修復。

XCode 14.1: Stuck at “Launching Ap. . . | Apple Developer Forums Hello team, On Xcode 14.1, After building the project and when the simulator launches, it shows blank black screen… forums.developer.apple.com

新專案、新的專案設定比較少遇到這問題;舊的專案比較常踩到,但舊專案礙於歷史悠久、設定複雜,查網路資料也查不到確定的 Root Caused,多半推測是 XCode Bug (or M1?);但是這個問題實在太煩了,時常 Build & Run 要看成果,結果一片黑暗,要整個重來過,每次大概要浪費個 1–2 分鐘,很中斷開發。

Workaround

這邊提供一個山不轉路轉的 Workaround,思路是既然避不開黑屏問題,並且黑屏不會出現在模擬器第一次啟動的 Build & Run,所以我們只要確保每次 Build & Run 都是全新重開過的模擬器即可。

首先我們要取得你想要執行的模擬器的 Device UUID

在 Terminal 執行:

1
xcrun simctl list devices

  • 找到你想用的模擬器裝置及它的 Device UUID
  • 這邊以我的 iPhone 15 Pro (iOS 17.5) 為例 Device UUID = 08C43D34–9BF0–42CF-B1B9–1E92838413CC

再來我們新增一個 auto-reboot.sh Shell Script 檔案

  • cd /你想放此 Script 的目錄/
  • vi auto-reboot.sh

貼上以下 Scirpt:

  • [Device UUID] 替代成你想用的模擬器 Device UUID
  • 記得如果模擬器有更換要改這個腳本的 Device UUID,否則就無效了
1
2
3
4
5
6
7
8
9
10
#!/bin/bash

## Use the command below to find the Device UUID of the simulator you want to use:
## xcrun simctl list devices

# shutdown simulator
xcrun simctl shutdown [Device UUID]

# reboot simulator
xcrun simctl boot [Device UUID]
  • 腳本邏輯簡單粗暴,就是 關掉&重啟 你想用的模擬器
  • ESC & :wq!

調整 auto-reboot.sh 執行權限:

1
chmod +x auto-reboot.sh

回 XCode 設定

因為每個人習慣用的模擬器不同,因此我是設定在 XCode Behaviors,不會更動到專案的設定,也不會上到 git 影響團隊其他夥伴;但如果要簡單、全團隊同步也可以直接設定在 Scheme -> Build -> Pre-actions -> sh /你想放此 Script 的目錄/auto-reboot.sh

XCode Behaviors

  • XCode -> Behaviors -> Edit Behaviors…

  • 找到 Running 區塊
  • 選擇 Completes 選項 Completes 時機 = Stop or Rebuild
  • 右邊勾選 Run

  • 選擇 Choose Script… 選擇剛剛新建的 auto-reboot.sh 檔案位置
  • 完成

原理與結語

Demo 是乾淨專案所以 Build 時間很短

Demo 是乾淨專案所以 Build 時間很短

我們運用 XCode Behaviors 在 Completes (Stop or Rebuild) 的時機點重開模擬器,時間在開始 Build 之前,幾乎都能在 Build -> Run 結束前完成重啟。

如果狂按重開的確也有機會重啟太慢,導致 Run 找不到目標而出現另一種黑屏,不過這情況就不考慮了,至少這方案能在日常正常使用保持 Build & Run App 正常執行。

對速度的影響我覺得還好,因為 Build & Run 本身也需要些時間,這些時間很夠模擬器重開了。

有任何問題及指教歡迎 與我聯絡

===

View the English version of this article here.

本文首次發表於 Medium ➡️ 前往查看



This post is licensed under CC BY 4.0 by the author.

iOS 捷徑自動化應用場景 — 自動轉發簡訊與自動建立提醒待辦事項

遊記 2024 泰國曼谷 Bangkok 🇹🇭 5 日自由行