web-dev-qa-db-fra.com

Compatibilité descendante de Xcode 11: "UIWindowScene est uniquement disponible dans iOS 13 ou plus récent"

Dans Xcode 11, j'ai créé un nouveau projet d'application à partir du modèle d'application Single View. Je veux que cette application s'exécute dans iOS 12 ainsi que iOS 13. Mais lorsque je bascule la cible de déploiement sur iOS 12, j'ai reçu beaucoup de messages d'erreur comme celui-ci:

UIWindowScene est uniquement disponible dans iOS 13 ou plus récent

Que devrais-je faire?

36
matt

Le modèle dans Xcode 11 utilise un délégué de scène. Les délégués de scène et les classes associées sont nouveaux dans iOS 13; ils n'existent pas dans iOS 12 et avant, et le processus de lancement est différent.

Pour rendre un projet généré à partir d'un modèle d'application Xcode 11 rétrocompatible, vous devez marquer la classe SceneDelegate entière et toutes les méthodes de la classe AppDelegate qui se réfèrent à UISceneSession, comme @available(iOS 13.0, *).

Vous devez également déclarer une propriété window dans la classe AppDelegate (si vous ne le faites pas, l'application s'exécutera et se lancera mais l'écran sera noir):

var window : UIWindow?

Le résultat est que lorsque cette application s'exécute dans iOS 13, le délégué de scène a le window, mais lorsqu'il s'exécute dans iOS 12 ou avant, le délégué de l'application a le window - et votre autre code peut alors avoir besoin de prendre en compte que pour être rétrocompatible.

67
matt

Pourriez-vous s'il vous plaît ajouter ce code de ligne comme suit

ÉTAPE1: -

@ disponible sur SceneDelegate.Swift

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

//...

}

ÉTAPE2: ​​-

@ disponible sur certaines méthodes dans AppDelegate.Swift

// 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.
    // Use this method to select a configuration to create the new scene with.
    return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}

@available(iOS 13.0, *)
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
    // Called when the user discards a scene session.
    // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
    // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}

ÉTAPE3: -

Vous devez déclarer la propriété window dans le fichier AppDelegate.Swift comme var window: UIWindow?

class AppDelegate: UIResponder, UIApplicationDelegate {

     var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }
9
IKKA