Xcode 在 iOS 13 以下手機 build 出現黑畫面

春麗 S.T.E.M.
4 min readDec 7, 2022

--

目錄

⦿ AppDelegate、SceneDelegate
⦿ 黑畫面、var window: UIWindow?

AppDelegate、SceneDelegate

在 Xcode 11 開始,我們可以看到新建專案裡頭除了原先的 AppDelegate 這個 class,還多了一個 SceneDelegate,這兩個 .swift 的檔案,SceneDelegate 把原先 AppDelegate 在做的部份事情( Scene )攬過來做。

但即便你把下面這兩項都改成 iOS 12 以上。

結果 build 後會出現如下:

跳出無敵多的錯誤,我們看到跟 UIScene 有關的 function,都不適用 iOS 13 以下,在 AppDelegate 裡有兩個,在 SceneDelegate 共有六個(全不能用),於是,我們可以在每條 function 上方加上下面的程式碼:

@available(iOS 13.0, *)

看起來表示 iOS 13.0 以上,下方的 function 才會調用

這條程式碼也可以直接在 class( 即 AppDelegate、SceneDelegate )上方加上,這樣就不用將程式碼灑得到處都是,如下:

@available(iOS 13.0, *)
@main
class AppDelegate: UIResponder, UIApplicationDelegate {

}

@available(iOS 13.0, *)
class SceneDelegate: UIResponder, UIWindowSceneDelegate {

}

這也表示,需要在 iOS 13.0 以上的環境調用的 function 才會調用。注意!兩者解釋有些微差別,因為無論如何,在 AppDelegate 中的這個 function:

func application(_ application: UIApplication, 
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

return true
}

總是會被調用,不過加上 @available(iOS 13.0, *),不代表 iOS 12 就不會調用它,所以我們應該解釋為「需要在 iOS 13.0 以上的環境調用的 function 才會調用」。

黑畫面、var window: UIWindows?

然而停掉 iOS 13.0 以下的錯誤後,你 build 專案後竟然呈現黑畫面,所以我們必須回到 AppDelegate 中,在前述的 function 前面加上一個 property,如下:

    var window: UIWindow?

你曾經在哪裡看過這個 property?對的,在 SceneDelegate 裡就有這個 property,然而,前面說過,SceneDelegate 把 AppDelegate 中關於 Scene 的事情拿去做,可是 iOS 13 以下的專案並沒有 SceneDelegate。

所以 AppDelegate 繼續做苦工,只要在這個 class 裡面加上程式碼,build 專案後就回到正常狀態了,很棒吧!

--

--

春麗 S.T.E.M.
春麗 S.T.E.M.

Written by 春麗 S.T.E.M.

Do not go gentle into that good night, Old age should burn and rave at close of day; Rage, rage, against the dying of the light.

No responses yet