Xcode 27 już dostępny: wymagania, minimalne wersje docelowe i co się zepsuło
Xcode 27 ukazał się 14 września 2026 roku jako kompilacja 27A266a, trzy dni po wpisie „iOS 27.0 RC” w kanale wydań i równolegle z iOS 27.0 (24A437), macOS 27.0 (26A428) oraz resztą platform 27; tego samego dnia App Store Connect zaczął przyjmować kompilacje zbudowane z finalnymi SDK 27.0 (GA), po tym jak od 9 września przyjmował kompilacje z SDK RC.15 Wymaga macOS Tahoe 26.6 lub nowszego oraz Maca z Apple silicon, zawiera Swift 6.4 i SDK 27, debuguje urządzenia z iOS 17 lub nowszym i podnosi trzy minimalne wersje docelowe: macOS 12, watchOS 9 i DriverKit 21.23 Istniejącym projektom przynosi trzy twarde błędy (makro @State, niezgodność źródłową z SE-0508 i flagę linkera -ld64), jedną regułę skanowania zależności, która może zgłosić błąd, jedną cichą zmianę w ARCHS_STANDARD i dwa ostrzeżenia; poniżej uruchamiam na 27A266a wszystko poza regułą skanowania.246
{.answer-block}
TL;DR
- Daty i kompilacje. Kanał wydań Apple wymienia Xcode 27 (27A266a) i wszystkie sześć systemów 27.0 pod datą poniedziałku 14 września; wpis „iOS 27.0 RC (24A437)” nosi datę piątku 11 września, dwa dni po tym, jak App Store Connect zaczął przyjmować przesyłki z SDK RC, a wersja GA ma ten sam numer kompilacji.15 Własne noty wydania App Store Connect z 14 września mówią, że można już przesyłać aplikacje zbudowane w Xcode 27 zarówno do sklepu, jak i do TestFlight.5
- Wymagania i progi poszły w górę. Xcode 26.6 działał na macOS 26.2 i debugował urządzenia z iOS 15; Xcode 27 potrzebuje macOS 26.6, działa wyłącznie na Apple silicon i debuguje iOS 17, tvOS 17 oraz watchOS 10 lub nowsze, zarówno w symulatorze, jak i na sprzęcie. Minimalne wersje docelowe rosną z macOS 11 do 12, z watchOS 8 do 9 i z DriverKit 20 do 21; iOS, iPadOS i tvOS zostają na 15, a visionOS na 1.23
- Trzy twarde błędy. Makro
@State: własny przykład Apple, inicjalizator przypisujący właściwość@Statez wartością nadaną w deklaracji przed pozostałymi właściwościami przechowywanymi, kończy się błędemvariable 'self.title' used before being initialized; właściwość obliczana z literałem tablicy lub słownika jako wartością początkową i akcesoreminitnie kompiluje się, gdy getter stoi pierwszy, co Apple przypisuje SE-0508 jako niezgodność źródłową; a flaga linkera-ld64, udokumentowana w Xcode 15, przerywa linkowanie błędemld: library 'd64' not found.2468 - Cztery zmiany, które ostrzegają, mogą zgłosić błąd albo milczą. Linker ignoruje
-ld_classicz ostrzeżeniem, bo ld64 zniknął; zduplikowane nazwy modułów Clang w obrębie jednego skanowania zależności „may report an error” (mogą zgłosić błąd); target wyłącznie dla macOS ustawiony na 27.0 buduje tylko arm64, dopóki nie doda się z powrotem x86_64, i nic nie ostrzega; aPreviewProvidernosi oznaczenie przestarzałości od 27.0 z komunikatem „Use #Preview instead.”, podczas gdy każdy modyfikator podglądu ma własny komunikat o zamienniku, a kompilator nie pokazuje żadnego z nich poniżej deployment target 27.0.24 - Apple nie wydało Xcode 27.1 według stanu na 15 września. Nie wymienia go ani kanał wydań, ani indeks not wydania, a strona Apple dla deweloperów iPhone Duo wciąż datuje betę 27.1 na „later this month” (jeszcze w tym miesiącu); luka SDK opisana w moim wpisie o Duo dla deweloperów nadal istnieje.1
Co ukazało się 14 września?
| Element | Kompilacja | Data w kanale |
|---|---|---|
| Xcode 27 | 27A266a | pon. 14 wrz 2026 |
| iOS 27.0 / iPadOS 27.0 | 24A437 | pon. 14 wrz; wpis „iOS 27.0 RC (24A437)” w kanale nosi datę pt. 11 wrz, a App Store Connect przyjmował przesyłki z SDK RC od śr. 9 wrz |
| macOS 27.0 | 26A428 | pon. 14 wrz |
| tvOS 27.0 | 24J361 | pon. 14 wrz |
| visionOS 27.0 | 24M362 | pon. 14 wrz |
| watchOS 27.0 | 24R364 | pon. 14 wrz |
| App Store Connect | „You can now upload apps built with Xcode 27 using the SDK for iOS 27.0, iPadOS 27.0, macOS 27.0, tvOS 27.0, visionOS 27.0, and watchOS 27.0 for the App Store, and for internal and external testing through TestFlight.” (Można już przesyłać aplikacje zbudowane w Xcode 27 z SDK 27.0 do App Store oraz do testów wewnętrznych i zewnętrznych w TestFlight.) | 14 wrz |
Sekcja Overview not wydania brzmi: „Xcode 27 includes Swift 6.4 and SDKs for iOS 27, iPadOS 27, tvOS 27, watchOS 27, macOS 27, and visionOS 27. Xcode 27 supports on-device debugging in iOS 17 and later, tvOS 17 and later, watchOS 10 and later, and visionOS. Xcode 27 requires a Mac running macOS Tahoe 26.6 or later.” (Xcode 27 zawiera Swift 6.4 i SDK 27, debuguje na urządzeniu od iOS 17, tvOS 17 i watchOS 10 i wymaga Maca z macOS Tahoe 26.6 lub nowszym.)2 Na tym Macu xcodebuild -version wypisuje Xcode 27.0 Build version 27A266a, a swift --version wypisuje Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1).4
Czego wymaga Xcode 27 w porównaniu z 26.6?
Tabela zgodności Apple to dokument, który warto sprawdzić przed aktualizacją maszyny budującej. Oba wiersze obok siebie:3
| Xcode 26.6 | Xcode 27 | |
|---|---|---|
| macOS do uruchomienia | Tahoe 26.2 do 26.x | Tahoe 26.6 lub nowszy, wyłącznie Apple silicon2 |
| SDK | iOS, tvOS, watchOS, visionOS, macOS 26.5; DriverKit 25.5 | iOS, tvOS, watchOS, visionOS, macOS 27; DriverKit 27 |
| Minimalne wersje docelowe | iOS 15, tvOS 15, watchOS 8, visionOS 1, macOS 11, DriverKit 20 | iOS 15, tvOS 15, watchOS 9, visionOS 1, macOS 12, DriverKit 21 |
| Urządzenia do debugowania | iOS 15, tvOS 15, watchOS 8, visionOS 1 lub nowsze | iOS 17, tvOS 17, watchOS 10, visionOS 1 lub nowsze |
| Symulatory | iOS 15, tvOS 15, watchOS 8, visionOS 1 lub nowsze | iOS 17, tvOS 17, watchOS 10, visionOS 1 lub nowsze |
| Kompilator Swift | 6.3 | 6.4 (tryby języka 6, 5, 4.2 i 4) |
Za tymi wierszami kryją się dwie konsekwencje. Instruments odrzuca teraz urządzenia starsze niż iOS 17, watchOS 10 lub tvOS 17, więc stanowisko do profilowania zbudowane na starym iPhonie przestaje działać, zanim dojdzie do jakiegokolwiek kodu aplikacji.2 A interakcje klawiatury i wskaźnika w Device Hub Apple ogranicza jednym zdaniem: „only supported on the following OS versions and newer: macOS 15.0, iOS 18.0, tvOS 18.0, watchOS 11.0, visionOS 2.0.” (obsługiwane tylko w tych wersjach systemów lub nowszych).2
Wymóg Apple silicon nie ma obejścia dla Maca, na którym uruchamia się Xcode, i nie jest nowością dla nikogo, kto w lipcu czytał wpis o Intelu; noty GA zachowują lipcowe sformułowanie w całości: „Xcode 27 will only install and run on Apple silicon Macs. The macOS 27 SDK supports back deploying Universal (Intel and Apple Silicon) apps to macOS 12 and later. Intel development is still possible with macOS versions that support Rosetta like macOS 27.” (Xcode 27 instaluje się i działa wyłącznie na Macach z Apple silicon; SDK macOS 27 pozwala wdrażać aplikacje Universal wstecz aż do macOS 12; rozwój dla Intela pozostaje możliwy na wersjach macOS obsługujących Rosettę, takich jak macOS 27.)2 Trzecie zdanie to obejście dla Maców, na które się dostarcza, a nie dla tego, na którym się buduje.
Co zmieniło się w łańcuchu narzędzi?
Linker. Noty GA ujmują to w jednym zdaniu: „The ld64 linker has been removed and the -ld_classic option is no longer supported.” (linker ld64 został usunięty, a opcja -ld_classic nie jest już obsługiwana).2 Tak to wygląda na 27A266a: katalog usr/bin łańcucha narzędzi zawiera jeden binarny linker, ld, który przedstawia się jako ld-27037.1 zbudowany 25 sierpnia 2026 roku. Podanie starej flagi nie przerywa linkowania. Przy hello.c z jedną linią int main(void){return 0;} polecenie clang hello.o -o hello_classic -Xlinker -ld_classic wypisuje ld: warning: -ld_classic is no longer supported and will be ignored, kończy się kodem 0 i zapisuje plik wykonywalny. Druga pisownia, którą Apple udokumentowało w Xcode 15, -ld64, wypada gorzej:8 clang hello.c -o hello_ld64 -Wl,-ld64 kończy się błędem ld: library 'd64' not found i kodem 1, bo nowy linker czyta -ld64 jako -l d64, czyli żądanie biblioteki o nazwie d64.4 Projekt, który ma -ld_classic w OTHER_LDFLAGS, buduje się więc dalej, z nowym ostrzeżeniem przy każdym linkowaniu, a wszystko, co zyskiwał dzięki staremu linkerowi, przepadło; projekt z -ld64 przestaje się linkować, z błędem, który nigdy nie wymienia linkera z nazwy. Mój wpis o ld64 sprawdza, skąd wzięły się te flagi, i dokumentuje oba przebiegi.
Domyślne architektury. Sekcja Intel Deprecation formułuje regułę: „Build targets with a min deployment target set to macOS 27.0 or DriverKit 27.0 will not build Universal by default. The ARCHS_STANDARD build setting will no longer include x86_64 when MACOSX_DEPLOYMENT_TARGET or DRIVERKIT_DEPLOYMENT_TARGET >= 27.0.” (targety z minimalną wersją docelową macOS 27.0 lub DriverKit 27.0 nie budują się domyślnie jako Universal, bo ARCHS_STANDARD przestaje zawierać x86_64).2 Odtworzyłem to w projekcie wieloplatformowym (Yawara, z SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx xros xrsimulator) poleceniem xcodebuild -showBuildSettings -sdk macosx; bez argumentu -sdk projekt nie rozwiązuje żadnego ARCHS_STANDARD, co opisuje wpis o Intelu. Przy MACOSX_DEPLOYMENT_TARGET = 26.0 ustawienie rozwiązuje się do ARCHS_STANDARD = arm64 x86_64; przy 27.0 do ARCHS_STANDARD = arm64, podczas gdy ARCHS_STANDARD_64_BIT w obu przypadkach pozostaje arm64 x86_64.4 Nic nie ostrzega. Kto dostarcza aplikacje Universal i podnosi wersję docelową, musi sam dodać x86_64 do ARCHS.
Biblioteka standardowa C++. „The minimum supported deployment target on macOS for the C++ standard library has been increased to 11.0,” (minimalna obsługiwana wersja docelowa biblioteki standardowej C++ na macOS wzrosła do 11.0), a noty wymieniają zmiany zachowania pod nagłówkiem „Potentially breaking changes”, zaczynając od multi{map,set}::find, który nie musi już zwracać pierwszego pasującego elementu.2 Lista nowości jest długa: hashowanie wartości std::chrono, zip, std::optional<T&>, std::views::indices(n) i więcej.2
Skanowanie zależności i reguła, która może je przerwać. Apple twierdzi, że zoptymalizowało skaner zależności Swifta „to avoid redundant setup work and header searches when looking up Clang modules during a single dependency-scan action,” (aby uniknąć zbędnej pracy przygotowawczej i wyszukiwania nagłówków przy odnajdywaniu modułów Clang w obrębie jednej akcji skanowania), a przyspieszenie niesie ze sobą wymóg: „every Clang module reachable from a single Swift dependency-scan action must have a unique module name. If two module maps visible to the same scan declare a Clang module with the same name, the scan may report an error. Previously, the scanner may have tolerated duplicating names.” (każdy moduł Clang osiągalny z jednej akcji skanowania musi mieć unikatową nazwę; jeśli dwie mapy modułów widoczne w tym samym skanowaniu deklarują moduł Clang o tej samej nazwie, skanowanie może zgłosić błąd, choć wcześniej skaner mógł tolerować duplikaty).2 Apple wymienia dwa kształty, które to wyzwalają: „projects or SDKs that vend the same Clang module name from more than one location on the header search path, and vendored third-party sources that ship a module.modulemap redeclaring an SDK module.” (projekty lub SDK udostępniające tę samą nazwę modułu Clang z więcej niż jednej lokalizacji na ścieżce wyszukiwania nagłówków oraz dołączone do projektu źródła firm trzecich z plikiem module.modulemap redeklarującym moduł SDK).2 Podobnie jak usunięcie linkera, reguła uruchamia się przy aktualizacji łańcucha narzędzi, a nie w zależności od wersji docelowej; mój wpis o ld64 przepuszcza przez skaner dwie kolidujące mapy modułów, kompiluje dołączony shim SQLite3, który przesłania moduł SDK, i sprawdza siedem projektów pod kątem obu kształtów.
Co przestaje się kompilować?
Makro @State. Ta zmiana mieszka w notach wydania iOS 27, a nie Xcode, i zależy od kompilatora, którym się buduje, a nie od wersji docelowej, na którą się wdraża: „Xcode 27 introduces a new @State implementation that avoids this repeated evaluation. This new behavior back-deploys to iOS 17 aligned OSes. The new @State is implemented with a Swift macro. It is largely source compatible with the property wrapper version, with a few exceptions.” (Xcode 27 wprowadza nową implementację @State jako makro Swifta, która działa wstecz do systemów zgodnych z iOS 17 i jest w dużej mierze zgodna źródłowo z wersją opartą na property wrapperze, z kilkoma wyjątkami.)6 Apple wymienia cztery wyjątki i dla dwóch podaje listingi kodu; pozostałe dwa dostają po jednym lub dwóch zdaniach: „In rare situations, the automatic inference of generic arguments of @State is less flexible with the macro implementation. Write the type with more specificity.” (w rzadkich sytuacjach automatyczne wnioskowanie argumentów generycznych @State jest w implementacji makra mniej elastyczne; należy zapisać typ dokładniej) oraz „Composing @State with other property wrappers or macros is not supported.” (łączenie @State z innymi property wrapperami lub makrami nie jest obsługiwane).6 Dwa z listingami to te, które łapią istniejący kod. Inicjalizator przypisujący właściwość @State, która ma już wartość nadaną w deklaracji: SwiftUI zawsze odrzucało to przypisanie, a teraz „some such cases no longer compile.” (niektóre takie przypadki już się nie kompilują).6 Oraz prywatny inicjalizator memberwise, który kompilator syntetyzuje, gdy wszystkie składowe przechowywane są prywatne: „The state macro disables this synthesized initializer. So the code above no longer compiles.” (makro wyłącza ten syntetyzowany inicjalizator, więc powyższy kod już się nie kompiluje).6 Na 27A266a pierwszy przykład zawodzi w takiej postaci, w jakiej został napisany, z błędem error: variable 'self.title' used before being initialized w linii przypisującej page, bo setter makra działa na self, zanim istnieje title; po przeniesieniu self.title = title wyżej ten sam plik się kompiluje, a przypisanie @State jest odrzucane jak dawniej.46 Drugi przykład, rozszerzenie wywołujące self.init(page: page, title: title) na strukturze, której @State nie ma wartości w deklaracji, skompilował się u mnie bez zmian, a rozwinięcie makra pokazuje kształt, który na to pozwala: makro emituje private var _page: SwiftUICore.State<StickerPage> za akcesorem init z @storageRestrictions(initializes: _page), czyli konstrukcją pozwalającą inicjalizatorowi memberwise przyjąć page:.4 Notę warto czytać jako opis kształtów do sprawdzenia, a potem potwierdzić każdy z nich we własnym kodzie. Wpis o makrze @State zlicza oba wzorce w czterech wydanych aplikacjach; napisałem go w lipcu na podstawie not z bety, przed tym testem GA, a jego otwarte pytanie również tutaj się zamyka: bezpośrednie przypisanie do magazynu zapasowego, _page = State(initialValue:) wewnątrz inicjalizatora, kompiluje się na 27A266a zarówno z wartością w deklaracji, jak i bez niej.4
Niezgodność z SE-0508. W sekcji Swift Compiler, Known Issues: „A computed property with both an init accessor and an array/dictionary literal initial value will no longer compile if the getter is declared before the init accessor.” (właściwość obliczana z akcesorem init i literałem tablicy lub słownika jako wartością początkową nie skompiluje się, jeśli getter jest zadeklarowany przed akcesorem init). Dalej listing kodu, a potem atrybucja: „This is a known source break from SE-0508.” Obejście, w całości: „Swap the init accessor and the getter such that the init accessor is declared first.” (należy zamienić miejscami akcesor init i getter, tak aby akcesor init był zadeklarowany pierwszy).2 SE-0508 to „Array expression trailing closures”, zaimplementowana w Swift 6.4, a propozycja przewiduje dokładnie ten przypadek: „If the getter is declared before the init accessor, we will now attempt to parse as a trailing closure,” (jeśli getter jest zadeklarowany przed akcesorem init, parser spróbuje teraz odczytać to jako trailing closure), dodając, że „init accessors are however considered for disambiguation, so swapping the accessors is sufficient to make this valid regardless of initial value used,” (akcesory init są jednak brane pod uwagę przy ujednoznacznianiu, więc zamiana akcesorów wystarczy niezależnie od użytej wartości początkowej) i że ten przypadek „does not appear in the source compatibility suite, or for internal Swift projects at Apple.” (nie występuje w zestawie zgodności źródłowej ani w wewnętrznych projektach Swift w Apple).7 Odtwarza się go dziewięciolinijkową strukturą. Z getterem na pierwszym miejscu swiftc zawodzi w linii akcesora błędem error: initializers may only be declared within a type; po przeniesieniu akcesora init z @storageRestrictions(initializes:) nad get ten sam plik się kompiluje.4
struct Container {
private var storage: [Int] = []
var items: [Int] = [] {
@storageRestrictions(initializes: storage)
init(initialValue) { storage = initialValue } // musi poprzedzać get
get { storage }
set { storage = newValue }
}
}
PreviewProvider. Sekcja Previews wymienia jedno oznaczenie przestarzałości: „PreviewProvider and its family of preview modifiers.” (PreviewProvider i jego rodzina modyfikatorów podglądu).2 SDK je zawiera, z jednym komunikatem dla protokołu i innym dla każdego modyfikatora. W interfejsie SwiftUI w SDK iOS 27 public protocol PreviewProvider stoi pod @available(anyAppleOS, deprecated: 27.0, message: "Use #Preview instead."); previewLayout mówi „Use #Preview(traits: .sizeThatFitsLayout) or .fixedLayout(width:height:) instead.”; previewDisplayName mówi „Use #Preview("name") instead.”; previewInterfaceOrientation mówi „Use #Preview(traits: .landscapeLeft) or other orientation traits instead.”; previewDevice mówi „Use the device picker in Xcode’s canvas.” (należy użyć wyboru urządzenia na kanwie Xcode); a previewContext, wraz z protokołami PreviewContext i PreviewContextKey, mówi „Use #Preview with a Widget timeline provider or entries instead.” (należy użyć #Preview z dostawcą osi czasu lub wpisami widżetu).4 Dwa fakty decydują o tym, czy te komunikaty w ogóle się zobaczy. Kompilator porównuje wersję przestarzałości z wersją docelową, więc modyfikatory ostrzegają tylko w targecie z minimum 27.0: plik używający previewLayout, previewDisplayName i previewDevice dał trzy ostrzeżenia przy -target arm64-apple-ios27.0-simulator i żadnego przy 17.0 ani 26.0. A sam PreviewProvider nie ostrzega nigdy, z innego powodu. SDK deklaruje go z @available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *) bezpośrednio nad oznaczeniem anyAppleOS, a w mojej próbie protokół z taką parą nie dał żadnego ostrzeżenia ani przy konformancji, ani przy użyciu jako typ parametru przy targecie 27.0, podczas gdy ten sam protokół oznaczony samym @available(iOS, deprecated: 27.0) albo samą formą anyAppleOS ostrzegał w obu miejscach; modyfikatory noszą na własnych deklaracjach wyłącznie oznaczenie anyAppleOS (zawierające je extension SwiftUICore.View nosi atrybut wprowadzenia, a ta odziedziczona forma nie tłumi ostrzeżenia), i dlatego one ostrzegają, a protokół nie.4 Przy każdej wersji docelowej, którą faktycznie się wydaje, log budowania milczy w obu przypadkach, więc należy wyszukać PreviewProvider i modyfikatory i przejść na #Preview, które kanwa renderuje teraz w siatkach po jednym argumencie dzięki nowej składni #Preview(arguments:).24
Nowy stat() w System. Biblioteka System udostępnia teraz API Swifta dla stat, lstat, fstat i fstatat, z typem Stat i metodami instancji FilePath.stat().2 Noty wymieniają jako rozwiązany konflikt, w którym rozszerzenie wywołujące niekwalifikowane stat() zderzało się z nowymi metodami; kto dodał kwalifikację Darwin., gdy ten konflikt był żywy, może ją zostawić.2
Address Sanitizer, w drugą stronę. „Address Sanitizer might fail to launch on iOS 27.0, tvOS 27.0, watchOS 27.0, and visionOS 27.0 when building with Xcode 26.4 or older.” (Address Sanitizer może nie uruchomić się na systemach 27.0 przy budowaniu w Xcode 26.4 lub starszym). Obejściem jest Xcode 26.5 lub nowszy, co ma znaczenie dla zespołów trzymających starszego Xcode na maszynie CI, podczas gdy urządzenia aktualizują się do 27.0.2
Co zmieniło się w IDE i narzędziach?
- Interface Builder buduje bez symulatora. Nowy tryb kompilacji,
toolchain, „for UIKit (Cocoa Touch) based documents. Enabled by default,toolchainallows compiling IB documents without the need to download a simulator, which is especially useful for build servers.” (dla dokumentów opartych na UIKit; włączony domyślnie, pozwala kompilować dokumenty IB bez pobierania symulatora, co jest szczególnie przydatne na serwerach budujących).2 - Symulatory startują szybciej i potrafią się restartować. „The simulator runtimes now contain a pre-built dyld cache. This will make first launch of a simulator much faster,” (środowiska symulatora zawierają teraz gotową pamięć podręczną dyld, więc pierwsze uruchomienie jest znacznie szybsze), a
simctlzyskuje poleceniereboot.2 Jeden znany problem przetrwał, słowami Apple: „Some simulator runtimes are not completely deleted when removed, re-appearing after a reboot.” (niektóre środowiska symulatora nie są całkowicie usuwane i pojawiają się ponownie po restarcie).2 - JSON devicectl ma wersję 5.
xcrun devicectl --versionzgłasza 642.16, alist devices --json-outputzapisuje"jsonVersion": 5; Apple oznacza polahardwareProperties,devicePropertiesiconnectionPropertiesjako przestarzałe na rzecz słownikaproperties, a każdy wynik, który nadal je zawiera, niesie_deprecationNotice.24 - Testowanie StoreKit. Interfejs konfiguracji StoreKit pozwala definiować kody ofert, można konfigurować pakiety subskrypcji do testów lokalnych, a Transaction Manager potrafi przećwiczyć zakupy z kodami ofert bez urządzenia.2
- Organizer. Insights Overview „summarizes high-impact performance regressions,” (podsumowuje regresje wydajności o dużym wpływie), a metryka Hitches zastępuje metrykę Scrolling.2
- Asystent kodowania. Google Gemini dołącza do listy modeli, a „Planning with agents is now first class in Xcode,” (planowanie z agentami jest teraz w Xcode funkcją pierwszej kategorii) z planami jako edytowalnymi artefaktami Markdown, które zatwierdza się, zanim agent ruszy dalej; mój wpis o agentach kodujących opisuje ten przepływ z bety, a noty GA wymieniają edytor Markdown dokładnie dla tych artefaktów.2
- Lokalizacja. Agenci potrafią tłumaczyć wpisy String Catalog, a eksport lokalizacji wyciąga teraz
NSLocalizedStringi podobne makra z plików nagłówkowych.2 - Icon Composer. Noty nazywają go Icon Composer 2.0, „a new sharper rendering mode for upcoming 2027 operating systems” (nowy, ostrzejszy tryb renderowania dla nadchodzących systemów z 2027 roku); pakiet wewnątrz 27A266a zgłasza wersję 27.0.24
- Testowanie. Plan testów może określać, jak Xcode traktuje awarię testowanej aplikacji podczas testów UI, od wyłączenia po błąd krytyczny, a
swift testzyskuje--maximum-repetitionsz--repeat-until [pass|fail]oraz podsumowanie niepowodzeń na końcu.2 - Debugowanie. Przy bridging headerach LLDB „can now directly import explicitly built Swift modules and PCH from DerivedData,” (może teraz bezpośrednio importować jawnie zbudowane moduły Swift i PCH z DerivedData), a polecenie
language swift task treewypisuje zadania współbieżności Swifta.2
Co zrobiłbym w tym tygodniu
- Przeczytać wiersze zgodności, zanim dotknie się CI: macOS 26.6 na Macach budujących, wyłącznie Apple silicon, iOS 17 jako najstarsze urządzenie testowe oraz ten z progów macOS 12, watchOS 9 lub DriverKit 21, pod który podpada produkt.23
- Wyszukać grepem
-ld_classici-ld64i usunąć obie flagi; pierwszą linker ignoruje z ostrzeżeniem przy każdym linkowaniu, na drugiej zawodzi od razu. Przy okazji pobytu w ustawieniach budowania warto poszukać ręcznie napisanych plikówmodule.modulemap, które redeklarują moduł SDK, czyli kształtu, który Apple wymienia przy regule unikatowej nazwy modułu.24 - Jeśli jakikolwiek target macOS lub DriverKit ma ustawione 27.0, a aplikacja trafia na Intela, ustawić
ARCHSjawnie; samoARCHS_STANDARDdaje arm64, co odtworzyłem dla macOS, a Apple deklaruje dla obu.24 - Wyszukać
PreviewProvider,previewLayout,previewDisplayNameipreviewDevicei podążać za komunikatem każdej adnotacji: protokół na#Preview,previewLayoutna#Preview(traits: .sizeThatFitsLayout)lub.fixedLayout(width:height:),previewDisplayNamena#Preview("name"), apreviewDevicena wybór urządzenia na kanwie. Modyfikatory ostrzegają tylko przy deployment target 27.0, a konformancjaPreviewProvidernie ostrzega przy żadnym, więc log budowania wydawanego targetu pozostaje cichy.4 - Zbudować raz w Xcode 27 i przeczytać dwie diagnostyki:
variable 'self.title' used before being initializedw inicjalizatorze, który przypisuje właściwość@Statez wartością nadaną w deklaracji przed pozostałymi właściwościami przechowywanymi, co krok po kroku omawia wpis o makrze @State, orazinitializers may only be declared within a typewe właściwościach z literałem tablicy lub słownika jako wartością początkową i akcesorem init, gdzie akcesor przenosi się nad getter.246 - Przesłać kompilację TestFlight z SDK 27, skoro App Store Connect już je przyjmuje, pamiętając o regule ekranu startowego i nakazie scen UIKit, bo oba obowiązują aplikację od chwili, gdy linkuje się z 27.56
Często zadawane pytania
Kiedy ukazał się Xcode 27?
W poniedziałek 14 września 2026 roku, jako kompilacja 27A266a, tego samego dnia co iOS 27.0, iPadOS 27.0, macOS 27.0, tvOS 27.0, visionOS 27.0 i watchOS 27.0; kanał datuje wpis iOS 27.0 RC (24A437) na 11 września, dwa dni po tym, jak App Store Connect zaczął przyjmować kompilacje z SDK RC.15
Jakiego macOS wymaga Xcode 27?
macOS Tahoe 26.6 lub nowszego na Macu z Apple silicon. Nie instaluje się ani nie uruchamia na Macach z Intelem. Działa na macOS 27.0, który ukazał się tego samego dnia.23
Jakie są minimalne wersje docelowe w Xcode 27?
iOS 15, iPadOS 15, tvOS 15, watchOS 9, visionOS 1, macOS 12 i DriverKit 21. W porównaniu z Xcode 26.6 watchOS wzrósł z 8, macOS z 11, a DriverKit z 20.3
Czy Xcode 27 nadal buduje aplikacje Universal na Maca?
Tak, aż do macOS 12, ale nie domyślnie, gdy MACOSX_DEPLOYMENT_TARGET targetu wynosi 27.0: ARCHS_STANDARD rozwiązuje się wtedy do samego arm64, a x86_64 trzeba dodać do ARCHS samodzielnie.24
Czy Xcode 27.1 jest już dostępny?
Nie według stanu na 15 września 2026 roku. Kanał wydań Apple i indeks not wydania Xcode wymieniają tylko Xcode 27, a strona Apple dla deweloperów iPhone Duo nadal opisuje betę Xcode 27.1 jako „Coming later this month” (dostępna jeszcze w tym miesiącu); SDK iPhone Duo nie jest częścią tego wydania.1
Gdzie są noty wydania Xcode 27?
W serwisie dokumentacji Apple dla deweloperów, pod Xcode Release Notes, jedna strona na wydanie; cytowane tu sekcje to Overview, Linking, Intel Deprecation, Previews, Swift Compiler, Address Sanitizer, Instruments, Device Hub, devicectl, Simulator, Interface Builder, C++ Standard Library, Organizer, Coding Intelligence, Source Editor, Icon Composer, StoreKit Testing in Xcode, Localization, Testing, Swift Package Manager, Debugging i System.2 Zmiana makra @State znajduje się natomiast w notach wydania iOS i iPadOS 27, w sekcji SwiftUI.6
Źródła
-
Apple, Releases, kanał RSS pobrany 15 września 2026 roku: „Xcode 27 (27A266a)”, „iOS 27.0 (24A437)”, „iPadOS 27.0 (24A437)”, „macOS 27.0 (26A428)”, „tvOS 27.0 (24J361)”, „visionOS 27.0 (24M362)”, „watchOS 27.0 (24R364)” i „App Store Connect Update”, wszystkie z datą poniedziałku 14 września 2026; „iOS 27.0 RC (24A437)” z datą piątku 11 września 2026. Indeks Xcode Release Notes wymienia jeden wpis 27, „Xcode 27 Release Notes”; w żadnym z tych miejsc nie ma pozycji 27.1. Apple Developer, Get Ready for iPhone Duo, pobrana 15 września 2026 roku: „Xcode 27.1 beta. Get the latest SDKs to build, run, and test your app for iPhone Duo. Coming later this month”. ↩↩↩↩↩
-
Apple, Xcode 27 Release Notes, pobrane 15 września 2026 roku po wydaniu GA. Cytowane sekcje: Overview; Linking, Deprecations („The ld64 linker has been removed and the
-ld_classicoption is no longer supported.” 165165518); Intel Deprecation, New Features (ARCHS_STANDARD, 161837535) i Deprecations (wyłącznie Apple silicon, cytat w całości, 162138432); Previews, Deprecations („PreviewProviderand its family of preview modifiers.” 144168701) i New Features (#Preview(arguments:), 167544057); Swift Compiler, New Features (skaner zależności i wymóg unikatowej nazwy modułu, fragmenty, 136303612) i Known Issues (SE-0508, 180969028; zdanie z obejściem cytowane w całości); System, New Features i Resolved Issues (177911316); Address Sanitizer, Known Issues (178072780); Instruments, Deprecations (166097304); Device Hub, Deprecations (160482487); devicectl, New Features (170812159) i Deprecations (183772705); Simulator, New Features (179846743, 172303413) i Known Issues (141290052); Interface Builder, New Features; C++ Standard Library, New Features i Deprecations; Organizer; Coding Intelligence (171990272, 172857081); Source Editor, New Features (edytor Markdown, 175022151); Localization; Icon Composer; StoreKit Testing in Xcode; Testing; Swift Package Manager, New Features (--maximum-repetitions, 177561078; podsumowanie niepowodzeń, 168311253); Debugging. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, Xcode support: minimum requirements and supported SDKs, pobrana 15 września 2026 roku. Wiersz Xcode 27: macOS Tahoe 26.6 lub nowszy; SDK iOS 27, tvOS 27, watchOS 27, visionOS 27, macOS 27, DriverKit 27; wersje docelowe iOS 15 do 27, iPadOS 15 do 27, tvOS 15 do 27, watchOS 9 do 27, visionOS 1 do 27, macOS 12 do 27, DriverKit 21 do 27; obsługa urządzeń iOS 17, tvOS 17, watchOS 10, visionOS 1 lub nowsze; symulator iOS 17, tvOS 17, watchOS 10, visionOS 1 lub nowsze; kompilator Swift 6.4 z trybami języka 6, 5, 4.2 i 4. Wiersz Xcode 26.6: macOS Tahoe 26.2 do 26.x; SDK w wersji 26.5 z DriverKit 25.5; wersje docelowe iOS 15, tvOS 15, watchOS 8, visionOS 1, macOS 11, DriverKit 20; obsługa urządzeń i symulatora od iOS 15, tvOS 15, watchOS 8, visionOS 1; Swift 6.3. ↩↩↩↩↩↩
-
Reprodukcja autora na Xcode 27.0 (27A266a) z
DEVELOPER_DIRwskazującym na tę wersję, macOS 26.6.2 (25G83), 15 września 2026 roku.xcodebuild -version: „Xcode 27.0 Build version 27A266a”;swift --version: „Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)”; katalogusr/binłańcucha narzędzi zawiera jeden linker,ld, ald -vwypisuje „PROJECT:ld-27037.1” zbudowany „Aug 25 2026”; przyhello.czawierającymint main(void){return 0;}polecenieclang hello.o -o hello_classic -Xlinker -ld_classicwypisało „ld: warning: -ld_classic is no longer supported and will be ignored” i zakończyło się kodem 0, aclang hello.c -o hello_ld64 -Wl,-ld64wypisało „ld: library ‘d64’ not found” oraz „clang: error: linker command failed with exit code 1 (use -v to see invocation)” i zakończyło się kodem 1 bez pliku wyjściowego.xcodebuild -showBuildSettings -sdk macosxna Yawara.xcodeproj, projekcie wieloplatformowym (SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx xros xrsimulator), który bez argumentu-sdknie wypisuje żadnej liniiARCHS_STANDARD:ARCHS_STANDARD = arm64 x86_64przyMACOSX_DEPLOYMENT_TARGET = 26.0,ARCHS_STANDARD = arm64przy 27.0,ARCHS_STANDARD_64_BIT = arm64 x86_64w obu. Dziewięciolinijkowa strukturaContainerzvar items: [Int] = []i akcesorem@storageRestrictions(initializes: storage) init(initialValue): z getterem na pierwszym miejscu zawodzi błędem „error: initializers may only be declared within a type” w liniiinit; z akcesorem na pierwszym miejscu kompiluje się z kodem 0.SwiftUI.swiftmodule/arm64e-apple-ios.swiftinterfacew SDK iPhoneOS 27.0:@available(anyAppleOS, deprecated: 27.0, message: "Use #Preview instead.")w liniach 14971 (public protocol PreviewProvider), 14978 (jego rozszerzenie) i 14991 (PreviewPlatform); „Use #Preview with a Widget timeline provider or entries instead.” w 15023 (PreviewContextKey), 15029 (PreviewContext) i 15069 (previewContext); „Use the device picker in Xcode’s canvas.” w 15053 (previewDevice); „Use #Preview(traits: .sizeThatFitsLayout) or .fixedLayout(width:height:) instead.” w 15058 (previewLayout); „Use#Preview("name")instead.” w 15063 (previewDisplayName); „Use #Preview(traits: .landscapeLeft) or other orientation traits instead.” w 15075 (previewInterfaceOrientation);swiftc -cprostej konformancjiPreviewProvidernie dało ostrzeżenia przy-target arm64-apple-ios27.0-simulator,ios26.0aniios17.0; plik stosującypreviewLayout(.sizeThatFits),previewDisplayName("Card")ipreviewDevice(PreviewDevice(rawValue: "iPhone 18 Pro"))wewnątrzPreviewProviderdał trzy ostrzeżenia[#DeprecatedDeclaration]przyios27.0(„’previewLayout’ was deprecated in any Apple OS 27.0: Use #Preview(traits: .sizeThatFitsLayout) or .fixedLayout(width:height:) instead.” oraz odpowiadające komunikatypreviewDisplayNameipreviewDevice) i żadnego przyios26.0aniios17.0. Próba z czterema protokołami, każdy z konformującą strukturą i parametremany Pw jednej sygnaturze funkcji, skompilowana przy-target arm64-apple-ios27.0-simulator: samo@available(iOS, deprecated: 27.0), samo@available(anyAppleOS, deprecated: 27.0)oraz@available(iOS 13.0, *)nad@available(iOS, deprecated: 27.0)ostrzegały w linii konformancji i przy typie parametruany P(„’P1’ was deprecated in iOS 27.0”, „’P2’ was deprecated in any Apple OS 27.0”, „’P4’ was deprecated in iOS 27.0”), podczas gdy para z SDK,@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)nad@available(anyAppleOS, deprecated: 27.0), nie dała ostrzeżenia w żadnym z tych miejsc; wywołania metod przez te egzystencjały nie dały diagnostyki dla żadnego z czterech, a przyios26.0żaden z czterech nie ostrzegał. W interfejsiePreviewProviderznajduje się w liniach 14970 do 14972 pod dokładnie tą parą;previewLayoutw liniach 15058 do 15059 nosi na własnej deklaracji wyłącznie oznaczenieanyAppleOS, wewnątrzextension SwiftUICore.View, której atrybut wprowadzenia stoi w linii 15051. Plik z dwoma widokami przypisującymi_page = State(initialValue: StickerPage(title: title))wewnątrzinit(title:), jeden z@State private var page: StickerPage, a drugi z@State private var page = StickerPage(), skompilował się przyios27.0z kodem 0 i bez diagnostyki. Próby@State, każda jakoStickerPageViewz@State private var pageilet title: String, skompilowane poleceniemswiftc -c -target arm64-apple-ios27.0-simulatorwzględem SDK iPhoneSimulator 27.0: pierwszy przykład Apple,@State private var page = StickerPage()zinit(title:)przypisującymself.page, a potemself.title, zawiódł błędem „error: variable ‘self.title’ used before being initialized” w liniiself.page, kod 1; ten sam plik zself.title = titleprzeniesionym nad przypisanieself.pageskompilował się, kod 0; drugi przykład Apple,@State private var page: StickerPagebez wartości początkowej i rozszerzenie wywołująceself.init(page: page, title: title), skompilował się, kod 0, a-Xfrontend -dump-macro-expansionspokazało, że makro emitujeprivate var _page: SwiftUICore.State<StickerPage>z akcesorem@storageRestrictions(initializes: _page) init(initialValue).xcrun devicectl --version: 642.16;devicectl list devices --json-outputzapisało"jsonVersion": 5.Info.plistIcon Composera wewnątrz 27A266a:CFBundleShortVersionString27.0. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩ -
Apple, App Store Connect release notes, pobrane 15 września 2026 roku. Wpis z 14 września 2026 zacytowany w całości w tabeli powyżej; wpisy z 9 września 2026 odnotowują przesyłki z SDK RC i dodają specyfikacje zrzutów ekranu oraz podglądów aplikacji dla iPhone Duo, iPhone 18 Pro Max, iPhone 18 Pro, Apple Watch Ultra 4 i Apple Watch Series 12, z zapisem „Support for uploading assets for iPhone Duo in App Store Connect will be available later this year.” (obsługa przesyłania zasobów dla iPhone Duo w App Store Connect będzie dostępna jeszcze w tym roku). ↩↩↩↩↩
-
Apple, iOS & iPadOS 27 Release Notes, SwiftUI, New Features (105893279), pobrane 15 września 2026 roku. Źródło cytatu „Xcode 27 introduces a new
@Stateimplementation that avoids this repeated evaluation. This new behavior back-deploys to iOS 17 aligned OSes. The new@Stateis implemented with a Swift macro. It is largely source compatible with the property wrapper version, with a few exceptions.”; cytatu „If you provide an initial value at@Statedeclaration, and also try to assign a value to it in an initializer, the initializer value is discarded. This behavior has not changed because of the macro, but some such cases no longer compile:” wraz z listingiemStickerPageView; cytatu „When all stored members of a struct are private, the compiler synthesizes a private init that can be used in an extension of the same type:” wraz z listingiem; oraz „The state macro disables this synthesized initializer. So the code above no longer compiles. To mitigate, assign value to members explicitly:”; a także dwóch wyjątków bez listingu, „In rare situations, the automatic inference of generic arguments of@Stateis less flexible with the macro implementation. Write the type with more specificity.” i „Composing@Statewith other property wrappers or macros is not supported.” Sekcja UIKit tego samego dokumentu zawiera dwa wymogi cytowane w kroku 6: New Features, „iOS and iPadOS apps built with the 27.0 SDK or later are required to include a launch screen.” (168247372), oraz Deprecations, „Apps built with the latest SDK must adopt the scene-based life cycle or they fail to launch.” (141837548). ↩↩↩↩↩↩↩↩↩↩ -
Cal Stephens, SE-0508: Array expression trailing closures, Swift Evolution, status „Implemented (Swift 6.4)”, implementacja swiftlang/swift#86244, pobrana 15 września 2026 roku. Podsekcja „Init accessors” jest źródłem cytatu „One other case where this can result in an error is for properties with both an
initaccessor and initial value that is either an array or dictionary literal. If the getter is declared before theinitaccessor, we will now attempt to parse as a trailing closure:”, zdania o ujednoznacznianiu cytowanego powyżej oraz „This particular case appears to be quite rare in practice, it does not appear in the source compatibility suite, or for internal Swift projects at Apple.” ↩ -
Apple, Xcode 15 Release Notes, Linking, New Features (108915312), pobrane 15 września 2026 roku: „The classic linker can still be explicitly requested using -ld64, and will be removed in a future release.” (klasyczny linker nadal można jawnie wybrać flagą -ld64, a w przyszłym wydaniu zostanie usunięty). ↩↩