← Wszystkie wpisy

Xcode 27.1 beta: aplikacja w symulatorze iPhone Duo

Xcode 27.1 beta (27A9269) ukazał się w piątek 18 września 2026 roku z pierwszym SDK iOS 27.1 i typem urządzenia iPhone Duo dla symulatora, cztery dni po Xcode 27.0. SDK zawiera wszystkie API iPhone Duo wymienione w przewodniku przygotowawczym Apple, profil typu urządzenia definiuje dwa ekrany jako 1398 na 2034 i 2007 na 2853 piksele przy skali 3x, czyli 466 na 678 i 669 na 951 punktów, a runtime symulatora to osobne pobranie, po które Xcode sięga na żądanie. Własne noty Apple wymieniają trzy rzeczy, których symulator jeszcze nie potrafi, a aplikacja sondująca uruchomiona w trzech pozach Device Hub trafia na ekran 466 na 678 punktów w stanie zamkniętym i na ekran 951 na 669 w otwartym, regularny tam w obu klasach rozmiaru, i w żadnej pozie nie raportuje zarezerwowanych regionów, przy czym UIScreen.main wciąż odpowiada za ekran zewnętrzny, gdy aplikacja stoi na wewnętrznym.12456 {.answer-block}

TL;DR

  • Daty i kompilacje. Kanał wydań Apple datuje Xcode 27.1 beta (27A9269) na piątek 18 września. xcodebuild -version wypisuje Xcode 27.1 oraz Build version 27A9269; SDK iPhoneOS i iPhoneSimulator identyfikują się oba jako iOS 27.1, kompilacja 24A94403; kompilator Swift raportuje ten sam ciąg wersji swiftlang-6.4.0.34.1 co Xcode 27.0, a linker ten sam ld-27037.1. Plik xip waży 2 027 292 809 bajtów, rozpakowana aplikacja zajmuje 3,6 GiB, a instaluje się obok Xcode 27.0, niczego nie zastępując.14
  • API Duo są już w SDK. Dziesięć nazw, których moje sprawdzenie z 17 września nie znalazło w SDK 27.0, jest obecnych w SDK 27.1, a wśród nich ArrangementView i reservedRegions(kind:options:layoutDirectionBehavior:) w SwiftUICore, toolbarVerticalBehavior(_:) w SwiftUI oraz UIArrangementViewController, preferredVerticalBarBehavior i verticalBarEdge w UIKit. SwiftUI oznacza je jako @available(anyAppleOS 27.1, *); nagłówki UIKit oznaczają kontroler układu i metody zarezerwowanych regionów jako API_AVAILABLE(ios(27.1), tvos(27.1), visionos(27.1)), czyli o dwie platformy więcej, niż wymieniają strony dokumentacji.4
  • Profil symulatora zapisuje rozmiary ekranów. Typ urządzenia iPhone Duo (iPhone19,4, klasa produktu V68, numer modelu A3447) definiuje dwa wbudowane ekrany: primary o wymiarach 1398 na 2034 piksele przy skali 3 oraz primary-1 o wymiarach 2007 na 2853 piksele przy skali 3, z orientacją natywną 270. Po podzieleniu przez trzy daje to 466 na 678 oraz 669 na 951 punktów, a liczba dla ekranu wewnętrznego jest dokładnie tą, którą mój wpis o Duo dla deweloperów wywnioskował 10 września z rozmiaru zrzutu ekranu w App Store Connect. Profil wymaga runtime’u 27.1 lub nowszego.5
  • Co symulator robi z prawdziwą aplikacją. Device Hub udostępnia trzy pozy: Closed (zamknięta), Book (książka) i Open (otwarta), a do tego Rotate Right (obrót w prawo). W pozie Closed sonda dostaje ekran zewnętrzny: 466 na 678 punktów, szerokość compact, układ dzielony ułożony jeden nad drugim. W Open dostaje ekran wewnętrzny: 951 na 669 punktów w natywnej orientacji poziomej, regularny w obu klasach rozmiaru, wcięcia obszaru bezpiecznego po 34 z każdej strony, układ dzielony obok siebie; po obrocie 669 szerokości na 951 wysokości i nadal regularny w obu osiach. Book dała aplikacji tę samą geometrię co Open. W każdej pozie reservedRegions nie zwróciło nic, nawet z regionami nieaktywnymi, toolbarVerticalEdge pozostało nil, pasek narzędzi rysował się poziomo, a UIScreen.main.bounds wciąż raportowało 466 na 678, gdy aplikacja stała na ekranie wewnętrznym.6
  • Czego ta beta jeszcze nie potrafi. Noty Apple: „Initial Simulator launch can take several minutes.” (187708500), „StandBy is unavailable in the iPhone Duo Simulator runtime.” (187708663) oraz „Running and debugging most app extensions is unavailable in the iPhone Duo Simulator runtime.” (187708767), czyli pierwsze uruchomienie symulatora może zająć kilka minut, a w tym runtimie niedostępne są StandBy i większość rozszerzeń aplikacji. Do tego dwa Known Issues dla Mac Catalyst, istotne dla każdego, czyja aplikacja wychodzi także na Maca, i jedna rzecz, której Apple nie wymienia: pobieranie runtime’u zawiodło za pierwszym razem z komunikatem Download failed. i powiodło się przy ponownej próbie.23

Co jest w tej becie?

