在 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?

只要加入這行程式碼,即可順利修正黑畫面的問題。

--

--

彼得潘的 iOS App Neverland
彼得潘的 Swift iOS App 開發問題解答集

彼得潘的iOS App程式設計入門,文組生的iOS App程式設計入門講師,彼得潘的 Swift 程式設計入門,App程式設計入門作者,http://apppeterpan.strikingly.com