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.
"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.
viewWill|DidAppear
in 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.Antworten:
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.
quelle
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.)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:
UIKit
App in Xcode 11 arbeiten möchten , öffnen Sie sie einfach und sie sollte einwandfrei funktionieren. Alle meine Apps haben wederSceneDelegate
Dateien noch Änderungen anAppDelegate
oder Storyboards.UIKIT
App 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
SceneDelegate
Datei / 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
SceneDelegate
Klasse ist, aber Apple hat sie leider aus derAppDelegate
Klasse@available(iOS 13.0, *)
herausgelassen.SceneDelegate
Was 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 drinApDelegate
!Fügen Sie dies Ihrem AppDelegate hinzu:
Zu diesem Zeitpunkt sollte eine
UIKit
App für iOS 12 und früher ausgeführt werden.quelle
SceneDelegate
und 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?SceneDelegate
, neinSwiftUI
, keine Möglichkeit, mehrere Instanzen meiner iOS 9+ -Apps zu erstellen. Die Leistung ist die gleiche wie immer - alle sindCoreImage
benutzerdefinierte 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.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).
Wie ich das behoben habe, war, zum alten Stil zurückzukehren, der standardmäßig den alten Lebenszyklus hatte. Siehe Screenshot unten.
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).
quelle
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
in AppDelegate.h (nicht in der .m)
quelle
Xcode 11 - Swift 5.3
Seit Xcode 11 und mit Hilfe von Swift 5.3 und
@main
können Sie eine Multiplattform-App haben, die keinSceneDelegate
oder Ereignis hatAppDelegate
. Es wird nur eine einfache Datei geben wie:quelle