Kanał wydań Apple wymienia „Xcode 27.1 beta (27A9269)” w piątek 18 września o godzinie 10:00 czasu pacyficznego, a tego samego popołudnia „TestFlight Update”; noty wydania App Store Connect z tego dnia mówią „You can now submit apps built with Xcode 27.1 beta using the SDK for iOS 27.1 beta or iPadOS 27.1 beta for internal and external testing.” (można już przesyłać aplikacje zbudowane w Xcode 27.1 beta z użyciem SDK iOS 27.1 beta lub iPadOS 27.1 beta do testów wewnętrznych i zewnętrznych).1 Overview not wydania nazywa linię SDK: „Xcode 27.1 beta includes Swift 6.4 and SDKs for iOS 27.1, iPadOS 27, tvOS 27, watchOS 27, macOS 27, and visionOS 27. Xcode 27.1 beta supports on-device debugging in iOS 17 and later, tvOS 17 and later, watchOS 10 and later, and visionOS. Xcode 27.1 beta requires a Mac running macOS Tahoe 26.6 or later.”2 Tę listę warto czytać dosłownie: iOS jest jedyną platformą w wersji 27.1, własny SDKSettings.plist tego SDK raportuje wersję 27.1, a App Store Connect nazywa ten sam SDK „iPadOS 27.1 beta”, co jest niuansem ciągnącym się od wpisu o Xcode 27.

Pobranie jest mniejsze, niż sugeruje numer wersji. Plik xip waży 2 027 292 809 bajtów, jest podpisany przez Apple certyfikatem Software Update i rozpakowuje się do aplikacji o wielkości 3,6 GiB, czyli tyle samo co Xcode 27.0; xip --expand do katalogu, zmiana nazwy na /Applications/Xcode-27.1-beta.app i DEVELOPER_DIR wskazujący na nią to cała instalacja na potrzeby pracy z linii poleceń. Pierwsze wywołanie xcodebuild pod betą zajęło potem jakieś dwie minuty na samodzielną instalację dołączonych pakietów CoreTypes.pkg i XcodeSystemResources.pkg, czyli kroku, który xcodebuild -runFirstLaunch wykonuje jawnie, a drugi z tych pakietów odpowiada za umieszczenie typu urządzenia iPhone Duo na miejscu.4 Czego aplikacja nie zawiera, to runtime symulatora. Beta znajduje runtime’y iOS obecne już na tym Macu, wśród nich 27.0, i żadnego dla 27.1; xcodebuild -downloadPlatform iOS pod betą nazywa brakujący element „iOS 27.1 Simulator (24A94401)” i pobiera go jako obraz dysku cryptex przez usługę mobile assets Apple, podczas gdy obrazy dysków na samej stronie pobierania dla deweloperów kończą się na iOS 18.2 Simulator Runtime.34 Pierwsza próba zakończyła się komunikatem DVTDownloadable: Download Failed oraz Error Domain=DVTDownloadableErrorDomain Code=41 "Download failed."; druga, z -buildVersion 24A94401, podała rozmiar runtime’u jako 7,85 GB, dobiegła końca, a simctl list runtimes wymieniło następnie „iOS 27.1 (27.1 - 24A94401)”. Miejsce na dysku warto zarezerwować zawczasu: runtime jest czterokrotnie większy niż pobranie samego Xcode.3

Ekran zewnętrzny symulatora iPhone Duo przy pierwszym uruchomieniu, z systemem iOS 27.1 beta: ciemny ekran początkowy z ikoną Ustawień w lewym górnym rogu, zegar i wskaźnik Wi-Fi ułożone pionowo przy prawej krawędzi, kafelek Docka po prawej i przycisk Szukaj w prawym dolnym rogu

Ekran zewnętrzny symulatora iPhone Duo przy pierwszym uruchomieniu, 1398 na 2034 piksele: blok stanu biegnie wzdłuż prawej krawędzi, po tej stronie, na której Human Interface Guidelines Apple umieszczają Dynamic Island i pasek stanu w iPhone Duo.10

Czy SDK 27.1 ma API Duo?

17 września przeszukałem SDK iOS 27.0 pod kątem nazw z przewodnika Apple „Preparing your app for iPhone Duo” i nie znalazłem żadnej z dziesięciu specyficznych dla tego urządzenia. To samo przeszukanie SDK 27.1, wykonane tak samo, czyli zwykłym wyszukiwaniem tekstu w interfejsach modułów i nagłówkach, znajduje je wszystkie. Wiersze to szukane podciągi: siedem z nich obejmuje dziewięć z dziesięciu nazw, bo dwie metody reservedRegions dzielą jeden wiersz, podobnie jak dwie składowe axisBehavior, a pozostałe trzy to typy stojące za tymi nazwami: ReservedRegion, ToolbarVerticalBehavior dla toolbarVerticalBehavior(_:) i UIVerticalBarBehavior dla preferredVerticalBarBehavior:4

Szukany podciąg Interfejs SwiftUICore Interfejs SwiftUI Interfejs UIKit Nagłówki UIKit
ArrangementView 45 0 19 4 pliki
UIArrangementViewController 0 0 19 4 pliki
ReservedRegion 16 0 15 3 pliki
reservedRegions 2 0 5 1 plik
ToolbarVerticalBehavior 0 5 0 0
UIVerticalBarBehavior 0 0 0 1 plik
verticalBarEdge 0 0 0 1 plik
toolbarVerticalEdge 1 0 0 0
axisBehavior 0 2 0 1 plik
preferredVerticalBarBehavior 0 0 0 1 plik

