Xcode 11 - Deaktivieren Sie UISceneDelegate / SwiftUI unter iOS 13

106

Ich verwende derzeit Xcode 11 Beta 5. In meiner Anwendung läuft es unter iOS 12 und darunter einwandfrei. Unter iOS 13 sieht es jedoch so aus, als würde standardmäßig UIScene verwendet. Dies führt dazu, dass meine App nichts tut.

Wenn die App bei einer Neuinstallation gestartet wird, muss der Benutzer die allgemeinen Geschäftsbedingungen akzeptieren. Nachdem sie zugestimmt haben, gehen sie zu einem Ladebildschirm, der sie zur Hauptansicht weiterleitet. In dem Screenshot, den ich gepostet habe, ist die Ansicht hinter der aktuellen im Vordergrund der Splash-Ladebildschirm.

Wir werden uns in Kürze mit der Unterstützung von Szenen mit mehreren Ansichten in der gesamten Anwendung befassen, aber im Moment haben wir Dinge mit höherer Priorität, an denen wir arbeiten müssen.

https://imgur.com/i0qLhAL

"Mehrere Fenster unterstützen" ist in den allgemeinen Einstellungen des App-Ziels bereits deaktiviert. Außerdem habe ich in der Datei info.plist die Option Mehrere Fenster aktivieren auf NEIN gesetzt.

Bisher hat nichts wirklich funktioniert. Grundsätzlich möchte ich mehrere Fenster und UIScene / SwiftUI deaktivieren, um das ursprüngliche Verhalten in iOS 10-12 wiederherzustellen. Ist das in iOS 13 möglich oder müssen wir es aktualisieren?

Aktualisieren:

Hier ist ein Screenshot der Ansichts-Debug-Hierarchie. Die linke Seite ist iOS 12, die rechte Seite ist iOS 13. Warum ist es anders, ohne der Info.plist etwas hinzuzufügen oder Klassen oder Methoden für Szenendelegierte hinzuzufügen? Es wurde so ziemlich nur in seinem vorhandenen produktionsfertigen Code auf Xcode 11 ausgeführt.

https://imgur.com/C3aLsDo

DavidA
quelle
Müssen Sie nur iOS 13 und höher unterstützen oder müssen Sie iOS 13 und iOS 12 unterstützen?
rmaddy
@ rmaddy-Unterstützung zwischen iOS 11-13 + (zukünftige Versionen).
DavidA
Ist Ihre Hauptbenutzeroberfläche über Code oder Storyboard?
rmaddy
@rmaddy, das in Storyboards erstellt wurde, hat einen Übergang zu den referenzierten xib ViewControllern.
DavidA
Ohne genaue Angaben darüber, was Ihre App wann tut, ist es schwer zu sagen. Beachten Sie, dass View-Controller-Methoden, wie sie beispielsweise viewWill|DidAppearin iOS 13 nicht als gleich bezeichnet werden, wenn Sie beispielsweise präsentierte View-Controller schließen. Fügen Sie viele Debugging-Meldungen und Haltepunkte für den Lebenszyklus hinzu und vergleichen Sie den Ablauf zwischen iOS 12 und 13, um festzustellen, wo er sich unterscheidet.
rmaddy

Antworten:

295

Während Sie sollten umarmen Szenen zu verwenden , wenn Sie Ihre App unter iOS 13 und später ausgeführt wird, können Sie sich ganz entscheiden, während Sie noch iOS 12 oder früher unterstützen.

  • Entfernen Sie den Eintrag "Application Scene Manifest" vollständig aus Info.plist.

  • Wenn es eine Szenendelegatklasse gibt, entfernen Sie diese.

  • Wenn Ihr App-Delegat szenenbezogene Methoden enthält, entfernen Sie diese Methoden.

  • Wenn dies fehlt, fügen Sie die Eigenschaft var window: UIWindow?Ihrem App-Delegaten hinzu.

Ihre App sollte jetzt nur den App-Delegaten verwenden und unter iOS 13 den gleichen Lebenszyklus wie iOS 12 haben.

