Xcode 11 - Désactiver UISceneDelegate / SwiftUI sur iOS 13

111

J'utilise actuellement Xcode 11 Beta 5. Dans mon application, il fonctionne bien sur iOS 12 et moins. Cependant, sur iOS 13, il semble qu'il utilise UIScene par défaut. Cela fait que mon application ne fait rien.

Lorsque l'application se lance lors d'une nouvelle installation, l'utilisateur doit accepter des conditions générales. Après avoir accepté, ils accèdent à un écran de chargement qui les dirige ensuite vers la vue principale. Dans la capture d'écran que j'ai postée, la vue derrière l'actuelle au premier plan est l'écran de chargement de démarrage.

Nous examinerons bientôt l'ajout de la prise en charge de plusieurs vues dans toute l'application, mais pour le moment, nous avons des éléments de priorité plus élevée sur lesquels nous devons travailler.

https://imgur.com/i0qLhAL

"Prise en charge de plusieurs fenêtres" est déjà désactivé dans les paramètres généraux de la cible de l'application. Aussi, j'ai défini Activer plusieurs Windows sur NON dans le fichier info.plist.

Jusqu'à présent, rien n'a vraiment fonctionné. Fondamentalement, je souhaite désactiver / désactiver plusieurs fenêtres et UIScene / SwiftUI pour restaurer le comportement d'origine dans iOS 10-12. Est-ce possible dans iOS 13 ou devons-nous le mettre à jour?

Mettre à jour:

Voici une capture d'écran de la hiérarchie de débogage de la vue. Le côté gauche est iOS 12, le côté droit est sur iOS 13. Sans rien ajouter à Info.plist ni à aucune classe ou méthode de délégué de scène, pourquoi est-ce différent? Il l'a pratiquement exécuté dans son code existant prêt pour la production sur Xcode 11.

https://imgur.com/C3aLsDo

DavidA
la source
Avez-vous besoin de prendre en charge uniquement iOS 13 et versions ultérieures ou devez-vous prendre en charge iOS 13 et iOS 12?
rmaddy
Prise en charge de @rmaddy entre iOS 11-13 + (versions futures).
DavidA
Votre interface utilisateur principale est-elle via le code ou le storyboard?
rmaddy
@rmaddy c'est fait dans les storyboards a une suite à ses ViewControllers xib référencés.
DavidA
Sans détails spécifiques sur ce que fait votre application et quand, c'est difficile à dire. Notez que les méthodes de contrôleur de vue telles que viewWill|DidAppearne sont pas appelées de la même manière dans iOS 13 lors du rejet des contrôleurs de vue présentés, par exemple. Ajoutez beaucoup de messages de débogage du cycle de vie et de points d'arrêt et comparez le flux entre iOS 12 et 13 et voyez où il est différent.
rmaddy

Réponses:

311

Bien que vous devriez adopter l'utilisation de scènes lorsque votre application est exécutée sous iOS 13 et versions ultérieures, vous pouvez vous désabonner totalement tout en prenant en charge iOS 12 ou version antérieure.

  • Supprimez complètement l'entrée «Application Scene Manifest» d'Info.plist.

  • S'il existe une classe de délégué de scène, supprimez-la.

  • S'il existe des méthodes liées à la scène dans votre délégué d'application, supprimez ces méthodes.

  • S'il manque, ajoutez la propriété var window: UIWindow?à votre délégué d'application.

Votre application doit désormais utiliser uniquement le délégué d'application et sous iOS 13, elle doit avoir le même cycle de vie que iOS 12.

Remarque: rien de tout cela n'est spécifique à Swift ou SwiftUI.

rmaddy
la source
Nous avons affiché des réponses en même temps. :-) Une question - cette ligne manquante dans AppDelegatelaquelle j'ai abordé. Cela revient-il automatiquement dans le processus que vous avez décrit? (J'aime mieux votre réponse, car elle ne tient absolument pas compte des scènes.)
dfd
1
La même chose se passe pour moi et je n'ai aucune entrée manifeste dans mon Info.plist ni aucune méthode AppDelegate et aucune classe SceneDelegate. Je suis en train de définir mon contrôleur comme "termes et conditions" pour David en tant que rootViewController et il apparaît comme indiqué ici dans la question ci-dessus. S'il vous plaît, aidez-moi car je suis coincé avec ce problème d'interface utilisateur et je ne peux pas avancer ... ugh!
Mohsin Khubaib Ahmed
1
@MohsinKhubaibAhmed Vous posez des questions sur un problème complètement différent. Voir stackoverflow.com/questions/56435510/…
rmaddy
1
Salut! J'ai suivi les instructions en 3 étapes mais j'ai obtenu un écran noir après l'apparition de l'écran de lancement. Le Storyboard principal est sélectionné ainsi que le contrôleur de vue initial. Avez-vous des suggestions?
user3191334
1
@ user3191334 J'ai aussi l'écran noir. Dans mon cas, c'était le mode sombre qui me donnait un fond noir par défaut. Ajoutez du contenu à votre storyboard de base et tout apparaîtra.
Gordon Dove
41

