82 votes

Rétrocompatibilité de Xcode 11 : "UIWindowScene est seulement disponible dans iOS 13 ou plus récent"

Dans Xcode 11, j'ai créé un nouveau projet d'application à partir du modèle Single View App. Je veux que cette application fonctionne aussi bien sous iOS 12 que sous iOS 13. Mais lorsque je change la cible de déploiement pour iOS 12, j'obtiens de nombreux messages d'erreur comme celui-ci :

UIWindowScene n'est disponible qu'à partir de la version 13 d'iOS.

Que dois-je faire ?

6 votes

Pour tous ceux qui recherchent un modèle Xcode "Single View App" mis à jour et compatible avec iOS 12 et 13, ainsi qu'avec un storyboard ou une interface utilisateur entièrement codée, voir github.com/rmaddy/XcodeTemplates .

108voto

matt Points 60113

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 qu'un projet généré à partir d'un modèle d'application Xcode 11 soit rétrocompatible, vous devez marquer l'ensemble de la classe SceneDelegate, ainsi que toutes les méthodes de la classe AppDelegate qui font référence à UISceneSession, en tant que @available(iOS 13.0, *) .

Vous devez également déclarer un window dans la classe AppDelegate (si vous ne le faites pas, l'application sera exécutée et lancée mais l'écran sera noir) :

var window : UIWindow?

Le résultat est que lorsque cette application s'exécute sous iOS 13, le délégué de scène a l'attribut window mais lorsqu'il est exécuté sous iOS 12 ou avant, le délégué de l'application a l'attribut window - et votre autre code devra alors prendre en compte les éléments suivants que afin d'être rétrocompatible.

62voto

user Points 281

Pourriez-vous ajouter ce code de ligne comme le suivant

STEP1:-

Disponible dans le SceneDelegate.swift.

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

//...

}

ÉTAPE2:-

Disponibilité de 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.
}

ETAPE3:-

Vous devez déclarer fenêtre 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
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X