Hinweis: Nichts davon ist spezifisch für Swift oder SwiftUI.

rmaddy
quelle
Wir haben gleichzeitig Antworten gepostet. :-) Eine Frage - diese fehlende Zeile AppDelegate, die ich angesprochen habe. Kommt das in diesem von Ihnen beschriebenen Prozess automatisch zurück? (Ich mag Ihre Antwort irgendwie besser, da sie Szenen völlig ignoriert.)
dfd
1
Das gleiche passiert für mich und ich habe keinen offensichtlichen Eintrag in meiner Info.plist, weder AppDelegate-Methoden noch eine SceneDelegate-Klasse. Ich stelle meinen Controller wie "Allgemeine Geschäftsbedingungen" für David als rootViewController ein und er sieht genauso aus wie hier in der obigen Frage. Bitte helfen Sie, da ich mit dieser UI-Panne festgefahren bin und mich nicht vorwärts bewegen kann.
Mohsin Khubaib Ahmed
1
@MohsinKhubaibAhmed Sie fragen nach einem ganz anderen Thema. Siehe stackoverflow.com/questions/56435510/…
rmaddy
1
Hallo! Ich folgte der 3-Schritt-Anweisung, bekam aber einen schwarzen Bildschirm, nachdem der Startbildschirm angezeigt wurde. Das Haupt-Storyboard ist ausgewählt und auch der anfängliche Ansichts-Controller. Hast du irgendwelche Vorschläge?
user3191334
1
@ user3191334 Ich habe auch den schwarzen Bildschirm. In meinem Fall war es der Dunkelmodus, der mir einen standardmäßigen schwarzen Hintergrund gab. Fügen Sie Ihrem Basis-Storyboard Inhalte hinzu, und alle werden angezeigt.
Gordon Dove
40

Verwenden Sie die Antwort, um Dinge hoffentlich besser zu formatieren als einen Kommentar. (Fühlen Sie sich frei zu kommentieren und ich werde bearbeiten.)

Dies ist etwas, mit dem ich auch konfrontiert war, und hier spielen einige Szenarien eine Rolle:

  • Wenn Sie an einer vorhandenenUIKit App in Xcode 11 arbeiten möchten , öffnen Sie sie einfach und sie sollte einwandfrei funktionieren. Alle meine Apps haben weder SceneDelegate Dateien noch Änderungen an AppDelegateoder Storyboards.
  • Wenn Sie eine neue UIKITApp für iOS 13 erstellen möchten, erstellen Sie sie einfach, während Sie das Kontrollkästchen "SwiftUI verwenden" deaktivieren.

Aber ich frage mich, ob Sie vor dem dritten Szenario stehen - einem, das ich vor ungefähr einer Woche gemacht habe. Erstellen einer neuen UIKit-App für frühere Versionen als iOS 13 . (Ich habe tatsächlich auf iOS 9 abgezielt!)

Ja, Ihre Vorlage enthält 15 Fehler (ab Beta 5) sowie eine SceneDelegateDatei / Klasse. Glücklicherweise hilft Ihnen Xcode dabei, alle bis auf einen automatisch zu korrigieren.

Die letzte besteht darin, eine Zeile hinzuzufügen, die Teil der SceneDelegateKlasse ist, aber Apple hat sie leider aus der AppDelegateKlasse @available(iOS 13.0, *)herausgelassen. SceneDelegateWas bedeutet, dass Sie sich nach mehr als einem Dutzend Klauseln abgemeldet haben, wenn Sie iOS 12 ausführen, und wissen Sie was? Es ist nicht da drin ApDelegate!

Fügen Sie dies Ihrem AppDelegate hinzu:

var window: UIWindow?

Zu diesem Zeitpunkt sollte eine UIKitApp für iOS 12 und früher ausgeführt werden.