J'espère utiliser la réponse pour formater les choses mieux qu'un commentaire. (N'hésitez pas à commenter et je modifierai.)

C'est quelque chose que j'ai également affronté, et il y a quelques scénarios en jeu ici:

  • Si vous souhaitez travailler sur une application existanteUIKit dans Xcode 11, ouvrez-la simplement et cela devrait fonctionner correctement. Toutes mes applications ont, sans SceneDelegate fichier ni aucun changement de AppDelegateou de storyboards.
  • Si vous souhaitez créer une nouvelle UIKITapplication ciblant iOS 13 , créez-la simplement en vous assurant de ne pas cocher la case "Utiliser SwiftUI".

Mais je me demande si vous êtes confronté au troisième scénario - celui que j'ai fait il y a environ une semaine. Création d'une nouvelle application `UIKit ciblant quelque chose d'avant iOS 13 . (J'ai en fait ciblé iOS 9!)

Oui, votre modèle vous donnera 15 erreurs (à partir de la version bêta 5), ​​ainsi qu'un SceneDelegatefichier / une classe. Heureusement, Xcode vous aidera à corriger automatiquement tout sauf un.

La dernière consiste à ajouter une ligne qui fait partie de la SceneDelegateclasse, mais malheureusement Apple l'a laissée en dehors de la AppDelegateclasse - ce qui, après plus d'une douzaine de @available(iOS 13.0, *)clauses, signifie que vous avez choisi de ne SceneDelegatepas exécuter iOS 12 et devinez quoi? Ce n'est pas là dedans ApDelegate!

Ajoutez ceci à votre AppDelegate:

var window: UIWindow?

À ce stade, vous devriez avoir une UIKitapplication en cours d'exécution ciblée pour iOS 12 et les versions antérieures.

dfd
la source
Merci pour cela. Mon scénario est à peu près le premier point que vous avez dit, une application UIKit existante dans Xcode 11. Mais quand je l'ouvre, cela ne fonctionne pas bien. Regardez la mise à jour que j'ai ajoutée de la hiérarchie de débogage de vue.
DavidA
Toujours dans AppDelegate, il a déjà une fenêtre var: UIWindow?
DavidA
Vous m'aviez préoccupé! (Et je suis toujours un peu inquiet.) J'ai très peu mis à jour pour mes applications existantes - la semaine dernière, c'était une frustration avec SwiftUI et j'étais curieux d'essayer une mise en page dans UIKit pour iOS 13 uniquement. Mais mes applications existantes? Ils prennent en charge le multitâche sur iPad mais restent inchangés dans Xcode 11, je n'ai pas SceneDelegateet les tests indiquent (a) qu'ils fonctionnent sous iOS 13 et (b) qu'ils ne prennent pas du tout en charge plusieurs fenêtres, il suffit de diviser la vue entre deux applications. (Je ne supporte pas non plus le glisser-déposer.) Y a-t-il autre chose de votre côté?
dfd
Pour répéter, j'ai simplement ouvert mon application Xcode 10 dans Xcode 11. Non SceneDelegate, non SwiftUI, pas de possibilité de créer plusieurs instances de mes applications iOS 9+. Les performances sont les mêmes que d' CoreImagehabitude - tous sont des filtres personnalisés mis à jour en temps réel - et, eh bien, pour moi? S'il y a des problèmes liés au système d'exploitation liés aux scènes dans la hiérarchie des vues, il est inutile si cela ne prend pas en charge les scènes. (Et pour finir, oui, je suis toujours un peu inquiet. Mais c'est aussi la beta 5.) J'espère que vous avez une bonne sauvegarde qui peut reproduire ce que je vois.
dfd
Merci. Je soupçonne que c'est quelque chose dans le cycle de vie. Je vais passer du temps à déboguer mon application. Je le mettrai à jour chaque fois que je le découvrirai pour aider quelqu'un dans une situation similaire
DavidA
5

J'ai obtenu que cela fonctionne en utilisant la réponse de dfd, mais comme mon application est en Objective-C, j'ai dû faire un changement:

En Objective-C, vous voulez mettre

@property (strong, nonatomic) UIWindow *window;

dans AppDelegate.h (pas dans le .m)

Nik Bhatt
la source
4

D'accord, alors je l'ai compris. En raison des changements dans iOS 13 du nouveau style de présentation de carte par défaut d'Apple, dans mon storyboard, le passage de mon écran de démarrage à mon contrôleur de navigation de flux personnalisé par défaut est la nouvelle présentation (voir capture d'écran ci-dessous).

Segue

La façon dont j'ai résolu cela était de revenir à l'ancien style qui par défaut à l'ancien cycle de vie. Voir la capture d'écran ci-dessous.

Storyboard seque genre

Je ne sais pas pourquoi, car c'était le seul endroit de mon application qui a causé cela (une très grosse application, je dois donc passer du temps à parcourir tous les storyboards pour m'en assurer).

DavidA
la source
2
Votre question demande comment désactiver l'utilisation des scènes. Cette réponse ne fournit pas de solution pour désactiver les scènes. Cela ne devrait pas être la réponse acceptée. Si tout ce que vous vouliez faire était d'éviter la nouvelle présentation de type carte, vous auriez pu trouver cette réponse dans plusieurs doublons répondant à cette question.
rmaddy
2

Xcode 11 - Swift 5.3

Depuis Xcode 11 et avec l'aide de Swift 5.3 et @main, vous pouvez avoir une application multiplateforme qui n'a aucun SceneDelegateévénement ou AppDelegate. Il n'y aura qu'un simple fichier comme:

import SwiftUI

@main
struct MyMultiPlatformApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
Mojtaba Hosseini
la source