Dwa szczegóły z tej tabeli mają znaczenie przy pisaniu kodu. Typy SwiftUI mieszkają w SwiftUICore, module reeksportowanym przez import SwiftUI, więc zwykły import je znajduje; a atrybuty dostępności nie zgadzają się z dokumentacją co do platform. Interfejs SwiftUICore deklaruje ArrangementView, a interfejs SwiftUI deklaruje toolbarVerticalBehavior(_:), oba pod @available(anyAppleOS 27.1, *), co jest skrótem Apple na wszystkie platformy w danej wersji, podczas gdy UIArrangementViewController.h oraz metody reservedRegionsOfKind: w UIView.h niosą API_AVAILABLE(ios(27.1), tvos(27.1), visionos(27.1)) razem z API_UNAVAILABLE(watchos); w UIVerticalBarEdge.h enum i cecha verticalBarEdge niosą tę samą parę, a przypadki Leading i Trailing niosą API_AVAILABLE(ios(27.1)) API_UNAVAILABLE(visionos) API_UNAVAILABLE(watchos, tvos). Strony dokumentacji Apple dla wszystkich pięciu wymieniają wyłącznie iOS 27.1 i iPadOS 27.1, oznaczone jako beta.47 Warto pisać pod iOS i pozwolić kompilatorowi opowiedzieć o reszcie.

Trzy nazwy używane przez przewodnik, które były już w SDK 27.0, pozostają bez zmian: presentationPlacement(_:) nadal siedzi pod @available(anyAppleOS 27.0, *), backgroundExtensionEffect() jest na miejscu od iOS 26, a z dwóch przypadków ToolbarItemPlacement wymienionych w przewodniku topBarPinnedTrailing leży pod @available(iOS 27.0, visionOS 27.0, *), natomiast cancellationAction nie niesie własnej dostępności poza tą, którą ma sam typ.4

Co profil symulatora mówi o dwóch ekranach?

Typ urządzenia, który Apple instaluje wraz z betą, iPhone Duo.simdevicetype, to zwyczajny bundle w katalogu /Library/Developer/CoreSimulator/Profiles/DeviceTypes, a jego dwie property lists odpowiadają na pytania pozostawione otwarte przez specyfikację.5

profile.plist podaje tożsamość: identyfikator modelu iPhone19,4, klasa produktu V68, alias com.apple.CoreSimulator.SimDeviceType.V68, minRuntimeVersion 27.1 oraz regułę tworzenia urządzenia domyślnie dla runtime’ów od 27.1 wzwyż. capabilities.plist podaje sprzęt: numer modelu A3447, HomeButtonType 2, DeviceSupportsDynamicIsland true, DeviceSupportsEnhancedMultitasking false, IsLargeFormatPhone true, CompatibleDeviceFallback ustawiony na iPhone18,3, promień narożnika urządzenia 59 oraz tablicę displays z dwoma wpisami wbudowanymi i trzema wirtualnymi.5

Ekran w profilu Piksele Skala Punkty Orientacja natywna Promienie narożników Przestrzeń barw
primary („LCD”, ekran 1) 1398 na 2034 3 466 na 678 0 8, 59, 8, 59 P3
primary-1 („LCD-1”, ekran 3) 2007 na 2853 3 669 na 951 270 55 we wszystkich czterech sRGB

Pierwszy wiersz to ekran zewnętrzny i zgadza się co do piksela ze specyfikacją Apple. Drugi to ekran wewnętrzny, a jego liczba pikseli odpowiada rozmiarowi zrzutu ekranu z App Store Connect, 2007 na 2853, a nie wymiarom panelu 1878 na 2670: symulator renderuje ekran wewnętrzny w 669 na 951 punktów przy skali 3x, czyli dokładnie tak, jak wyliczył to 10 września mój wpis o Duo dla deweloperów, opatrując wyliczenie etykietą wnioskowania. Teraz ten sam numer niesie własny profil Apple. Natywna orientacja 270 stopni mówi, że ekran wewnętrzny jest natywnie poziomy, 951 punktów szerokości na 669 wysokości przy otwartym telefonie, co zgadza się z wymiarami, jakie Apple podaje dla otwartego urządzenia. Dwie pozostałe liczby to wartości symulatora, a nie sprzętu: oba ekrany figurują jako 460 pikseli na cal i 60 Hz, podczas gdy specyfikacja daje panelowi wewnętrznemu 430 ppi, więc hdpi warto traktować jako wypełniacz.5

Profil niesie też kształty. Każdy ekran odwołuje się do maski framebuffera, czyli pliku PDF z obszarem widocznym. Maska ekranu zewnętrznego ma asymetryczne narożniki, wartości z profilu to 8 przy jednej długiej krawędzi i 59 przy drugiej, w moim odczycie mały promień wypada po stronie stykającej się z centralnym zawiasem opisanym w przewodniku projektowym Apple; maska ekranu wewnętrznego to zwykły zaokrąglony prostokąt z wartością narożnika 55 z profilu, bez wycięcia na przednią kamerę, więc przesłonięcie od kamery bierze się z API zarezerwowanych regionów w czasie działania, a nie z kształtu framebuffera.510

Co pokazuje symulator?

Urządzenie startuje zamknięte. Przy pierwszym uruchomieniu ekran zewnętrzny pokazuje ekran początkowy, a framebuffer wewnętrznego jest włączony, lecz czarny; simctl io enumerate wymienia oba wbudowane ekrany pod nazwami z profilu, primary jako 1398 na 2034 i primary-1 jako 2007 na 2853, obok zwykłych wirtualnych.6 Zainstalowałem jednoplikową sondę SwiftUI, która odczytuje geometrię, klasy rozmiaru, wartość środowiskową toolbarVerticalEdge oraz zarezerwowane regiony obu rodzajów z includeInactive, opakowuje ArrangementView w każdym z trzech stylów i umieszcza sześć elementów w nawigacyjnym pasku narzędzi.6

