Obecnie używam Xcode 11 Beta 5. W mojej aplikacji działa dobrze na iOS 12 i niższych. Jednak na iOS 13 wygląda na to, że UIScene
domyślnie używa . To powoduje, że moja aplikacja nic nie robi.
Gdy aplikacja uruchamia się przy nowej instalacji, użytkownik musi zaakceptować warunki, które musi zaakceptować. Po wyrażeniu zgody przechodzą do ekranu ładowania, który następnie kieruje ich do głównego widoku. Na zamieszczonym przeze mnie zrzucie ekranu widok za bieżącym na pierwszym planie to powitalny ekran ładowania.
Wkrótce zajmiemy się dodaniem obsługi wielu widoków w całej aplikacji, ale w tej chwili mamy rzeczy o wyższym priorytecie, nad którymi musimy popracować.
Opcja „Obsługa wielu okien” jest już wyłączona w ustawieniach ogólnych celu aplikacji. Mam również opcję Enable Multiple Windows ustawioną na NO w pliku info.plist.
Jak dotąd nic tak naprawdę nie zadziałało. Zasadniczo chcę zrezygnować / wyłączyć wiele okien i UIScene / SwiftUI, aby przywrócić oryginalne zachowanie w iOS 10-12. Czy to możliwe w iOS 13, czy musimy to zaktualizować?
Aktualizacja:
Oto zrzut ekranu hierarchii debugowania widoku. Lewa strona to iOS 12, prawa strona to iOS 13. Bez dodawania czegokolwiek do Info.plist ani żadnych klas lub metod delegata sceny, dlaczego jest inaczej? Prawie po prostu uruchomiłem go w istniejącym gotowym do produkcji kodzie na Xcode 11.
viewWill|DidAppear
nie są tak samo nazywane w iOS 13 podczas odrzucania prezentowanych kontrolerów widoku, na przykład. Dodaj wiele komunikatów debugowania cyklu życia i punktów przerwania i porównaj przepływ między iOS 12 i 13 i zobacz, gdzie jest inny.Odpowiedzi:
Chociaż powinieneś korzystać ze scen, gdy Twoja aplikacja jest uruchomiona w systemie iOS 13 lub nowszym, możesz w pełni zrezygnować z obsługi systemu iOS 12 lub wcześniejszego.
Całkowicie usuń wpis „Manifest sceny aplikacji” z Info.plist.
Jeśli istnieje klasa delegata sceny, usuń ją.
Jeśli w delegacie aplikacji istnieją metody związane ze scenami, usuń te metody.
Jeśli go nie ma, dodaj właściwość
var window: UIWindow?
do delegata aplikacji.Twoja aplikacja powinna teraz używać tylko delegata aplikacji, a pod iOS 13 powinna mieć taki sam cykl życia jak iOS 12.
Uwaga: nic z tego nie jest specyficzne dla Swift lub SwiftUI.
źródło
AppDelegate
której się odezwałem. Czy to automatycznie powraca w opisanym przez ciebie procesie? (Miejmy nadzieję, że wykorzystując odpowiedź do lepszego sformatowania rzeczy niż komentarz. (Zapraszam do komentowania, a ja edytuję.)
To jest coś, z czym też się zmierzyłem, a tutaj jest kilka scenariuszy:
UIKit
aplikacją w Xcode 11, po prostu ją otwórz i powinno działać dobrze. Wszystkie moje aplikacje mają, bezSceneDelegate
pliku, żadnych zmianAppDelegate
ani scenorysów.UIKIT
aplikację na iOS 13 , po prostu utwórz ją, upewniając się, że pole wyboru „Użyj SwiftUI” nie jest zaznaczone.Ale zastanawiam się, czy masz do czynienia z trzecim scenariuszem - tym, który zrobiłem około tydzień temu. Stworzenie nowej aplikacji ʻUIKit przeznaczonej dla czegoś wcześniejszego niż iOS 13 . (Właściwie celowałem w iOS 9!)
Tak, Twój szablon wyświetli 15 błędów (od wersji beta 5) wraz z
SceneDelegate
plikiem / klasą. Na szczęście Xcode pomoże Ci automatycznie poprawić wszystkie oprócz jednego.Ostatnim jest dodanie jednej linii, która jest częścią
SceneDelegate
klasy, ale niestety Apple pominęła ją pozaAppDelegate
klasą - co po kilkunastu@available(iOS 13.0, *)
klauzulach oznacza, że zrezygnowałeś z korzystania zSceneDelegate
iOS 12 i zgadnij co? Nie ma go w środkuApDelegate
!Dodaj to do swojej AppDelegate:
var window: UIWindow?
W tym momencie powinieneś mieć działającą
UIKit
aplikację przeznaczoną na iOS 12 i starsze.źródło
SceneDelegate
a testowanie mówi (a) działają w iOS 13 i (b) w ogóle nie obsługują wielu okien, po prostu podziel widok między dwie aplikacje. (Nie obsługuję też przeciągania i upuszczania.) Czy jest coś jeszcze na Twoim końcu?SceneDelegate
, nieSwiftUI
, brak możliwości tworzenia wielu instancji aplikacji na iOS 9+. Wydajność jest taka sama jak zawsze - wszystkie sąCoreImage
niestandardowymi filtrami aktualizowanymi w czasie rzeczywistym - i, cóż, dla mnie? Jeśli istnieje jakiś problem związany z systemem operacyjnym związany ze scenami w hierarchii widoków, jest to dyskusyjne, jeśli nie obsługuje scen. (I na koniec, tak, nadal jestem trochę zaniepokojony. Ale to także wersja beta 5.) Mam nadzieję, że masz dobrą kopię zapasową, która może odtworzyć to, co widzę.Mam to do pracy, używając odpowiedzi dfd, ale ponieważ moja aplikacja jest w Objective-C, musiałem wprowadzić jedną zmianę:
W Objective-C chcesz umieścić
@property (strong, nonatomic) UIWindow *window;
w AppDelegate.h (nie w .m)
źródło
Okej, więc to rozgryzłem. Ze względu na zmiany w iOS 13 w nowym domyślnym stylu prezentacji kart firmy Apple, w mojej scenorysie przechodzę z mojego ekranu powitalnego do mojego niestandardowego kontrolera nawigacji przepływu, który domyślnie ustawił nową prezentację (patrz zrzut ekranu poniżej).
Naprawiłem to, aby wrócić do starego stylu, który domyślnie przywracał stary cykl życia. Zobacz zrzut ekranu poniżej.
Nie jestem pewien, dlaczego tak się stało, ponieważ było to jedyne miejsce w mojej aplikacji, które to spowodowało (dość duża aplikacja, więc muszę poświęcić trochę czasu na przeglądanie wszystkich scenorysów, aby się upewnić).
źródło
Xcode 12 - Swift 5.3 - iOS 14
Od Xcode 12 i przy pomocy Swift 5.3 i
@main
możesz mieć wieloplatformową aplikację, która nie ma żadnegoSceneDelegate
zdarzeniaAppDelegate
. Będzie tylko prosty plik, taki jak:import SwiftUI @main struct MyMultiPlatformApp: App { var body: some Scene { WindowGroup { ContentView() } } }
źródło