dfd
quelle
Danke dafür. Mein Szenario ist so ziemlich der erste Punkt, den Sie gesagt haben, eine vorhandene UIKit-App in Xcode 11. Aber wenn ich sie öffne, funktioniert sie nicht gut. Schauen Sie sich das Update an, das ich der View-Debug-Hierarchie hinzugefügt habe.
DavidA
Auch im AppDelegate gibt es bereits ein var-Fenster: UIWindow?
DavidA
Du hattest mich besorgt! (Und ich mache mir immer noch ein bisschen Sorgen.) Ich habe nur sehr wenig für meine vorhandenen Apps aktualisiert - letzte Woche war ich frustriert über SwiftUI und ich war neugierig, ein Layout nur in UIKit für iOS 13 auszuprobieren. Aber meine vorhandenen Apps? Sie unterstützen iPad-Multitasking, bleiben aber in Xcode 11 unverändert. Ich habe keine SceneDelegateund Tests zeigen, dass (a) sie unter iOS 13 funktionieren und (b) sie überhaupt nicht mehrere Fenster unterstützen, sondern nur die Ansicht zwischen zwei Apps aufteilen. (Ich unterstütze Drag & Drop auch nicht.) Ist an Ihrem Ende noch etwas los?
dfd
Um es zu wiederholen, habe ich einfach meine Xcode 10-App in Xcode 11 geöffnet. Nein SceneDelegate, nein SwiftUI, keine Möglichkeit, mehrere Instanzen meiner iOS 9+ -Apps zu erstellen. Die Leistung ist die gleiche wie immer - alle sind CoreImagebenutzerdefinierte Filter, die in Echtzeit aktualisiert werden - und für mich? Wenn es in der Ansichtshierarchie eine OS-bezogene Cruft gibt, die sich auf Szenen in der Ansichtshierarchie bezieht, ist es umstritten, wenn Szenen nicht unterstützt werden. (Und zum Schluss, ja, ich bin immer noch ein bisschen besorgt. Aber es ist auch Beta 5.) Hoffentlich haben Sie ein gutes Backup, das reproduzieren kann, was ich sehe.
dfd
Vielen Dank. Ich vermute, es ist etwas innerhalb des Lebenszyklus. Ich werde Zeit damit verbringen, meine Anwendung zu debuggen. Ich werde dies aktualisieren, wenn ich es herausfinde, um jemandem in einer ähnlichen Situation zu helfen
DavidA
4

Okay, also habe ich es herausgefunden. Aufgrund der Änderungen in iOS 13 des neuen Standard-Kartenpräsentationsstils von Apple wurde in meinem Storyboard von meinem Begrüßungsbildschirm zu meinem benutzerdefinierten Flow-Navigations-Controller standardmäßig die neue Präsentation verwendet (siehe Abbildung unten).

Übergang

Wie ich das behoben habe, war, zum alten Stil zurückzukehren, der standardmäßig den alten Lebenszyklus hatte. Siehe Screenshot unten.

Storyboard-Sequenz Art

Ich bin mir nicht sicher, warum dies der Fall war, da dies der einzige Ort in meiner Anwendung war, der dies verursacht hat (ziemlich große App, daher muss ich einige Zeit damit verbringen, alle Storyboards durchzugehen, um sicherzugehen).

DavidA
quelle
2
In Ihrer Frage wird gefragt, wie Sie die Verwendung von Szenen deaktivieren können. Diese Antwort bietet keine Lösung für das Deaktivieren von Szenen. Dies sollte nicht die akzeptierte Antwort sein. Wenn Sie nur die neue Präsentation im Kartenstil vermeiden wollten, hätten Sie diese Antwort in mehreren Duplikaten finden können, die diese Frage beantworten.
rmaddy
4

Ich habe dies mit der Antwort von dfd zum Laufen gebracht, aber da sich meine App in Objective-C befindet, musste ich eine Änderung vornehmen:

In Objective-C möchten Sie setzen

@property (strong, nonatomic) UIWindow *window;

in AppDelegate.h (nicht in der .m)

Nik Bhatt
quelle
2

Xcode 11 - Swift 5.3

Seit Xcode 11 und mit Hilfe von Swift 5.3 und @mainkönnen Sie eine Multiplattform-App haben, die kein SceneDelegateoder Ereignis hat AppDelegate. Es wird nur eine einfache Datei geben wie:

import SwiftUI

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