Aplikacja sondująca na ekranie zewnętrznym symulatora iPhone Duo: pasek narzędzi w prawym górnym rogu z ikoną udostępniania, wielokropkiem dodatkowych opcji i znakiem zaznaczenia, wartości rozmiar 386 na 510 punktów, klasy rozmiaru compact i regular, toolbarVerticalEdge nil, divisions 0 i occlusions 0, układ dzielony z widokiem podstawowym nad widokiem drugorzędnym oraz zegar i wskaźnik Wi-Fi ułożone przy prawej krawędzi

Sonda na ekranie zewnętrznym, poza Closed: 466 na 678 punktów, szerokość compact, układ dzielony jeden nad drugim, pasek narzędzi poziomy.

W pozie Closed sonda raportuje to, co raportuje kompaktowy iPhone. UIScreen.main.bounds daje 466 na 678 punktów przy skali 3, klasy rozmiaru to compact dla szerokości i regular dla wysokości, toolbarVerticalEdge jest nil, cecha verticalBarEdge z UIKit czyta się jako wartość surowa 0, a oba zapytania o zarezerwowane regiony zwracają puste tablice nawet z regionami nieaktywnymi, więc poza zamknięta nie udostępnia aplikacji ani zgięcia, ani kamery. GeometryReader wewnątrz stosu nawigacji zmierzył 386 na 510 punktów, z wcięciami obszaru bezpiecznego 134 u góry i 34 u dołu, bez wcięć po bokach; w moim odczycie te 80 punktów szerokości, które zatrzymał system, to listwa po prawej, gdzie siedzi blok stanu. Układ dzielony umieścił widok podstawowy nad drugorzędnym, czyli w wariancie wyższym niż szerszym, opisanym w przewodniku Apple, a pasek narzędzi narysował się poziomo u góry: Share i przycisk Done ze znakiem zaznaczenia obok przycisku dodatkowych opcji, przy czym czterech akcji drugorzędnych na pasku nie ma i, sądząc po ich placemencie, siedzą w jego menu.67

Pozy mieszkają w Device Hub. Po zaznaczeniu urządzenia Duo jego okno udostępnia Rotate Right, Closed, Book i Open jako przyciski, które potrafi nacisnąć API dostępności, i tak właśnie sterowana była reszta tej sekcji.6

Open przenosi aplikację na ekran wewnętrzny w jego natywnej orientacji poziomej. Sonda raportuje szerokość regular i wysokość regular, GeometryReader mierzy 803 na 515 punktów z wcięciami obszaru bezpiecznego 134 u góry, po 34 z każdej strony i 20 u dołu, a szerokości brakuje tych samych 80 punktów co w pozie zamkniętej, w moim odczycie znów listwy, tym razem po prawej stronie ekranu o szerokości 951 punktów, z blokiem stanu w środku. Układ dzielony stawia widok podstawowy i drugorzędny obok siebie, czyli w wariancie szerszym niż wyższym z przewodnika Apple, a pasek narzędzi rysuje się poziomo w prawym górnym rogu, znowu Share i Done obok przycisku dodatkowych opcji, z czterema akcjami drugorzędnymi nieobecnymi na pasku.6

Aplikacja sondująca na ekranie wewnętrznym symulatora iPhone Duo w pozie Open, poziomo: rozmiar 803 na 515 punktów, klasy rozmiaru regular i regular, toolbarVerticalEdge nil, divisions 0 i occlusions 0, układ dzielony z widokiem podstawowym i drugorzędnym obok siebie, pasek narzędzi w prawym górnym rogu oraz zegar i wskaźnik Wi-Fi w czarnej listwie przy prawej krawędzi

Poza Open, ekran wewnętrzny, 2853 na 2007 pikseli: regularny w obu wymiarach, układ dzielony obok siebie, listwa po prawej.

Rotate Right ustawia ekran wewnętrzny pionowo. Sonda mierzy wtedy 669 na 703 punkty, regularna w obu wymiarach, z wcięciami 134 u góry i 34 u dołu, bez wcięć po bokach; w moim odczycie listwa o szerokości 80 punktów przeniosła się na górną krawędź, gdzie blok stanu siedzi teraz w czarnym pasie, a układ dzielony pozostaje obok siebie, mimo że kontener jest teraz wyższy niż szerszy.6

Aplikacja sondująca na ekranie wewnętrznym symulatora iPhone Duo obróconym do pionu: rozmiar 669 na 703 punkty, klasy rozmiaru regular i regular, układ dzielony wciąż obok siebie oraz zegar i wskaźnik Wi-Fi w czarnym pasie przez całą górę

Ekran wewnętrzny po obrocie: 669 punktów szerokości, nadal regularny w obu osiach, listwa przez całą górę.

Book, poza częściowo złożona, to miejsce, w którym API zarezerwowanych regionów powinno zarobić na siebie, a w tej becie z moją sondą tego nie zrobiło. Bez żadnej aplikacji na pierwszym planie ekran wewnętrzny po naciśnięciu Book pokazywał ekran początkowy; po ponownym uruchomieniu sonda raportowała dokładnie to samo co w pozie Open, 803 na 515 punktów, regularna w obu wymiarach, zero divisions i zero occlusions z regionami nieaktywnymi włącznie, i to zarówno w SwiftUI, jak i w UIKit. Poza zamknięta również raportuje zero. Nie znalazłem pozy, w której reservedRegions zwróciłoby zgięcie albo kamerę, więc układu dopasowującego się do zgięcia symulator tej bety nie pozwolił mi zobaczyć; przewodnik Apple opisuje podział jako aktywny „when iPhone Duo is partially open,” (gdy iPhone Duo jest częściowo otwarty), a to, czy jest to luka bety, czy luka mojej sondy, zostaje pytaniem na kolejną betę.67

