在 iOS 12 安裝 Xcode 11 開發的 App
當我們用 Xcode 11 建立新專案,開發 iOS App 時,預設它只能安裝到 iOS 13 以上的 iPhone。不過我們只要點選專案檔,在 project 的 Info 頁面調整 iOS Deployment Target,即可讓它支援舊版的 iOS。
可惜問題沒那麼簡單,改成 12.4 後,原本好好的程式馬上多出一堆錯誤。
會產生那麼多的紅色錯誤是因為 Xcode 11 建立的專案裡有很多舊版 iOS 不支援的程式,所以我們要在 iOS 13 才支援的 function 或 class 前加入以下程式,如此舊版的 iOS 才不會因為這些它看不懂的 iOS 13 程式產生錯誤。
@available(iOS 13.0, *)
接下來讓我們一步步修正錯誤吧。
- 修正 SceneDelegate.swift 的錯誤。
點選錯誤旁的紅色圈圈。
點選 Add @available attribute to enclosing class 的 Fix。
此時 class 前會自動補上 @available(iOS 13.0, *),表示此 class 只會在 iOS 13 以上的版本用到。
@available(iOS 13.0, *)class SceneDelegate: UIResponder, UIWindowSceneDelegate {
這時候錯誤還不會馬上消失,請按 cmd + b 讓程式重新編譯,如此錯誤才會消失。
- 修正 AppDelegate.swift 的錯誤。
跟剛剛類似,只是 class AppDelegate 我們還會用到,因此修正錯誤時請點選 Add @available attribute to enclosing instance method 的 Fix。
此時 function 前會自動補上 @available(iOS 13.0, *),表示此 function 只會在 iOS 13 以上的版本用到。
@available(iOS 13.0, *)func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration
AppDelegate.swift 裡有 2 個 function 要修正錯誤,以下 function 也要加上 @available(iOS 13.0, *)。
@available(iOS 13.0, *)func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>)
- 在 SwiftUI 的程式加上 @available(iOS 13.0.0, *)。
如果有用到 SwiftUI,由於它也是 iOS 13 支援的新功能,因此請參考以下例子,在它的 struct 定義前加上 @available(iOS 13.0.0, *)。
@available(iOS 13.0.0, *)struct ContentView : View { var body: some View { Text("Hello World") }}#if DEBUG@available(iOS 13.0.0, *)struct ContentView_Previews : PreviewProvider { static var previews: some View { ContentView() }}#endif
黑色畫面問題
修正完紅色錯誤後,現在我們已經可以順利將 App 啟動到 iPhone 上。不過令人遺憾的,還是有問題,我們辛苦了那麼久,最後在 iPhone 上卻看到一片黑的 App 畫面。
此時 Xcode 右下角的 Console 顯示著錯誤訊息。
The app delegate must implement the window property if it wants to use a main storyboard file
為什麼會有問題呢 ? 原因在 Xcode 11 class AppDelegate 裡沒有宣告 property window,它改成在 class SceneDelegate 裡宣告。而 iOS 13 之前的系統是無法使用 SceneDelegate 的,所以為了相容舊版,請在 AppDelegate.swift 裡宣告 property window。
var window: UIWindow?
只要加入這行程式碼,即可順利修正黑畫面的問題。