If you create a new app in Xcode 11 and try to run it on an iOS 12 device or lower, you volition get a bunch of errors :

errors

Discover that most of these errors are related to the UIScene class and the SceneDelegate.swift file, these are related to the multi-window feature introduced in iOS 13, which allows multiple windows of an app to be opened in iPad. Every bit iOS 12 and before don't take these feature, nosotros will go these fault messages when trying to compile.

We will attempt to resolve these errors footstep by pace in this article.

You can salve the hassle by setting deployment target to iOS thirteen and above, and ditch back up for iOS 12 and below 😈. Merely keep in heed that one-half of the iOS devices in circulation are not using iOS thirteen equally of mid October 2019, co-ordinate to Apple tree's report :

iOS Percentage

If you are dropping back up for iOS 12 and beneath, you are denying half of the iOS users to use your app! 😱

Update deployment target

If y'all haven't already, change the deployment target to the lowest iOS version you lot want to support, select the projection name then select your app target, cull Full general and modify the version in Deployment Info.

change deployment target

@available out the SceneDelegate.swift

As the SceneDelegate class is but available on iOS 13 and above, we have to tell the compiler to simply include the class for iOS 13 and above. To practise this, we volition add this line "@bachelor(iOS 13.0, *)" correct above the  SceneDelegate form declaration like this :

          import UIKit  @available(iOS xiii.0, *) grade SceneDelegate: UIResponder, UIWindowSceneDelegate { //... }                  

@available out some methods in AppDelegate.swift

Next, in that location are two new methods added in AppDelegate.swift, which only supports iOS 13 and above. We will add the same @available(iOS 13.0, *) on peak of them as well :

          // AppDelegate.swift  @available(iOS 13.0, *) func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {     // Called when a new scene session is being created.     // Utilise this method to select a configuration to create the new scene with.     return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.part) }  @available(iOS 13.0, *) func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Gear up<UISceneSession>) {     // Called when the user discards a scene session.     // If whatsoever sessions were discarded while the application was non running, this will exist chosen presently after awarding:didFinishLaunchingWithOptions.     // Use this method to release any resources that were specific to the discarded scenes, as they will not render. }                  

Add back the window to AppDelegate

If you lot build and run your app now, you will go a dark black screen 😱, because there'southward no UIWindow initialized.

In iOS 12 and older, there's e'er a var window: UIWindow? variable located at the top of AppDelegate.swft. iOS 13 has moved this variable to SceneDelegate.swift, and now nosotros are going to add together dorsum this variable to AppDelegate.

          import UIKit  @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate {           var window: UIWindow?        // ... }                  

Now Build and run your app on an iOS 12 devices, and it works! 🥳

I guess Apple tree really wants iOS developers to adopt and focus on iOS 13, to the extent that they don't listen breaking back up for iOS 12 and older with default settings in Xcode.

If you are lazy to do these step manually every time, y'all can also download Xcode 10.3 in the Apple tree's developer download portal (require sign in with your Apple ID), create a new Xcode projection using it, and then edit it using Xcode 11.