Dwie rzeczy utrzymały się w każdej pozie. Pasek narzędzi nigdy nie narysował się pionowo: toolbarVerticalEdge było nil w SwiftUI, a verticalBarEdge czytało się jako wartość surowa 0 w UIKit, zamknięte, otwarte i obrócone, więc pionowe paski opisane w przewodniku Apple nie pojawiły się dla paska narzędzi stosu nawigacji w tej becie. A UIScreen.main.bounds odpowiadało 466 na 678 punktów, czyli ekranem zewnętrznym, gdy aplikacja stała na wewnętrznym, i jest to dokładnie ta pułapka, przed którą ostrzega przewodnik Apple, pisząc, że obliczenia układu należy opierać „based on your scene or containing view’s bounds rather than screen dimensions” (na wymiarach własnej sceny albo widoku nadrzędnego, a nie na wymiarach ekranu): ekran główny to nie ekran, na którym się jest. Kompilator już przy budowaniu sondy mówi 'main' was deprecated in iOS 26.0, a to urządzenie jest tego powodem.67

Jedna droga do pozostałych póz nie działa. simctl io screenConfig potrafi wyłączyć zasilanie ekranu, ale wyłączenie ekranu zewnętrznego przy włączonym wewnętrznym nie otworzyło telefonu; położyło system shell symulatora, simctl launch zawiodło potem z komunikatem „The system shell probably crashed,” (prawdopodobnie system shell się wywrócił) i konieczny był restart. Pozy mieszkają w oknie Device Hub.6

Czego ta beta jeszcze nie potrafi

Apple wymienia trzy ograniczenia w sekcji Simulator, Known Issues (znane problemy), we własnych notach bety: „Initial Simulator launch can take several minutes.” (187708500), „StandBy is unavailable in the iPhone Duo Simulator runtime.” (187708663) oraz „Running and debugging most app extensions is unavailable in the iPhone Duo Simulator runtime.” (187708767).2 To o StandBy ma znaczenie dla każdego, kto ma widżety albo Live Activities pomyślane pod ten tryb: ogłoszenie Apple mówi, że telefon „enters StandBy on either the outer or inner display” (wchodzi w StandBy na ekranie zewnętrznym albo wewnętrznym) i nazywa go „hub for widgets” (centrum widżetów), wpis o Duo dla deweloperów opisuje, co się tam pojawia, a dopóki późniejsza beta nie zdejmie ograniczenia, StandBy na tym urządzeniu trzeba sprawdzać na sprzęcie.11

Dwa kolejne siedzą w sekcji Mac Catalyst, Known Issues, i gryzą każdą aplikację, która przyjmuje te API i buduje się również na Maca: „Projects that use APIs specific to iOS 27.1 show compile errors when building for Mac Catalyst (“undeclared identifier”, “not found”, “has no member”, “cannot find”, etc). (185924957)” (projekty używające API specyficznych dla iOS 27.1 pokazują błędy kompilacji przy budowaniu na Mac Catalyst), z obejściem Apple w postaci #if !targetEnvironment(macCatalyst) w Swift albo #if !TARGET_OS_MACCATALYST w Objective-C, oraz „Projects that target iOS 27.1 show no Mac Catalyst run destination available. (187046347)” (projekty celujące w iOS 27.1 nie pokazują żadnego celu uruchomienia Mac Catalyst), gdzie obejściem jest „Add a Mac Catalyst 27.0 minimum deployment in target settings.”2 Noty bety Xcode 27.2 dokładają trzeci problem z przeciwnej strony: „macOS, watchOS, tvOS, and visionOS SDKs in Xcode 27.2 incorrectly report 27.1 as a valid deployment target,” oraz „Mac Catalyst builds with a 27.1 or 27.2 deployment target may be unable to use newly introduced API.” (187160501), czyli te SDK błędnie raportują 27.1 jako prawidłowy deployment target, a kompilacje Mac Catalyst z deployment targetem 27.1 lub 27.2 mogą nie móc użyć świeżo wprowadzonego API.8

Co zrobiłbym w tym tygodniu

  1. Zainstalować betę obok Xcode 27.0, a nie na nim: rozpakować xip, zmienić nazwę aplikacji i wskazać na nią DEVELOPER_DIR przy kompilacjach z linii poleceń; nic w notach bety nie rusza toolchainu 27.0, a kompilator i linker niosą identyczne ciągi wersji.4
  2. Uruchomić pobieranie runtime’u zanim będzie potrzebny, poleceniem xcodebuild -downloadPlatform iOS pod betą, i ponowić próbę przy niepowodzeniu; to runtime sprawia, że typ urządzenia iPhone Duo daje się w ogóle uruchomić, a Apple ostrzega, że pierwszy start zajmuje do tego kilka minut.23
  3. Zbudować projekt raz przeciwko SDK 27.1 z włączonym targetem Mac Catalyst i przeczytać dwie diagnostyki wymienione przez Apple, zanim zapadnie decyzja, czy odgrodzić nowe API przez #if !targetEnvironment(macCatalyst), czy podnieść minimum Catalyst do 27.0.2
  4. Traktować liczby z profilu jako rozmiary, na których się podgląda i testuje: 466 na 678 punktów w stanie zamkniętym, 669 na 951 w otwartym, przy natywnie poziomym ekranie wewnętrznym. Nota Previews w tej becie dorzuca grupę Display do selektora nadpisań canvasu „for previewing content on a device’s alternative display.” (182598534), czyli do podglądania treści na alternatywnym ekranie urządzenia.25
  5. Logować zarezerwowane regiony dla każdej pozy w trakcie prac: reservedRegions(kind:options:layoutDirectionBehavior:) z .includeInactive jest udokumentowane jako zwracające zgięcie i kamerę w postaci wartości ReservedRegion, które mogą być aktywne albo nieaktywne; w tej becie każda poza zwracała pustkę, więc linia logu w onChange(of: proxy.size) podpowie moment, w którym któraś poza zacznie je raportować.67

