Nakaz scen w UIKit: co nie uruchomi się na iOS 27
Dokumentacja migracyjna Apple ujmuje najtrudniejszy wymóg cyklu iOS 27 w jednym zdaniu: „Począwszy od iOS 27, iPadOS 27, Mac Catalyst 27, tvOS 27 oraz visionOS 27 aplikacje zbudowane z najnowszym SDK muszą przyjąć oparty na scenach cykl życia, inaczej nie uruchomią się.”1 Nie wycofane, nie ostrzeżone, nie wolniejsze: nie uruchomią się. Sesja 278 stawia to równie wprost: „Cykl życia UIScene jest teraz wymagany przy budowaniu z najnowszymi SDK. Bez niego aplikacja nie będzie się już uruchamiać.”2 Każda aplikacja UIKit wciąż działająca na starym, opartym na delegacie aplikacji cyklu życia ma czas na migrację do momentu, gdy zostanie zbudowana względem SDK iOS 27, a faza ostrzeżeń trwa już od lat.
Wymóg przedstawiony w 2:36 sesji 278.
TL;DR
- Aplikacje zbudowane z użyciem SDK iOS 27 muszą korzystać z opartego na scenach cyklu życia UIKit, inaczej nie uruchomią się — dotyczy to iOS, iPadOS, Mac Catalyst, tvOS oraz visionOS 27.1 Istniejące binaria zbudowane ze starszymi SDK działają nadal; ścianą jest SDK, względem którego się buduje.
- Eskalacja była stopniowa: UIKit zaczął rejestrować komunikat o migracji już w iOS 18.4, a w iOS 26 komunikat się zmienił. To w iOS 27 wpis w dzienniku staje się błędem uruchamiania.1
- Migracja jest potrzebna, jeśli spełniony jest którykolwiek z warunków: Info.plist nie zawiera klucza
UIApplicationSceneManifestz konfiguracją lub delegat aplikacji nie implementuje metody konfiguracji sceny.1 - Minimalna migracja jest niewielka: wpis manifestu sceny w property list albo metoda delegata dla konfiguracji dynamicznych. Obsługa wielu scen pozostaje opcjonalna.1
- Xcode 27 dostarcza agent skill modernizacji aplikacji, który konwertuje aplikacje na oparty na scenach cykl życia, przepisuje sprawdzenia ekranu głównego i orientacji, zadaje pytania doprecyzowujące przy złożonych zadaniach oraz pozostawia komentarze przy pracy, której nie może dokończyć w jednej sesji.2
Nakaz, a nie wycofanie
Cykl 27 charakteryzuje się wzorcem usuwania API jedno wydanie po dojrzeniu ich następców: ImageCreator przestaje działać w iOS 27, a MXMetricManager niesie ze sobą wycofanie w 27.0 w tym samym tygodniu, w którym pojawił się jego następca. Wymóg scen jest najdonioślejszym wpisem w tym wzorcu, ponieważ blokuje całą aplikację, a nie funkcję. Aplikacja, która nigdy nie sięga po Image Playground, niczego tej jesieni nie traci. Aplikacja, która ignoruje oparty na scenach cykl życia, przestaje się uruchamiać w dniu, w którym zostanie zbudowana z nowym SDK.
Harmonogram pokazuje, jak długi rozbieg Apple zużyło, zanim zaczęło egzekwować. Począwszy od iOS 18.4, iPadOS 18.4, Mac Catalyst 18.4, tvOS 18.4 oraz visionOS 2.4 UIKit rejestrował komunikat dla aplikacji, które nie przeszły migracji, a w wydaniach 26 komunikat się zmienił.1 Dwa wydania ostrzeżeń, a potem podłoga się zapada. Podstawy koncepcyjne są jeszcze starsze: sesja sięga do WWDC 2014 i ujęcia Bruce’a Nilo, że „obrót urządzenia to jedynie animowana zmiana granic”, i zauważa, że przy oknach iPada o zmiennym rozmiarze oraz aplikacjach iPhone’a o zmiennym rozmiarze „dziś ten wgląd jest bardziej aktualny niż kiedykolwiek”.2
Jedna granica warta precyzyjnego określenia: wymóg wiąże aplikacje „zbudowane z najnowszym SDK”.1 Dostarczane binaria zbudowane względem SDK iOS 26 lub wcześniejszych uruchamiają się nadal. W chwili, gdy przebuduje się je z SDK Xcode 27, aby przejąć cokolwiek nowego, oparty na scenach cykl życia przychodzi razem z tym.
Czy faktycznie trzeba przeprowadzić migrację?
Dokumentacja podaje test dwóch warunków. Migracja jest konieczna, jeśli klucz UIApplicationSceneManifest brakuje w information property list (lub nie ma określonych konfiguracji) albo jeśli delegat aplikacji nie implementuje metody konfiguracji sceny.1 Większość aplikacji rozpoczętych po 2019 roku przechodzi ten test już teraz; szablony Xcode od tamtej pory generują projekty oparte na scenach. Aplikacjami objętymi nakazem są te długowieczne, których AppDelegate wciąż jest właścicielem okna.
Minimalna poprawka prowadzi jedną z dwóch dróg. Droga statyczna dodaje do property list klucz UIApplicationSceneManifest z konfiguracją sceny, dostępny przez ustawienia General celu, w sekcji „Scene manifest” w Deployment Info.1 Droga dynamiczna implementuje zamiast tego metodę delegata konfiguracji sceny — dla aplikacji, które dostosowują sceny na podstawie aktywności użytkownika lub obsługują różne role scen; przykład w dokumentacji wykorzystuje właściwość roli sesji, aby określić, którą scenę utworzyć.1 Aplikacje, które ładują główny kontroler widoku ze storyboardu, dołączają nazwę storyboardu do manifestu sceny, a system automatycznie konfiguruje scenę okna i główny kontroler widoku.1
Czego nakaz nie wymaga, to wielu scen. Dokumentacja jasno stwierdza, że obsługa wielu scen pozostaje opcjonalna i może wymagać przebudowy modelu danych tak, aby był specyficzny dla sceny; zaleca rozważenie, czy doświadczenie użytkownika na tym skorzysta, zanim się ją włączy.1 Migracja oznacza przeniesienie zdarzeń cyklu życia z poziomu aplikacji na poziom sceny, gdzie UIApplicationDelegate zachowuje zdarzenia na poziomie procesu, a delegat sceny przejmuje te specyficzne dla UI.1 Jeden szczegół, który potrafi zaskoczyć przy konfiguracji: należy określać obiekty UIWindowScene, a nie zwykłe obiekty UIScene, a sceny CarPlay korzystają z własnego typu sceny aplikacji szablonowej.1
Dlaczego teraz: wszystko zmienia rozmiar
Nakaz pojawia się w tym samym wydaniu, które czyni zmienność rozmiaru powszechną, a sesja 278 przedstawia je jako jedną opowieść. W iOS i macOS 27 okna iPhone Mirroring na Macu swobodnie zmieniają rozmiar, a aplikacja tylko na iPhone’a uruchomiona na iPadzie staje się „w pełni skalowalna jak każda inna aplikacja iPada”.2 Oparty na scenach cykl życia jest, słowami sesji, „podstawą każdej adaptacyjnej aplikacji”: warunkiem koniecznym dla wszystkiego innego, o naprawienie czego sesja prosi.2
Lista poprawek to oczyszczenie z założeń skoncentrowanych na ekranie. Odwołania do ekranu głównego zwracają nieprawidłowe informacje, gdy scena żyje na innym wyświetlaczu, dlatego sesja zaleca, aby uzyskiwać dostęp do ekranu dynamicznie przez scenę okna albo, jeszcze lepiej, całkowicie usunąć odwołania do ekranu: skala ekranu staje się właściwością displayScale kolekcji cech, a granice ekranu stają się efektywną geometrią sceny okna lub po prostu rozmiarem otaczającego widoku.2 Automatyczne śledzenie cech łagodzi migrację: system śledzi, które właściwości cech są odczytywane wewnątrz metod układu i rysowania, takich jak layoutSubviews, i wywołuje je ponownie, gdy zmienia się śledzona cecha.2
Dwa od dawna istniejące sygnały tracą swoje znaczenie układowe całkowicie. Idiom interfejsu użytkownika „nie jest już znaczący dla żadnej decyzji układowej”, ponieważ aplikacja iPhone’a na iPadzie działa w pełni skalowalnie, wciąż raportując idiom telefonu; a obsługiwana orientacja interfejsu staje się preferencją, którą system ignoruje w środowiskach o zmiennym rozmiarze, przy czym iPhone Mirroring zawsze raportuje orientację pionową niezależnie od proporcji okna.2 Zastępstwem dla obu są klasy rozmiaru. Gry otrzymują udogodnienie zamiast wyjątku: UIRequiresFullscreen jest honorowane na iPhonie w środowiskach o zmiennym rozmiarze począwszy od iOS 27, lecz jego zachowanie zmienia się w skalowanie dyskretne, przenosząc scenę do pasującej konfiguracji ekranu przy każdej zmianie rozmiaru, tak aby gra renderowała w pełnej jakości w dostępnej przestrzeni.2
Testowanie całej macierzy stało się tańsze w tym samym cyklu: Device Hub i Xcode Previews zyskują „tryb zmiany rozmiaru”, który swobodnie przeciąga krawędzie urządzenia, a sesja zaleca następnie sprawdzenia na rzeczywistym urządzeniu w iPhone Mirroring oraz na iPadzie.2
Migracja ma swój agent skill
Sesja kończy się przyznaniem, jak duża jest to prośba, i wskazaniem odpowiedzi Xcode 27: nowego skilla modernizacji aplikacji z „głębokim zrozumieniem zadań adaptacyjnych”, które sesja zarysowuje.2 Poproszony o uczynienie aplikacji bardziej adaptacyjną, agent konwertuje wywołania ekranu głównego na sprawdzenia kolekcji cech lub granic sceny, z logiką unieważniania tam, gdzie jest potrzebna, zastępuje sprawdzenia orientacji interfejsu klasami rozmiaru i „przekonwertuje nawet aplikację, aby korzystała z cyklu życia scen”.2 Przy złożonych zadaniach zadaje pytania doprecyzowujące, a przy pracy zbyt dużej na jedną sesję pozostawia komentarze oznaczające to, co pozostało.2
Sposób dystrybucji pasuje do reszty ofensywy skilli Apple na tym WWDC: xcrun agent skills export tworzy pliki markdown, które można zaimportować do innych narzędzi — ten sam mechanizm omówiony w eksporcie agent skills w Xcode 27.2 Migracja egzekwowana przez SDK, w parze ze skillem, który tę migrację wykonuje, jest jak dotąd najczytelniejszym wyrazem tego, jak Apple oczekuje wchłaniania przełomowych zmian w erze agentów: platforma podnosi podłogę, a narzędzia przenoszą cię ponad nią.
FAQ
Czy moja istniejąca aplikacja przestanie działać na iOS 27?
Nie z powodu samego tego wymogu. Nakaz dotyczy aplikacji „zbudowanych z najnowszym SDK”.1 Binaria już dostarczone ze starszymi SDK uruchamiają się nadal na iOS 27. Awaria następuje, gdy przebudowuje się aplikację względem SDK iOS 27 bez wdrożonego opartego na scenach cyklu życia.
Skąd wiem, czy moja aplikacja jest objęta zmianą?
Należy sprawdzić dwie rzeczy.1 Jeśli w Info.plist brakuje klucza UIApplicationSceneManifest z konfiguracją, a delegat aplikacji nie implementuje metody konfiguracji sceny, oznacza to korzystanie z opartego na delegacie aplikacji cyklu życia, a aplikacja nie uruchomi się po zbudowaniu z SDK iOS 27. UIKit rejestruje komunikat o migracji dla objętych aplikacji od iOS 18.4.1
Czy to zmusza mnie do obsługi wielu okien?
Nie. Obsługa wielu scen pozostaje opcjonalna, a dokumentacja Apple zaleca rozważenie, czy doświadczenie użytkownika na tym skorzysta, zanim się ją włączy, ponieważ może wymagać uczynienia modelu danych specyficznym dla sceny.1 Nakaz wymaga jedynie samego opartego na scenach cyklu życia: zdarzeń cyklu życia obsługiwanych per scena, a nie globalnie.
Czy agent może przeprowadzić migrację?
Xcode 27 dostarcza skill modernizacji aplikacji, który — jak twierdzi sesja — potrafi przekonwertować aplikację na cykl życia scen, przepisać odwołania do ekranu głównego oraz zastąpić sprawdzenia orientacji klasami rozmiaru, zadając pytania doprecyzowujące tam, gdzie zmiana jest niejednoznaczna, i pozostawiając komentarze przy niedokończonej pracy.2 Eksportuje do innych narzędzi przez xcrun agent skills export.2 Z jego wynikiem należy postępować jak z każdą migracją napisaną przez agenta: przejrzeć diff, zwłaszcza w okolicach przywracania stanu i konfiguracji okna.
Nakaz dopełnia motyw tego cyklu: Apple egzekwujące migracje na granicy 27, zamiast je sugerować — po tym, jak wycofanie ImageCreatora pokazało tę samą stopniową eskalację na mniejszej powierzchni. Odpowiedź w postaci agent skilla łączy się z szerszym łukiem skilli w Xcode 27 dostarcza agent skills, które można eksportować wszędzie. Centrum całej serii to Seria Apple Ecosystem.
Źródła
-
Apple, Transitioning to the UIKit scene-based life cycle, Apple Developer Documentation. Źródło wymogu („Beginning in iOS 27, iPadOS 27, Mac Catalyst 27, tvOS 27, and visionOS 27, apps built with the latest SDK must adopt the scene-based life cycle or they fail to launch”), stopniowych ostrzeżeń (UIKit rejestrujący komunikat o migracji począwszy od iOS 18.4, iPadOS 18.4, Mac Catalyst 18.4, tvOS 18.4 oraz visionOS 2.4, z komunikatem zmienionym w wydaniach 26), testu migracji dwóch warunków (brakujący klucz
UIApplicationSceneManifestlub brak metody delegata konfiguracji sceny), dróg migracji przez property list i konfigurację dynamiczną, w tym lokalizacji „Scene manifest” w ustawieniach General oraz przykładu z rolą sesji, uwagi o nazwie storyboardu z automatyczną konfiguracją sceny okna, pozostania obsługi wielu scen opcjonalną wraz z ostrzeżeniem dotyczącym modelu danych, podziału odpowiedzialności cyklu życia między aplikację a scenę, wskazówki, aby określać obiektyUIWindowScenezamiast obiektówUIScene, oraz typu sceny CarPlay. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, WWDC 2026 session 278, Modernize your UIKit app. Oficjalny transkrypt; prezentowany przez Michaela Ochsa, kierownika inżynierii w zespole UI Frameworks. Źródło sformułowania wymogu („UIScene lifecycle is now required when building with the latest SDKs. Without it, your application will no longer launch”), zmiany rozmiaru iPhone Mirroring i aplikacji tylko na iPhone’a działających w pełni skalowalnie na iPadzie, opartego na scenach cyklu życia jako „podstawy każdej adaptacyjnej aplikacji”, wskazówek dotyczących ekranu głównego (dynamiczny dostęp przez scenę okna,
displayScaleprzez kolekcję cech, efektywna geometria i rozmiar otaczającego widoku zamiast granic ekranu), automatycznego śledzenia cech w metodach układu i rysowania, wskazówek dotyczących idiomu i orientacji interfejsu, w tym zawsze pionowego zachowania w iPhone Mirroring oraz przejścia na klasy rozmiaru, zachowania skalowania dyskretnegoUIRequiresFullscreendla gier, cytatu Bruce’a Nilo z WWDC 2014 („a device rotation is only an animated bounds change”) i jego ujęcia, trybu zmiany rozmiaru w Device Hub i Xcode Previews oraz skilla modernizacji aplikacji (głębokie zrozumienie zadań adaptacyjnych, konwersja wywołań ekranu głównego z logiką unieważniania, zastępowanie sprawdzeń orientacji klasami rozmiaru, konwersja aplikacji na cykl życia scen, pytania doprecyzowujące, komentarze o postępie oraz eksport przezxcrun agent skills export). ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