Xcode 在 iOS 13 以下手機 build 出現黑畫面
目錄
⦿ 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 專案後就回到正常狀態了,很棒吧!