Często zadawane pytania

Czy symulator iPhone Duo jest w Xcode 27.1 beta?

Tak. Beta instaluje typ urządzenia iPhone Duo, com.apple.CoreSimulator.SimDeviceType.iPhone-Duo, którego profil wymaga runtime’u iOS 27.1 pobieranego osobno przez xcodebuild -downloadPlatform iOS. Noty Apple ostrzegają, że pierwsze uruchomienie „can take several minutes” (może zająć kilka minut) i że w tym runtimie niedostępne są StandBy oraz większość rozszerzeń aplikacji.235

Jak zainstalować Xcode 27.1 beta obok Xcode 27?

Rozpakować xip poleceniem xip --expand, przenieść powstałą aplikację pod nazwę z wersją, na przykład /Applications/Xcode-27.1-beta.app, i ustawić DEVELOPER_DIR na jej katalog Contents/Developer dla xcodebuild, xcrun i swiftc. Beta wymaga macOS Tahoe 26.6 lub nowszego, czyli tego samego progu co Xcode 27.0.24

Jaki rozmiar ma ekran wewnętrzny iPhone Duo w punktach?

669 na 951 punktów, zgodnie z profilem urządzenia w symulatorze, który definiuje ekran wewnętrzny jako 2007 na 2853 piksele przy skali 3 i natywnej orientacji poziomej; ekran zewnętrzny ma 466 na 678 punktów z 1398 na 2034 pikseli przy skali 3.5

Czy Xcode 27.1 beta zmienia SDK iOS 27.0 albo toolchain Xcode 27?

Nie. Kompilator Swift i linker raportują te same ciągi wersji co Xcode 27.0, a noty wydania bety mają trzy sekcje, Mac Catalyst, Previews i Simulator, z których żadna nie dotyka toolchainu. SDK iOS 27.1 jest dodatkiem, identyfikowanym jako kompilacja 24A94403 zarówno w SDK urządzenia, jak i symulatora.24

Kiedy iPhone Duo trafia do sprzedaży i z czym?

23 października, z iOS 27.1, zgodnie z wpisem prasowym Apple z 16 września: „When iPhone Duo becomes available on October 23, it will run iOS 27.1.” (gdy iPhone Duo będzie dostępny 23 października, będzie działał na iOS 27.1).9

Źródła


  1. Apple, Releases, kanał RSS pobrany 19 września 2026 roku: „Xcode 27.1 beta (27A9269)” z datą Fri, 18 Sep 2026 10:00:00 PDT oraz „TestFlight Update” z datą Fri, 18 Sep 2026 14:00:00 PDT. Apple, App Store Connect release notes, 18 września 2026, aktualizacja TestFlight, cytowana w całości. 

  2. Apple, Xcode 27.1 Beta Release Notes, pobrane przez endpoint JSON dokumentacji 19 września 2026 roku: Overview, cytowane; Mac Catalyst, Known Issues 185924957 i 187046347 wraz z obejściami, cytowane; Previews, New Features 182598534, cytowane; Simulator, Known Issues 187708500, 187708663 i 187708767, cytowane. Noty nie zawierają żadnych innych sekcji. 

  3. Pobranie runtime’u wykonane przez autora na macOS 26.6.2 (25G83) 19 września 2026 roku, z DEVELOPER_DIR ustawionym na Xcode 27.1 beta: xcodebuild -downloadPlatform iOS wypisało „iOS is already downloaded.” dla zainstalowanego runtime’u 27.0, a następnie „Downloading iOS 27.1 Simulator (24A94401) (arm64)”, po czym DVTDownloadable: Download Failed. Downloadable: DVTDownloadable(identifier: 0a4e7582-0061-5907-bea9-fe234c1f9392, version: 27.1.0.1, category: simulator, contentType: cryptexDiskImage, downloadMethod: mobileAsset, platform: com.apple.platform.iphoneos) oraz Error Domain=DVTDownloadableErrorDomain Code=41 "Download failed."; ponowna próba, xcodebuild -downloadPlatform iOS -buildVersion 24A94401, wypisała „Downloading iOS 27.1 Simulator (24A94401) (arm64): 0.0% (66 kB of 7.85 GB)” i zakończyła się powodzeniem, po czym xcrun simctl list runtimes wymieniło „iOS 27.1 (27.1 - 24A94401) - com.apple.CoreSimulator.SimRuntime.iOS-27-1”. Strona pobierania dla deweloperów Apple, przeszukana pod kątem frazy „Simulator Runtime” po zalogowaniu tego samego dnia, wymienia obrazy dysków nie nowsze niż iOS 18.2 Simulator Runtime. 

  4. Inspekcja /Applications/Xcode-27.1-beta.app wykonana przez autora 19 września 2026 roku: xcodebuild -version wypisuje Xcode 27.1 i Build version 27A9269; xcrun --sdk iphoneos --show-sdk-version oraz xcrun --sdk iphonesimulator --show-sdk-version wypisują oba 27.1; SystemVersion.plist w obu SDK niesie ProductBuildVersion 24A94403 i ProductVersion 27.1; xcrun swift --version wypisuje Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1), a xcrun ld -v wypisuje ld-27037.1, czyli te same ciągi wersji, które na tym samym Macu wypisuje Xcode 27.0 (27A266a). Xcode_27.1_beta.xip waży 2 027 292 809 bajtów; pkgutil --check-signature raportuje „signed Apple Software” z łańcuchem certyfikatów Software Update; du -sk na rozpakowanej aplikacji raportuje 3 813 336 KB wobec 3 804 188 KB dla Xcode 27.0 (27A266a) rozpakowanego w /Applications/Xcode-27.app. Liczby nazw pochodzą z grep -c dla danego podciągu w plikach SwiftUICore.swiftmodule/arm64e-apple-ios.swiftinterface, SwiftUI.swiftmodule/arm64e-apple-ios.swiftinterface i UIKit.swiftmodule/arm64e-apple-ios.swiftinterface w SDK iPhoneOS oraz z liczby plików z grep -rl w UIKit.framework/Headers; atrybuty dostępności odczytane z tych plików: @available(anyAppleOS 27.1, *) nad public struct ArrangementView< w interfejsie SwiftUICore i nad extension SwiftUICore.View, które deklaruje func toolbarVerticalBehavior w interfejsie SwiftUI, API_AVAILABLE(ios(27.1), tvos(27.1), visionos(27.1)) z następującym po nim API_UNAVAILABLE(watchos) w UIArrangementViewController.h, przy obu deklaracjach reservedRegionsOfKind: w UIView.h oraz przy enumie UIVerticalBarEdge i cesze verticalBarEdge, a także API_AVAILABLE(ios(27.1)) API_UNAVAILABLE(visionos) API_UNAVAILABLE(watchos, tvos) przy jego przypadkach UIVerticalBarEdgeLeading i UIVerticalBarEdgeTrailing; @available(anyAppleOS 27.0, *) nad func presentationPlacement; @available(iOS 27.0, visionOS 27.0, *) nad public static let topBarPinnedTrailing i brak atrybutu nad public static let cancellationAction. Pierwsze uruchomienie: pierwsze xcodebuild -version pod DEVELOPER_DIR bety przekroczyło dwuminutowy limit czasu, a /var/log/install.log odnotowuje xcodebuild kolejkujący instalację PackageKit o 16:01:54 dnia 19 września, która wypakowała CoreTypes.pkg i XcodeSystemResources.pkg z Xcode-27.1-beta.app/Contents/Resources/Packages i zakończyła się o 16:03:04; xcodebuild -checkFirstLaunchStatus zwróciło następnie 0. 

  5. /Library/Developer/CoreSimulator/Profiles/DeviceTypes/iPhone Duo.simdevicetype, zainstalowany przez Xcode 27.1 beta i odczytany poleceniem plutil -convert xml1 19 września 2026 roku. profile.plist: modelIdentifier iPhone19,4, productClass V68, aliases com.apple.CoreSimulator.SimDeviceType.V68, minRuntimeVersion 27.1, createByDefaultForRuntimeVersions versionMin 27.1. capabilities.plist: ModelNumber A3447, ThinningProductType iPhone19,4, CompatibleDeviceFallback iPhone18,3, DeviceCornerRadius 59, HomeButtonType 2, DeviceSupportsDynamicIsland true, DeviceSupportsEnhancedMultitasking false, IsLargeFormatPhone true; ScreenDimensionsCapability main-screen-width 1398, main-screen-height 2034, main-screen-pitch 460, main-screen-scale 3; displays: primary (displayName LCD, screenID 1, width 1398, height 2034, scale 3, hdpi i vdpi 460, refreshRate 60, nativeOrientation 0, cornerRadiusUL 8, UR 59, LL 8, LR 59, colorspace P3) oraz primary-1 (displayName LCD-1, screenID 3, width 2007, height 2853, scale 3, hdpi i vdpi 460, refreshRate 60, nativeOrientation 270, wszystkie cztery promienie narożników 55, colorspace sRGB), a do tego external-0 (TVOut), wireless0 (carPlay) i resizable (scene). Oba pliki PDF wskazane przez framebufferMaskIdentifier wyrenderowano poleceniem qlmanage i obejrzano; dane ze specyfikacji Apple dla paneli znajdują się we wpisie o Duo dla deweloperów. xcrun simctl list devicetypes pod betą wymienia „iPhone Duo (com.apple.CoreSimulator.SimDeviceType.iPhone-Duo)”. 

  6. Uruchomienia autora na macOS 26.6.2 (25G83), 19 i 20 września 2026 roku. Urządzenie: simctl create "Duo-27.1" com.apple.CoreSimulator.SimDeviceType.iPhone-Duo com.apple.CoreSimulator.SimRuntime.iOS-27-1, wystartowane przez simctl boot i simctl bootstatus -b (na tym Macu około minuty); simctl io <udid> enumerate wymienia dwa porty com.apple.framebuffer.display klasy ekranu 0 o wymiarach 1398 na 2034 i 2007 na 2853 oraz, w sekcji Connected Screens, „LCD-1” z nazwą urządzenia primary-1, screen ID 3, rozmiarem w pikselach {2007, 2853}. Sonda: DuoProbe, jednoplikowa aplikacja SwiftUI zbudowana poleceniem xcrun swiftc -sdk <iPhoneSimulator.sdk> -target arm64-apple-ios27.1-simulator -parse-as-library pod Xcode 27.1 beta, zainstalowana przez simctl install, uruchomiona przez simctl launch --console-pty, zrzuty ekranu przez simctl io <udid> screenshot --mask=alpha --display=primary i --display=primary-1. Linie konsoli dla pozy zamkniętej: DUOPROBE screen=(466.0, 678.0) scale=3.0 idiom=0 model=iPhone name=Duo-27.1; DUOPROBE size=386x510 h=compact v=regular verticalEdge=nil safe=EdgeInsets(top: 134.0, leading: 0.0, bottom: 34.0, trailing: 0.0); DUOPROBE uikit bounds=(354.0, 44.0) divisions=0 occlusions=0 verticalBarEdge=UIVerticalBarEdge(rawValue: 0); żadnej linii division[ ani occlusion[. Zrzut z --display=primary-1 jest czarny. Zasilanie ekranu: simctl io <udid> screenConfig --display=primary power off wypisało „Screen 1 power state set to off”; kolejne simctl launch zawiodło z FBSOpenApplicationServiceErrorDomain kod 5, „The system shell probably crashed.”; simctl shutdown i boot przywróciły urządzenie. Przebiegi póz 20 września odbyły się w dwóch seriach, obie naciskały Rotate Right, Closed, Book i Open przez API dostępności akcją AXPress na przyciskach, które Device Hub udostępnia dla zaznaczonego urządzenia, i obie były sterowane narzędziem wiersza poleceń simctl z bety 27.2 oraz DEVELOPER_DIR, który ustawiają tamte skrypty, przeciwko runtime’owi, typowi urządzenia i Device Hubowi z bety 27.1. W pierwszej serii sonda z poprzedniej pozy wciąż działała w chwili naciśnięcia kolejnego przycisku, po czym była zamykana i uruchamiana ponownie, z konsolą nagrywaną przez dwanaście sekund i zrzutami obu ekranów; stamtąd pochodzą powyższe odczyty po obrocie oraz linie przejściowe. W drugiej serii sonda była zamykana po każdym zrzucie, więc w chwili naciśnięcia kolejnego przycisku żadna aplikacja nie była na pierwszym planie; stamtąd pochodzą zrzuty sprzed ponownego uruchomienia. Open: DUOPROBE size=803x515 h=regular v=regular verticalEdge=nil safe=EdgeInsets(top: 134.0, leading: 34.0, bottom: 20.0, trailing: 34.0), DUOPROBE uikit bounds=(771.0, 44.0) divisions=0 occlusions=0 verticalBarEdge=UIVerticalBarEdge(rawValue: 0) oraz DUOPROBE screen=(466.0, 678.0); zrzut z --display=primary-1 pokazuje sondę, a --display=primary jest czarny. Book: te same trzy linie po ponownym uruchomieniu; zrzut ekranu wewnętrznego wykonany po naciśnięciu i przed ponownym uruchomieniem, bez żadnej działającej aplikacji, pokazuje ekran początkowy. Closed: powyższe linie pozy zamkniętej. Po Rotate Right, Open: DUOPROBE size=669x703 h=regular v=regular verticalEdge=nil safe=EdgeInsets(top: 134.0, leading: 0.0, bottom: 34.0, trailing: 0.0) oraz uikit bounds=(637.0, 44.0), ze zrzutem ekranu wewnętrznego w pionie. Żaden przebieg nie wypisał linii division[ ani occlusion[. Zamknięty stan po obrocie pojawił się wyłącznie jako linie przejściowe w trakcie zmiany pozy, DUOPROBE size=610x232 h=compact v=compact ... screen=(678.0, 466.0), i nie jest liczony powyżej. 

  7. Apple, JSON dokumentacji pobrany 19 września 2026 roku dla ArrangementView, UIArrangementViewController, reservedRegions(kind:options:layoutDirectionBehavior:), reservedRegions(kind:options:) i toolbarVerticalBehavior(_:): dostępność platform na każdej ze stron podaje iOS 27.1 i iPadOS 27.1, oznaczone jako beta. Apple, Preparing your app for iPhone Duo, pobrane tego samego dnia, dla nazw używanych w przewodniku. 

  8. Apple, Xcode 27.2 Beta Release Notes, pobrane 19 września 2026 roku, SDK, Known Issues, 187160501, cytowane. 

  9. Apple, „Get ready with the latest beta releases”, aktualności, 16 września 2026, „Note about iOS 27.1 and iPhone Duo”, cytowane. 

  10. Apple, Designing for iPhone Duo, Human Interface Guidelines, pobrane przez endpoint JSON dokumentacji 20 września 2026 roku: „Controls on the side include both system and app elements: the Dynamic Island, the status bar, the toolbar (including navigation buttons), and the tab bar.” (elementy sterujące z boku obejmują zarówno części systemu, jak i aplikacji: Dynamic Island, pasek stanu, pasek narzędzi wraz z przyciskami nawigacji oraz pasek kart) i „A hinge in the center lets people open and close the device” (zawias pośrodku pozwala otwierać i zamykać urządzenie). 

  11. Apple Newsroom, Apple unveils iPhone Duo, 9 września 2026, pobrane 20 września 2026 roku: „Set iPhone Duo down and it enters StandBy on either the outer or inner display” oraz „hub for widgets”, cytowane z akapitu o StandBy. 

Powiązane artykuły

arm64e.x1: wycinek Apple ze sprawdzaną arytmetyką wskaźników

Informacje o wydaniu iOS 27 RC dodają arm64e.x1: sprawdzaną arytmetykę wskaźników (CPA2) na A20 Pro, M6 i S11. Co emituj…

14 min czytania

Uwagi do wydania iOS 27.0: wycofania, zmiany łamiące i poprawki

iOS 27.0 (24A437) ukazał się 14 września. Uwagi czytane okiem dewelopera: 11 wycofań, co uruchamia się przy budowaniu z …

29 min czytania

Projektowanie dla iPhone'a Duo: co się przesuwa, co się dzieli, a co zostaje

Przewodnik projektowy Apple dla iPhone'a Duo i trzy Tech Talki odczytane jako zbiór reguł: dwie klasy rozmiaru zamiast u…

17 min czytania