← Alle Beiträge

Ihre App für das iPhone Duo vorbereiten: ein durchgespieltes Beispiel

Wie bereiten Sie eine App auf das iPhone Duo vor? Bauen Sie sie mit dem iOS-27.1-SDK, schicken Sie sie im Simulator durch jede Pose, beheben Sie, was dieser Rundgang zeigt, und planen Sie die Einreichung um zwei Termine herum, die Apple noch nicht genannt hat. Das iPhone Duo kommt am 23. Oktober mit iOS 27.1 in den Handel.1 Was eine App darauf bekommt, entscheidet die SDK-Version, die in ihr Binary gestempelt ist: Ein und dieselbe Quelldatei, gelinkt als 26.0, 27.0 und 27.1, erschien als telefongroßer Kasten, als Fenster neben der Statusleiste am Rand und als ganzer Bildschirm mit den Leisten an der Seite und gemeldetem Falz.12 Stand 2. Oktober stempeln nur Apples Betas 27.1 oder neuer (Xcode 27.1 beta, das den Duo-Simulator enthält, und Xcode 27.2 beta), und App Store Connect nimmt ihre Builds für TestFlight an, nicht für den Store.8 Dieser Beitrag erledigt die ganze Arbeit an Kiradex, einer Sammler-App für Sammelkarten, die wir in TestFlight haben: was ohne eigenes Zutun funktionierte, was der Rundgang fand und das Lesen des Codes nicht, die Screenshots für beide Displays und ein Briefing, das Sie einem Coding-Agenten übergeben können.

Das Wichtigste in Kürze

  • Der SDK-Stempel ist der Schalter. iOS liest die SDK-Version im LC_BUILD_VERSION des Binarys. Mit Stempel 27.1 bekam die Probe-App den ganzen Bildschirm, geschlossen 466 mal 678 Punkte und offen 951 mal 669, mit senkrechten Leisten und reservierten Regionen. Mit Stempel 27.0 endete sie 80 Punkte vor dem Rand, an dem die Statusleiste sitzt, behielt waagerechte Leisten und erfuhr nichts über den Falz. Mit Stempel 26.0 war sie ein 375 mal 667 großes Telefon in einem Kasten. Prüfen Sie Ihr Binary mit otool -l.12
  • Der Kalender hat zwei offene Termine. TestFlight nimmt seit dem 18. September Builds mit dem 27.1-SDK an und seit dem 16. September Builds der 27.2-Beta; der App Store nimmt nur Builds mit dem 27.0-SDK an; die Screenshot-Größen für das Duo sind veröffentlicht, und ihr Upload „will be available later this year“ (wird im Laufe des Jahres möglich).89 Ein Schlüssel für den Startbildschirm ist beim Upload inzwischen Pflicht.10
  • Den Großteil erledigten die Systemcontainer. Ein TabView, ein NavigationStack in vier seiner fünf Tabs und Toolbar-Elemente mit Titel und Symbol brachten die Leisten von Kiradex ohne jeden Duo-Code an die Seite. Ein einziges ArrangementView teilte das geöffnete Display und verschob seine Trennlinie in der Pose Book auf den Falz. Ein einziges onHingeChange spielt die Eröffnung der App erneut ab, wenn sich das Telefon aufklappt.13
  • Der Rundgang fand, was das Lesen nicht fand. Ein Sheet, dessen einziger Button ein Text-„Done“ ist, reserviert die seitliche Leiste und lässt sie leer. Die Vollbildkarte läuft unter die äußere Kamera. Ins Hochformat gedreht, stapelt sich die Teilung. Eine Karte, die beim Aufklappen offen bleibt, landet im kompakten Layout und wird gestreckt. Das für das innere Display geschriebene Layout für reguläre Breite bricht auf einem 6,9-Zoll-iPhone im Querformat.13
  • Bis der Store 27.1 annimmt, braucht ein Quellbaum zwei Xcodes. #available hilft nicht; das 27.0-SDK hat kein ArrangementView, gegen das kompiliert werden könnte. Eine Compilation Condition oder #if canImport(SwiftUI, _version: 8.0.85) grenzt die neuen Aufrufe ein.14
  • Die Screenshots entstehen im selben Durchlauf. Die Aufnahmen des Simulators haben genau die Größen von App Store Connect, und genau so groß sind die Öffnungen in Apples Duo-Rahmen. Apples Regeln verlangen weiterhin frontal, unverändert und keine 3D-Renderings des Geräts.911

Der Stand am 2. Oktober

Stand Datiert
Das Telefon Vorbestellung ab 16. Oktober, im Handel ab 23. Oktober, „available with iOS 27.1“ (erhältlich mit iOS 27.1)1 9. September
Das SDK Xcode 27.1 beta (27A9269) enthält das iOS-27.1-SDK und den iPhone-Duo-Simulator; Apples Releases-Feed führt keine zweite 27.1-Beta und keinen Release Candidate. Xcode 27.2 beta enthält dieselben APIs und keinen Duo-Simulator814 18. September; Feed gelesen am 2. Oktober
TestFlight Offen für Builds aus Xcode 27.1 beta und aus den Betas von Xcode 27.2, intern und extern8 16., 18. und 28. September
App Store Offen für Builds aus Xcode 27 mit dem 27.0-SDK. Kein Eintrag öffnet ihn für das 27.1-SDK8 14. September
Duo-Screenshots Größen veröffentlicht; der Upload „will be available later this year“ (wird im Laufe des Jahres möglich)9 9. September
Startbildschirm Beim Upload Pflicht für alles, was mit dem iOS-27-SDK oder neuer gebaut wird10 Technote überarbeitet am 14. September

Drei dieser Zeilen warten auf Apple, und keine davon blockiert die Arbeit. Aus der Tabelle folgt diese Reihenfolge: die App auf das 27.1-SDK und in den Simulator bringen, sie durch jede Pose schicken, beheben, was der Rundgang zeigt, diesen Build in TestFlight stellen und die Store-Einreichung samt Duo-Screenshots für den Tag bereithalten, an dem sich das jeweilige Tor öffnet.

Apples eigener Ausgangspunkt ist der erste seiner sechs Tech Talks, zehn Minuten lang, und alles Folgende setzt ihn voraus:

Watch on Apple Developer ↗

Schritt eins: Der SDK-Stempel entscheidet, was das Telefon Ihnen gibt

Der Talk beginnt mit einem Kompatibilitätsversprechen in drei Stufen. Eine App, die nicht mit dem iOS-27-SDK gebaut wurde, läuft trotzdem: „When the device is closed, your app will use the screen space to the left of the status bar and camera. When the device is open, your app will be a familiar size and aspect ratio.“ (Geschlossen nutzt die App den Platz links von Statusleiste und Kamera, geöffnet hat sie eine vertraute Größe und ein vertrautes Seitenverhältnis.) (0:36) Eine App, die das iOS-27-SDK übernommen hat, „will extend to the left of the status bar area on the inner display.“ (reicht auf dem inneren Display bis links an den Bereich der Statusleiste.) (0:58) Und dann: „When you build your app with the iOS 27.1 SDK, your app extends to the edge of the screen. Standard navigation and toolbar buttons now lay out vertically under the status bar.“ (Mit dem iOS-27.1-SDK reicht die App bis an den Bildschirmrand, und die Standardbuttons für Navigation und Toolbar ordnen sich senkrecht unter der Statusleiste an.) (1:05)3

Diese Stufen sind keine Eigenschaft Ihres Codes. Sie sind eine Eigenschaft einer einzigen Zahl in Ihrem Binary, der SDK-Version, die der Linker im Load Command LC_BUILD_VERSION festhält, und iOS liest sie beim Start. Um zu sehen, wie viel davon abhängt, habe ich eine kleine Probe-App gebaut, ein TabView mit einem NavigationStack samt fünf Toolbar-Elementen und einem ArrangementView, und zwar dreimal aus derselben Quelldatei. Der einzige Unterschied zwischen den drei Binarys ist diese Zahl: 26.0, 27.0, 27.1. Dann habe ich alle drei im iPhone-Duo-Simulator in jeder Pose laufen lassen.12

Dieselbe Probe-App dreimal auf dem geöffneten inneren Display des iPhone-Duo-Simulators. Gelinkt als SDK 26.0 ist sie ein telefongroßes Fenster von 375 mal 667 Punkten auf schwarzem Bildschirm, mit waagerechter Toolbar und Tab-Leiste. Gelinkt als SDK 27.0 füllt sie den Bildschirm links von einer schwarzen Statusleiste, 871 mal 669 Punkte, mit waagerechten Leisten. Gelinkt als SDK 27.1 füllt sie den ganzen Bildschirm, 951 mal 669 Punkte, Toolbar und Tab-Leiste senkrecht gestapelt unter der Uhr am rechten Rand, und sie meldet eine Division und zwei Okklusionen

Eine Quelldatei, drei SDK-Stempel, geöffnet und aufrecht. Von links nach rechts: 26.0, 27.0, 27.1.

Pose Stempel 26.0 Stempel 27.0 Stempel 27.1
Geschlossen 375 mal 667, skaliert in den Platz neben der Leiste 386 mal 678, neben der Leiste 466 mal 678, das ganze Display
Offen 375 mal 667, ein Telefon in der Bildschirmmitte 871 mal 669 951 mal 669
Offen, gedreht 375 mal 667 669 mal 871 669 mal 951
Geschlossen, gedreht 667 mal 375 678 mal 386 678 mal 466
Size Class der Breite, offen compact regular regular
Leisten überall waagerecht überall waagerecht senkrecht, außer offen und gedreht
toolbarVerticalEdge nil nil trailing, außer offen und gedreht, dort nil
Reservierte Regionen keine keine der Falz, beide Kameras, die Statusspalte
Teilweise gefaltet keine Änderung keine Änderung der Falz wird zur aktiven Division; geteilte Arrangements öffnen dort eine Lücke

Fenstergrößen in Punkten, wie das Fenster des jeweiligen Builds sie selbst meldete.12

Lesen Sie die mittlere Spalte zweimal, denn mit ihr werden die meisten Apps demnächst ausgeliefert. Ein Build aus Xcode 27 bekommt auf dem inneren Display reguläre Breite und den Großteil des Bildschirms, eine echte Verbesserung gegenüber dem Telefon im Kasten aus der ersten Spalte. Er endet aber 80 Punkte vor der hinteren Kante, wo die Statusleiste liegt, er bekommt keine senkrechten Leisten, und das System verrät ihm nichts über den Falz oder die Kameras: Jede Abfrage reservierter Regionen kam leer zurück, in jeder Pose, ganz gleich, wie oft die Probe-App fragte.12 Um sicherzugehen, dass der Stempel ein fairer Stellvertreter ist, habe ich außerdem eine schlichte Version der Probe-App mit Xcode 27.0 selbst kompiliert, gegen dessen eigenes iOS-27.0-SDK. Sie bekam dieselben Fenster: 386 mal 678 geschlossen, 871 mal 669 offen.12

Apples schriftlicher Leitfaden ist an dieser Stelle weniger genau als der Talk, und sein Wortlaut hat sich verschoben. Am 17. September lautete die Übersicht „Build your app with Xcode 27.1 or later to use all of the available screen space on iPhone Duo. In earlier versions, your app doesn’t extend under the status bar and camera.“ (Bauen Sie Ihre App mit Xcode 27.1 oder neuer, um den gesamten Platz auf dem iPhone Duo zu nutzen; in früheren Versionen reicht die App nicht unter Statusleiste und Kamera.) Am 19. September lautete sie, wie auch am 2. Oktober, „Build your app with the latest version of Xcode to use all of the available screen space on iPhone Duo. When you build with Xcode 26 and earlier, your app doesn’t extend under the status bar and camera.“ (Bauen Sie mit der neuesten Xcode-Version, um den gesamten Platz zu nutzen; mit Xcode 26 und früher reicht die App nicht unter Statusleiste und Kamera.)2 Der neue Satz nennt nur Xcode 26 und früher als unzureichend, und „latest version“ sagt nicht, ob eine Beta zählt; ein Leser könnte also annehmen, dass ein Build aus Xcode 27.0 den ganzen Bildschirm bekommt. Im Simulator dieser Beta tut er das nicht. Er bekommt die mittlere Stufe des Talks, und der frühere Wortlaut entsprach dem, was ich gemessen habe. Solange keine Hardware etwas anderes zeigt, planen Sie nach der Tabelle.

Prüfen Sie deshalb vor allem anderen den Stempel des Builds, den Sie testen:

otool -l Build/Products/Debug-iphonesimulator/YourApp.app/YourApp | grep -A4 LC_BUILD_VERSION

Ein Debug-Build aus Xcode legt seinen Code in YourApp.debug.dylib neben einen kleinen Launcher, und beide tragen den Load Command. Sie suchen nach sdk 27.1 oder höher; die mit 27.2 gestempelte Probe-App, also mit dem Wert, den das SDK der Xcode-27.2-Beta schreiben würde, wurde genauso behandelt wie 27.1.12 Bei Kiradex steht dort minos 27.0 und sdk 27.1: Die App installiert sich unter iOS 27.0 und bekommt auf einem Duo das Verhalten von 27.1.13

Ich bestehe so darauf, weil ich mich hier öffentlich geirrt habe. Mein erster Bericht aus diesem Simulator vom 21. September sagte, die Toolbar werde nie senkrecht und die reservierten Regionen seien in jeder Pose leer. Die Beta war in Ordnung. Ich hatte die Probe-App damals mit einem direkten Aufruf von swiftc -sdk kompiliert, der Link-Schritt nahm das macOS-SDK aus demselben Xcode als Wurzel, und das Binary ging mit dem Stempel 27.0 hinaus: Alles, was ich an jenem Tag gemessen habe, war die mittlere Spalte. Jener Beitrag trägt inzwischen die Korrektur.12 Wenn Ihr Duo-Layout im Simulator nur halb übernommen aussieht, mit Leisten oben quer und einem toten schwarzen Streifen an der Seite, prüfen Sie den Stempel, bevor Sie Ihren Code prüfen.

Die App auf dem Prüfstand

Kiradex ist eine Sammler-App für Sammelkarten, die wir in TestFlight haben: jede Serie, die Karten, die Sie besitzen, und die, die Sie suchen, ihr Wert im Zeitverlauf und jede Karte als 3D-Objekt, das Sie umdrehen können. Sie ist kostenlos, nur fürs iPhone, läuft ab iOS 27.0 und speichert die Listen eines Sammlers in dessen eigener iCloud, ohne einen Server von uns dazwischen.13 Fertig ist sie nicht. Der Scanner hat noch nie eine echte Kamera gesehen, und bis zu dieser Woche hatte niemand die App auf einem geöffneten Duo betrachtet: Neben dem Layout für das innere Display stand in ihrer Roadmap die Zeile „Seen on the open Duo’s inner display only by the column maths; the simulator was folded shut.“ (Auf dem inneren Display des geöffneten Duo nur über die Spaltenrechnung gesehen; der Simulator war zugeklappt.)13 Das macht sie zu einem fairen Testfall. Die Duo-Arbeit darin wurde nach Apples Dokumentation geschrieben und nie an einem Bildschirm überprüft.

Was sie für das Duo tut, ist überschaubar, und es lohnt sich, es aufzuzählen, weil so wenig davon Duo-Code ist:

  • Die Navigation gehört dem System. Ein TabView mit fünf Tabs, einer davon mit der Suchrolle, und ein NavigationStack in vier davon; der Scanner ist eine Kameraansicht ohne eigene Leiste. Toolbar-Elemente sind Labels mit Titel und Symbol, angehängt per .toolbar. Nirgends gibt es eine selbst gebaute Leiste.
  • Das Layout folgt der Size Class. Kompakte Breite bekommt eine dreispaltige Albumseite und schiebt den Inspektor einer Karte auf den Stack. Reguläre Breite, was bei einer reinen iPhone-App meist das innere Display des Duo bedeutet, bekommt eine Kartenwand mit gerader Spaltenzahl; wählt man eine Karte aus, teilt sich der Bildschirm zwischen Seite und Inspektor.
  • Zwei Aufrufe aus dem 27.1-SDK. Die Teilung ist ein ArrangementView im Stil .split, mit einem HStack als Rückfallebene unter iOS 27.1. Und onHingeChange spielt die Eröffnungsanimation der App erneut ab, ein rotes Gerät, das aufschwingt, wenn das Telefon von geschlossen in irgendeinen anderen Zustand wechselt.
  • Keine Ausrichtungssperre, dafür ein Startbildschirm. Info.plist führt Hochformat und beide Querformate auf und deklariert UILaunchScreen.13

Das ist die ganze Liste: zwei Verfügbarkeitsprüfungen in zwei Dateien. Alles andere, was das Telefon mit der App macht, macht es mit jeder App, die so gebaut ist.

Die Bilder in diesem Beitrag zeigen die App, wie sie läuft, mit Kartenbildern aus dem öffentlichen Katalog, den sie liest. Kiradex ist ein unabhängiges Werkzeug für Sammler, nicht verbunden mit oder unterstützt von Nintendo, Creatures Inc., GAME FREAK inc. oder The Pokémon Company, und die Kartenbilder gehören ihren Rechteinhabern.

Schritt zwei: jede Pose durchgehen

Apples Leitfaden fasst den Rundgang in vier Prüfungen:2

  • „Confirm your views resize well in each supported orientation and pose.“ (Vergewissern Sie sich, dass Ihre Views in jeder unterstützten Ausrichtung und Pose sauber ihre Größe anpassen.)
  • „Inspect how the system presents your app’s navigation bars, toolbars, and tab bars vertically on the side of the display.“ (Prüfen Sie, wie das System Navigationsleisten, Toolbars und Tab-Leisten Ihrer App senkrecht an der Displayseite darstellt.)
  • „Identify any views, sheets, or popovers that position awkwardly when you fold or open iPhone Duo.“ (Finden Sie Views, Sheets oder Popover, die beim Zu- oder Aufklappen des iPhone Duo ungünstig sitzen.)
  • „Identify elements or controls in your views that appear in the fold, and are difficult to see or interact with.“ (Finden Sie Elemente oder Bedienelemente, die im Falz liegen und schwer zu sehen oder zu bedienen sind.)

Seine Gestaltungsrichtlinien sagen, wie viele Layouts das erfordern sollte: „A compact width layout for the outer display and a regular width layout for the inner display give you the fundamentals for every pose.“ (Ein Layout für kompakte Breite auf dem äußeren Display und eines für reguläre Breite auf dem inneren liefern die Grundlagen für jede Pose.)7

Die Posen sind Buttons in Device Hub: Closed, Book, Open und Rotate Right, und jede Kombination ergibt einen anderen Bildschirm. Der Leitfaden von SwiftLee ergänzt eine feinere Steuerung, die ich nicht brauchte: „Holding Option ⌥ reveals a slider that you can use to control the hinge angle of the device with precision“ (Mit gedrückter Wahltaste ⌥ erscheint ein Schieberegler, mit dem sich der Scharnierwinkel präzise steuern lässt).17 Bevor wir die App ansehen, hilft es zu wissen, was das System in jeder Pose an jede App übergibt. Das sind die Messwerte der Probe-App mit dem Stempel 27.1:12

Pose Fenster, Punkte Size Classes (Breite, Höhe) Leisten Gemeldete reservierte Regionen
Geschlossen 466 mal 678 compact, regular senkrecht, hintere Kante äußere Kamera, 37 mal 37, aktiv; Statusspalte, 84 mal 170, aktiv
Geschlossen, gedreht 678 mal 466 compact, compact senkrecht, hintere Kante äußere Kamera, aktiv; Statusbereich, 84 mal 82, aktiv
Offen 951 mal 669 regular, regular senkrecht, hintere Kante Falz, 40 breit bei x 455 bis 495, inaktiv; innere Kamera, 58 mal 37, inaktiv; Statusspalte, 84 mal 120, aktiv
Book 951 mal 669 regular, regular senkrecht, hintere Kante dieselben drei, der Falz aktiv
Offen, gedreht 669 mal 951 regular, regular waagerecht Falz, 40 hoch bei y 455 bis 495, inaktiv; innere Kamera, inaktiv; Statusbereich, 134 mal 82, aktiv
Book, gedreht 669 mal 951 regular, regular waagerecht dieselben drei, der Falz aktiv

Drei maßstabsgetreu gezeichnete Bildschirme des iPhone-Duo-Simulators mit den Regionen, die das System einer mit dem 27.1-SDK gebauten App meldet. Geschlossen, 466 mal 678 Punkte: ein 382 Punkte breiter Inhaltsbereich und rechts eine 84 Punkte breite Leiste mit Statusspalte, Kamera und Leisten. Offen, 951 mal 669 Punkte: ein 867 Punkte breiter Inhaltsbereich, dieselbe Leiste, ein 40 Punkte breites Band in der Mitte für den Falz und rechts davon nahe der Oberkante die innere Kamera. Offen und gedreht, 669 mal 951 Punkte: waagerechte Leisten oben und unten, der Falz als 40 Punkte breites Band quer durch die Mitte

Drei Dinge in dieser Tabelle prägten alles Weitere.

Das Fenster ändert sich nicht, wenn das Telefon faltet. Book und Open melden dieselbe Größe. Der einzige Unterschied, den die App sehen kann, ist, dass die Division des Falzes von inaktiv zu aktiv wechselt und das Scharnier teilweise geöffnet bei 127 Grad meldet, wo es zuvor vollständig geöffnet bei 180 Grad gemeldet hatte. Eine App, die nur ihre Größe liest, erfährt nie, dass das Telefon gefaltet wurde.

Der Falz ist immer da, und er ist schmal. Er wird geöffnet wie gefaltet gemeldet, genau in der Mitte, und der Rahmen, den die API zurückgibt, ist in beiden Zuständen 40 Punkte breit, mit 20 Punkten Rand auf jeder Seite. Apples Talk sagt über die Region des Falzes: „When flat, it’s inactive and has a width of zero.“ (Flach ist sie inaktiv und hat die Breite null.) (7:32) Der Simulator gibt keinen Rahmen der Breite null zurück. Artem Novichkovs Praxisnotizen beschreiben denselben Messwert als „40 pt wide, with 20 pt margins on each side of a zero-width fold line,“ (40 pt breit, mit 20 pt Rand auf beiden Seiten einer Faltlinie der Breite null)17 und ich lese die Null des Talks genauso, als die Linie zwischen den Rändern; das ist eine Lesart, nichts, was Apples Text sagt. Auch den praktischen Punkt macht der Talk: „By default, only active ones will be returned, but you can query for inactive ones“ (Standardmäßig werden nur aktive zurückgegeben, aber Sie können auch inaktive abfragen) und „in grid-like layouts, you could prefer even numbers of columns when a division region is present regardless of its active state.“ (In rasterartigen Layouts können Sie gerade Spaltenzahlen bevorzugen, sobald eine Division vorhanden ist, ob aktiv oder nicht.) (7:16, 7:41)5

Die Regionen kommen spät. Bei jedem Start lasen die ersten paar Auswertungen der Probe-App überhaupt keine Regionen, und jede Auswertung danach las den vollständigen Satz. Eine View, die einmal fragt, in ihrem ersten Layout-Durchlauf, speichert ein leeres Array. Lesen Sie sie im Body der View, bei jeder Auswertung; die Probe-App wertete per Timer einmal pro Sekunde neu aus, und Artem Novichkovs Notizen formulieren die Regel direkt: „Read them in the GeometryReader body so the view updates when they arrive. Don’t cache them.“ (Lesen Sie sie im Body des GeometryReader, damit sich die View aktualisiert, sobald sie eintreffen. Speichern Sie sie nicht zwischen.)1217

Ein praktischer Hinweis vor der App. Die iOS-27.1-Simulator-Runtime in dieser Beta unterstützt genau einen Gerätetyp, das iPhone Duo; fordert man von ihr ein iPhone 18 Pro Max an, scheitert das mit „Incompatible device“. Der Vergleich weiter unten, derselbe Build auf einem gewöhnlichen iPhone, lief deshalb auf der iOS-27.0-Runtime, was zugleich ein schneller Weg ist, um zu bestätigen, dass die #available-Rückfallebenen funktionieren.12

Kiradex zeigt dieselbe Serie von Karten auf drei Bildschirmen aus einem Build. Auf einem 6,9-Zoll-iPhone: drei Kartenspalten, eine Navigationsleiste oben und eine Tab-Leiste unten. Auf dem geschlossenen iPhone Duo: drei Spalten, dazu Zurück-Button, Filter-Button und fünf Tab-Buttons in einer Leiste am rechten Rand unter der Uhr gestapelt. Auf dem geöffneten iPhone Duo: sechs Kartenspalten und rechts dieselbe Leiste

Ein Build von Kiradex auf einem 6,9-Zoll-iPhone, dem geschlossenen Duo und dem geöffneten Duo. Nichts im Code der App setzt die Leisten an die Seite.

Was der Rundgang fand

Ein UI-Test schickte Build 5 durch acht Arten von Bildschirm in jeder von sechs Posen (sieben geschlossen und gedreht, wo der Einstellungen-Button ins Überlaufmenü gewandert war), während ein Skript an jeder Station beide Displays aufnahm: außen 1398 mal 2034 Pixel, innen 2853 mal 2007, die Größen, die App Store Connect aufführt.13 Gemessen an Apples vier Prüfungen bestand die App mehr, als ich erwartet hatte, und scheiterte an Stellen, die kein Lesen des Codes markiert hatte.

Was ohne Zutun funktionierte

Die Leisten. Geschlossen stehen die Toolbar und alle fünf Tabs in der Leiste unter der Uhr; offen ebenso; offen und gedreht wandern sie zurück nach oben und unten. Nichts in der App verlangt danach. Der zweite Talk nennt den Grund, warum selbst gebaute Leisten zurückbleiben: „When used to build custom bars, content from sub-components like UIToolbar, UINavigationBar, or UITabBar won’t be considered.“ (Werden eigene Leisten aus Unterkomponenten wie UIToolbar, UINavigationBar oder UITabBar gebaut, wird deren Inhalt nicht berücksichtigt.) (2:52)4 Und weil jedes Toolbar-Element auf den Hauptbildschirmen ein Label ist, hat jedes ein Symbol für die Leiste und einen Titel für das Überlaufmenü, und das ist die andere Bedingung des Leitfadens: „If your item has a title and doesn’t have an icon, the system doesn’t present it vertically.“ (Hat ein Element einen Titel, aber kein Symbol, stellt das System es nicht senkrecht dar.)2

Watch on Apple Developer ↗

Der Falz. Offen hängen die Karten einer Serie zu sechst nebeneinander, eine gerade Zahl, sodass keine Karte in der Bildschirmmitte sitzt. Wählt man eine aus, teilt sich der Bildschirm zwischen der Seite und dem Inspektor der Karte, und zwar in der Mitte des Inhaltsbereichs der App, bei x 433. Das liegt 42 Punkte links vom Falz, weil die Leiste rechts 84 Punkte wegnimmt, und solange das Telefon flach liegt, spielt das keine Rolle. In der Pose Book verschiebt die Arrangement-View die Trennlinie auf den Falz und lässt das 40-Punkte-Band frei: Der Inspektor, der bei x 433 begann, beginnt jetzt bei 495. Für die Pose Book hat die App überhaupt keinen Code; das ist ArrangementView, das tut, was der Talk beschreibt: „moving, resizing, or reorganizing what’s already there.“ (Vorhandenes verschieben, in der Größe ändern oder neu anordnen.) (6:04)513

Kiradex auf dem geöffneten inneren Display mit ausgewählter Karte, zweimal. Flach: links eine dreispaltige Kartenseite, rechts 3D-Bühne und Details der gewählten Karte, die sich in der Mitte des Inhaltsbereichs treffen, ein wenig links von der Bildschirmmitte. In der Pose Book: dieselben beiden Bereiche mit einem leeren senkrechten Band dazwischen, wo der Falz liegt, die Seite etwas breiter und der Inspektor schmaler

Offen und flach, dann in der Pose Book. Die Lücke im zweiten Bild ist der Falz, und nicht die App hat sie dort hingesetzt.

Sheets, wenn das Telefon offen ist. Auf dem inneren Display erscheint ein Sheet zentriert, und sein Done-Button bleibt waagerecht; in der Pose Book wanderte das Sheet der Probe-App von selbst auf die führende Seite des Falzes.12

Das Scharnier als Ereignis. Klappen Sie das Telefon auf, während die App läuft, spielt ihre Eröffnung auf dem inneren Display erneut: das rote Gerät, erst geschlossen, dann aufschwingend in die App hinein. Das ist ein einziger onHingeChange-Handler, der auslöst, wenn der Status closed verlässt, und es ist genau die Arbeitsteilung, die der vierte Talk verlangt: „Hinge data is observed live, and is ideal for driving interactions or effects. For layout, use the arrangement and region APIs.“ (Scharnierdaten werden live beobachtet und eignen sich ideal für Interaktionen oder Effekte; für das Layout nutzen Sie die Arrangement- und Region-APIs.) (2:34)6

Vier Einzelbilder des inneren Displays des iPhone Duo, aufgenommen, während der Simulator sich mit laufendem Kiradex aufklappt: ein geschlossenes rotes Handgerät auf dunkelrotem Grund, das Gerät schwingt auf und zeigt einen kleinen grünen Bildschirm mit der Aufschrift KIRADEX, das geöffnete Gerät blendet über die App, und der Dex-Bildschirm der App

Aufklappen bei laufender App: Die Eröffnung ist das eigene Gerät der App, von der App gezeichnet, vom Scharnier erneut abgespielt.

Was ihr entging

Ein Sheet mit einem einzigen Text-Button reserviert die Leiste und lässt sie leer. Geschlossen gibt das Einstellungen-Sheet an seiner hinteren Kante einen Streifen für eine senkrechte Leiste ab und legt dann nichts hinein: Das einzige Toolbar-Element ist ein „Done“ mit Titel und ohne Symbol, und ein reines Text-Element bleibt waagerecht. Das Formular wird in den Rest gequetscht. Die Probe-App hat die Kosten gemessen: 374 Punkte Inhaltsbreite mit reservierter Leiste, 450 mit abgeschalteter senkrechter Leiste.12 Apples Talk benennt genau diesen Fall: „if a sheet is control-heavy with only one item, like the close button here, consider disabling a vertical bar so it doesn’t reduce available space.“ (Ist ein Sheet voller Bedienelemente und hat nur ein Element in der Leiste, etwa diesen Schließen-Button, erwägen Sie, die senkrechte Leiste abzuschalten, damit sie keinen Platz kostet.) (14:37)4 Es gibt zwei Reparaturen, und die Probe-App hat beide durchgespielt. Geben Sie dem Button ein Symbol, Button("Done", systemImage: "checkmark"), und er wandert als hervorgehobenes Häkchen in die Leiste; oder setzen Sie .toolbarVerticalBehavior(.disabled) auf den Inhalt des Sheets, und die Leiste verschwindet, um den Preis eines kürzeren Sheets.

Vier Aufnahmen des geschlossenen äußeren Displays. Das Einstellungen-Sheet von Kiradex mit einem Text-Button Done oben und einem leeren Streifen rechts, in dem nur die Uhr steht. Das Sheet der Probe-App mit Text-Done: derselbe leere Streifen. Das Sheet der Probe-App mit Häkchen-Symbol auf Done: Der Button sitzt als blauer Kreis unter der Uhr im Streifen. Das Sheet der Probe-App mit abgeschalteter senkrechter Leiste: Das Sheet ist volle Breite und kürzer, Done oben rechts

Von links nach rechts: das Sheet der App, dann die Probe-App mit reinem Text-Done, mit Symbol und mit abgeschalteter senkrechter Leiste.

Die Vollbildkarte läuft unter die Kamera. Das Paradestück der App ist eine Karte auf schwarzer Bühne mit ausgeblendeten Leisten, und ihre Bühne ignoriert die Safe Area an jeder Kante. Auf dem äußeren Display schickt das die obere Ecke der Karte unter die Kamera. Das System meldet diese Kamera jeder View, die fragt, als aktive Okklusion von 37 Punkten im Quadrat, und ihre Position stimmt bis auf anderthalb Punkte mit der Aussparung in Apples eigenem Rahmenbild überein.1112 Apples Gestaltungsrichtlinien erlauben die Behandlung in voller Breite, „as long as nothing conflicts with the Dynamic Island or the status bar.“ (solange nichts mit der Dynamic Island oder der Statusleiste kollidiert.)7 Die Reparatur: Den randlosen Anschnitt für den schwarzen Grund behalten und die Karte selbst hereinholen, entweder indem die Bühne auf diesem Display die hintere und obere Safe Area respektiert, oder indem sie reservedRegions(kind: .occlusion) liest und die Karte frei von dem rahmt, was zurückkommt.

Der Vollbild-Kartenbetrachter von Kiradex, aufgenommen auf dem geschlossenen äußeren Display und in Apples iPhone-Duo-Rahmen gesetzt: Die Karte füllt den Bildschirm, und ihre obere rechte Ecke läuft an der Displayecke unter der Kamera hindurch, neben dem Schließen-Button des Betrachters

Die Aufnahme des Betrachters in Apples Rahmen für das äußere Display. Der Screenshot des Simulators hat kein Loch, das Telefon schon.

Gedreht stapeln sich die beiden Bereiche. Offen und ins Hochformat gedreht ist das Display 669 Punkte breit und immer noch reguläre Breite, also teilt die App weiterhin. Eine Arrangement-View, die einen Raum füllt, der höher als breit ist, teilt jedoch oben und unten, laut Apples Leitfaden: „it places the primary view on top and the secondary view below it when the containing view is taller than it is wide.“ (Ist die umgebende View höher als breit, setzt sie die primäre View oben und die sekundäre darunter.)2 Heraus kommt ein Streifen, der eine Kartenreihe und den oberen Rand einer zweiten zeigt, über einem Inspektor. Der Kommentar der App an genau dieser Zeile hält über das Paar fest: „is only useful side by side,“ (sei nur nebeneinander nützlich), und nichts hat das erzwungen. Den Stil mit .split.axes(.horizontal) einzuschränken ist die dokumentierte Steuerung,16 mit einem Haken, den der Talk ausbuchstabiert: „If the split arrangement cannot split among an axis, and it’s the primary axis, the arrangement view chooses to only show a single view.“ (Kann das geteilte Arrangement entlang einer Achse nicht teilen, und ist es die primäre Achse, zeigt die Arrangement-View nur eine einzige View.) (12:44)5 Die Probe-App bestätigt beide Hälften: Über das gedrehte Display gespannt, stapelte sich eine schlichte Teilung, und die rein horizontale Teilung zeigte den primären Bereich und sonst nichts.12 Für diese App würde das den Inspektor verstecken, also ist die ehrliche Lösung eine Entscheidung und kein Modifier: Ist der Raum höher als breit, schieben Sie den Inspektor auf den Stack, wie es das kompakte Layout tut.

Kiradex auf dem ins Hochformat gedrehten inneren Display. Links eine Serie als vier Kartenspalten unter einer waagerechten Navigationsleiste, unten eine schwebende Tab-Leiste. Rechts, mit ausgewählter Karte: oben quer eine Kartenreihe und der obere Rand einer zweiten, darunter Bühne und Details der gewählten Karte

Gedreht: waagerechte Leisten, wie Apples Richtlinien es vorsehen, und eine Teilung, die für dieses Paar von Views in die falsche Richtung ging.

Eine Karte, die über das Aufklappen hinweg offen bleibt, landet in keinem der beiden Layouts. Geschlossen schiebt die Auswahl einer Karte deren Inspektor auf den Navigationsstack. Klappen Sie auf, während dieser Inspektor zu sehen ist, und die Karte ist noch da, also genau der Teil, den man leicht falsch macht. Es bleibt aber ein gepushter Bildschirm, jetzt 951 Punkte breit: links die Bühne, die Details in einem weißen Kasten, der verloren auf Schwarz treibt, ein Zurück-Button in der Leiste. Das Design der App für dieses Display ist die Wand mit der Karte daneben, und der einzige Weg dorthin führt zurück und über eine erneute Auswahl der Karte. Eine Auswahl steuert beide Layouts; ein Navigationspfad tut es nicht. Die Reparatur: den Wechsel von kompakter zu regulärer Breite bei ausgewählter Karte bemerken und den gepushten Bildschirm entfernen, damit die Teilung übernimmt.

Kiradex mit einer geöffneten Karte, vor und nach dem Aufklappen. Auf dem geschlossenen äußeren Display: die Karte auf schwarzer Bühne über ihren Details. Auf dem geöffneten inneren Display: dieselbe Karte groß links auf schwarzem Bildschirm, ihre Details in einem weißen Rechteck rechts und ein Zurück-Button oben in der Leiste

Dieselbe Karte vor und nach dem Aufklappen. Der Zustand hat überlebt; das Layout ist das kompakte, gestreckt.

Reguläre Breite ist nicht „das Duo“. Die App behandelt reguläre Breite als inneres Display: Wand, gerade Spaltenzahl, Teilung. Ein 6,9-Zoll-iPhone auf der Seite ist ebenfalls reguläre Breite, mit kompakter Höhe, und die App sperrt die Ausrichtung nicht. Läuft sie dort, erzeugt derselbe Zweig eine vom linken Rand eingerückte Seite, einen Inspektor, dessen Detailspalte für den Kartennamen zu schmal ist, und Aktionsbuttons, die an der Unterkante des Bildschirms abgeschnitten werden. Nichts davon ist neu in iOS 27, und in keiner Duo-Pose, die ich durchgespielt habe, trat es auf; die Duo-Arbeit hat es gefunden, weil zum ersten Mal jemand das Layout für reguläre Breite auf jedem Bildschirm durchging, der eine solche meldet. Unterscheiden lassen sich beide Fälle über die andere Size Class: Das innere Display ist in beiden Richtungen regular, und Apples Talk gibt das äußere Display auf der Seite liegend als compact in beiden an.3 Ein Layout, das in zwei Richtungen Platz braucht, sollte nach beiden fragen.

Kiradex auf einem 6,9-Zoll-iPhone im Querformat mit ausgewählter Karte: Die Kartenseite beginnt erst etwa bei einem Fünftel der Bildschirmbreite, die Bühne der Karte sitzt daneben, und das Detailfeld rechts ist so schmal, dass der Kartenname über drei Zeilen umbricht und die Buttons Have und Want an der Unterkante des Bildschirms abgeschnitten sind

Das Layout für reguläre Breite auf einem Telefon, das kein Duo ist: ein 6,9-Zoll-iPhone auf der Seite, iOS 27.0.

Die Tastatur verdeckt die Leiste. Ist die Tastatur auf dem äußeren Display eingeblendet, liegen die Tabs unten in der Leiste dahinter. Das ist das Layout des Systems, kein Fehler; der Talk sagt, die Leiste müsse womöglich überlaufen, „as other competing UI appears, like the keyboard“ (wenn andere konkurrierende UI erscheint, etwa die Tastatur) (11:50).4 Sie steht auf dieser Liste, weil sie das Werkzeug kaputt gemacht hat: Mein erster Rundgang tippte bei eingeblendeter Suchtastatur auf „Collection“, und der Tipp landete auf dem Buchstaben P. UI-Tests, die davon ausgehen, dass eine Tab-Leiste immer erreichbar ist, scheitern hier zuerst.

Zwei kleinere Dinge. Die App wählt gerade Spaltenzahlen anhand der Size Class der Breite, während der Talk vorschlägt, sich an der eigenen Region des Falzes zu orientieren, ob vorhanden oder nicht. Und eines, das mit dem Falten nichts zu tun hat: Viermal hintereinander auf dem 6,9-Zoll-Simulator geöffnet, zeigte der Vollbildbetrachter beim ersten Mal die Karte und bei den nächsten drei einen leeren schwarzen Bildschirm. Keines von beiden hält einen TestFlight-Build auf. Beide blieben unsichtbar, bis die App auf einem Bildschirm lief und etwas ihre Buttons der Reihe nach drückte.

Was der Simulator nicht zeigen konnte

Den Scanner. Er öffnet die rückseitige Weitwinkelkamera und nutzt bereits einen Rotation Coordinator, wie es der Kamera-Talk verlangt: „On iPhone Duo, the rotation coordinator will update when your app moves displays.“ (Auf dem iPhone Duo aktualisiert sich der Rotation Coordinator, wenn Ihre App das Display wechselt.) (8:19)6 Ob die Session den Wechsel von einem Display zum anderen übersteht, ist eine Frage für die Hardware; der Simulator hat überhaupt keine Kamera. Apples Release Notes zählen außerdem StandBy und die meisten App-Extensions zu dem, was diese Runtime nicht ausführen kann, und die Notes zu Xcode 27.2 beta 2 ergänzen einen Punkt für alle, die Aufnahmen automatisieren: „Screenshots and recordings in iPhone Duo may be black for up to a few minutes after booting the device.“ (Screenshots und Aufnahmen im iPhone Duo können nach dem Hochfahren des Geräts bis zu einige Minuten lang schwarz sein.)20

Ein Quellbaum, zwei Xcodes

Der Kalender schafft ein Problem. Der Build, den der Store annimmt, stammt aus Xcode 27 mit dem 27.0-SDK; der Build, der sich auf dem iPhone Duo richtig verhält, stammt aus dem 27.1-SDK. Bis Apple den Store für Letzteren öffnet, muss eine App, die ein Update ausliefern und zugleich an ihrem Duo-Layout weiterarbeiten will, unter beiden kompilieren.

if #available(iOS 27.1, *) bringt Sie nicht ans Ziel. Verfügbarkeit ist eine Frage der Laufzeit; der Compiler muss das Symbol trotzdem finden. Kiradex umschließt seine beiden Duo-Aufrufe genau auf diese Weise, und sein Deployment Target ist 27.0, damit sich der Build auf einem Telefon installiert, das noch nicht aktualisiert wurde. Unter dem 27.1-SDK kompiliert das. Unter Xcode 27.0 bricht eine Datei, die dasselbe tut, mit error: cannot find 'ArrangementView' in scope ab, weil das 27.0-SDK keinen solchen Typ hat.14 Kiradex ist noch nicht im Store und kann deshalb einfach bei der Beta-Toolchain bleiben; eine App mit Kunden kann das nicht.

Auch die dokumentierten Bedingungen von Swift unterscheiden die beiden SDKs nicht. #if compiler(>=6.4) ist unter beiden wahr: Xcode 27.0, Xcode 27.1 beta und Xcode 27.2 beta geben alle dasselbe Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1) aus.14 Bleiben zwei Zäune, und ich habe beide ausprobiert.

Eine selbst gesetzte Compilation Condition. Das ist der dokumentierte Weg. Definieren Sie ein Flag nur in der Konfiguration, die Sie mit der Beta bauen (in Xcode SWIFT_ACTIVE_COMPILATION_CONDITIONS = DUO_SDK, auf der Kommandozeile -D DUO_SDK), und zäunen Sie den Code, der nur unter 27.1 existiert, damit ein:

struct Pair<Primary: View, Secondary: View>: View {
    @ViewBuilder var primary: Primary
    @ViewBuilder var secondary: Secondary

    var body: some View {
        #if DUO_SDK
        if #available(iOS 27.1, *) {
            ArrangementView { primary } secondary: { secondary }
                .arrangementViewStyle(.split)
        } else {
            HStack(spacing: 0) { primary; secondary }
        }
        #else
        HStack(spacing: 0) { primary; secondary }
        #endif
    }
}

Ohne das Flag besteht diese Datei die Typprüfung unter Xcode 27.0 und unter der 27.1-Beta. Mit dem Flag besteht sie sie unter der Beta und scheitert unter 27.0 mit demselben Fehler wegen des fehlenden Symbols: Die falsche Kombination lässt sich nicht bauen.14

Die eigene Version des SDKs, vom Compiler gelesen. canImport nimmt ein zweites Argument mit Unterstrich, das mit der Version eines Moduls verglichen wird, und die Modulversion von SwiftUI unterscheidet sich zwischen den SDKs: 8.0.84.1.104 im 27.0-SDK, 8.0.85.27 im 27.1-SDK, 8.1.6.1.101 im SDK der 27.2-Beta.14 Das hier braucht also keine Build-Einstellung:

#if canImport(SwiftUI, _version: 8.0.85)
// ArrangementView, reservedRegions, onHingeChange, toolbarVerticalBehavior
#else
// what the app did before
#endif

Ich habe in jeden Zweig ein #warning gesetzt und das Ganze mit allen drei Xcodes kompiliert: 27.0 nahm den zweiten Zweig, die 27.1-Beta und die 27.2-Beta nahmen den ersten.14 Die Vorsicht steckt im Unterstrich. Die Grammatik des Swift-Buchs für diese Bedingung lautet canImport(import-path) und nicht mehr, _version: ist also eine Compilerfunktion ohne dokumentierten Vertrag, und die Zahl 8.0.85 habe ich aus zwei SDKs herausgelesen, Apple hat sie nicht veröffentlicht.14 Nutzen Sie sie, solange der Store für 27.1 geschlossen ist, falls eine Build-Einstellung in Ihrem Setup umständlich ist; nehmen Sie das Flag, wenn Sie etwas wollen, das Sie verteidigen können.

So oder so ist der Zaun vorübergehend. An dem Tag, an dem App Store Connect Builds aus einem Xcode mit dem 27.1-SDK annimmt, löschen Sie ihn und behalten die #available-Prüfungen, denn sie schützen ein Telefon, das noch unter iOS 27.0 läuft.

Einreichen: was App Store Connect heute annimmt

TestFlight nimmt den 27.1-Build. Die Release Notes von App Store Connect vom 18. September: „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.“ (Apps, die mit Xcode 27.1 beta und dem SDK für iOS 27.1 beta oder iPadOS 27.1 beta gebaut sind, lassen sich jetzt für internes und externes Testen einreichen.) Die Einträge vom 16. und 28. September sagen dasselbe für Xcode 27.2 beta und beta 2.8 Kiradex geht diesen Weg; sein fünfter Build, der, den dieser Beitrag testet, wurde am 2. Oktober hochgeladen, und App Store Connect führt ihn als gültig.13

Der App Store nimmt ihn noch nicht. Der jüngste Eintrag, der den Store öffnet, stammt vom 14. September: „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.“ (Apps, die mit Xcode 27 und den 27.0-SDKs gebaut sind, lassen sich jetzt für den App Store sowie für internes und externes Testen über TestFlight hochladen.)8 Nichts danach erwähnt 27.1 und den Store im selben Satz, und Apples Releases-Feed, dessen neueste Einträge auf den 28. September datiert sind, führt einen einzigen Build von Xcode 27.1, die Beta vom 18. September.8 Apple hat nicht gesagt, wann sich das ändert. Das Gerät kommt am 23. Oktober in den Handel.1

Öffnet Apple den Store nicht vor dem 23. Oktober für das 27.1-SDK, ist der Store-Build, den Ihre Kunden am Verkaufsstart haben, bestenfalls ein Build mit dem 27.0-SDK, und der Vergleich oben sagt, was er im Simulator bekommt, wobei Apples Talk dieselbe mittlere Stufe beschreibt: den Bildschirm neben der Statusleiste, waagerechte Leisten, keinen Falz. Das ist eine brauchbare App, wenn sie sich sauber in der Größe anpasst, und genau das spricht dafür, die Arbeit an der Größenanpassung jetzt mit Xcode 27 auszuliefern.

Ein Startbildschirm ist jetzt Pflicht. Keine Duo-Regel, aber sie kommt mit demselben SDK, und sie scheitert beim Upload, nicht bei der Prüfung. Apples Technote: „Starting in iOS 27 and iPadOS 27, App Store Connect requires your app to include a launch screen configuration in its Info.plist,“ (Ab iOS 27 und iPadOS 27 verlangt App Store Connect eine Startbildschirm-Konfiguration in der Info.plist), und ohne einen der Schlüssel UILaunchStoryboardName, UILaunchStoryboards, UILaunchScreen oder UILaunchScreens wird der Upload mit „ITMS-90870: Missing launch screen.“ abgelehnt.10 Kiradex deklariert UILaunchScreen mit einer Farbe, dem Rot seines Covers, sodass der Start direkt in die Eröffnungsanimation übergeht.13

Die Screenshot-Plätze gibt es auf dem Papier. Die Screenshot-Spezifikationen von App Store Connect führen das iPhone Duo seit dem 9. September, in zwei Paaren: 1398 mal 2034 oder 2034 mal 1398 Pixel für das äußere Display und 2007 mal 2853 oder 2853 mal 2007 für das innere, mit dem Hinweis „Support for uploading assets for this device in App Store Connect will be available later this year.“ (Der Upload von Assets für dieses Gerät in App Store Connect wird im Laufe des Jahres unterstützt.)9 Die üblichen Regeln gelten: „You can upload one to 10 screenshots in .jpeg, .jpg, and .png formats,“ (Sie können ein bis 10 Screenshots in den Formaten .jpeg, .jpg und .png hochladen) und „Images can’t include alpha channels or transparencies.“ (Bilder dürfen keine Alphakanäle oder Transparenzen enthalten.)9

Ein Satz auf der Upload-Seite entscheidet, wie Sie darum herum planen: „Once your app is submitted for review and approved, you must create a new version to update the screenshots.“ (Ist Ihre App eingereicht und freigegeben, müssen Sie eine neue Version anlegen, um die Screenshots zu ändern.)9 Duo-Screenshots lassen sich später nicht einzeln nachschieben; wenn die Plätze aufgehen, fahren sie auf einer Version mit.

Zusammengenommen die Reihenfolge, die ich ansetzen würde und für Kiradex gerade ansetze:

  1. Der 27.1-Build jetzt in TestFlight, mit den Befunden des Rundgangs, behoben, sobald sie auftauchen.
  2. Für eine App, die schon im Store ist: ein mit Xcode 27 gebautes Update, das jede Korrektur enthält, die das 27.1-SDK nicht braucht. Size Classes statt Prüfungen auf Idiom und Ausrichtung, Safe Areas pro Kante, Leisten im Besitz von Systemcontainern, Titel und Symbol auf jedem Toolbar-Element.
  3. Screenshots jetzt in den Duo-Größen aus dem Simulator aufnehmen und aufheben.
  4. Eine Version bereithalten für den Tag, an dem zwei Dinge zutreffen: Ein Xcode mit dem 27.1-SDK wird für den Store akzeptiert, und die Duo-Plätze nehmen Uploads an. Apple hat bisher jede Änderung dieser Art in den Release Notes von App Store Connect bekannt gegeben, darunter den Eintrag vom 14. September, der den Store für das Release von Xcode 27 öffnete, und den vom 9. September, der die Duo-Screenshot-Spezifikationen hinzufügte; das ist also die Seite, die Sie beobachten sollten, und daneben die Seite mit den Entwicklernachrichten.8

Eine weitere Anforderung liegt weiter in der Zukunft. Ab April 2027 gilt „iOS and iPadOS apps must be built with the iOS 27 & iPadOS 27 SDK or later“ (iOS- und iPadOS-Apps müssen mit dem SDK für iOS 27 und iPadOS 27 oder neuer gebaut sein), damit sie sich überhaupt hochladen lassen.18 Eine App, die noch mit einem iOS-26-SDK gebaut wird, bekommt auf einem Duo das kleinste der drei Bilder oben, und ab April 2027 kann sie kein Update hochladen, bis sie auf das iOS-27-SDK wechselt.

Screenshots für zwei Displays

Das Rohmaterial hat der Rundgang bereits geliefert: Jede Station wurde mit 1398 mal 2034 und 2853 mal 2007 Pixeln aufgenommen und gedreht mit 2034 mal 1398 und 2007 mal 2853, alle vier Größen aus der iPhone-Duo-Zeile von App Store Connect.913 Bleibt zu entscheiden, was um sie herum steht, und genau hier lädt ein faltbares Telefon zu einem Fehler ein.

Das Bild, das alle wollen, ist das halb geöffnete Telefon schräg im Raum, die App fließt über den Falz. Apples Marketingrichtlinien schließen es Zeile für Zeile aus. Für Apples eigene Gerätebilder: „Use Apple product images ‘as is’ and without modification. Modifications include adding reflections, shadows, highlights, or graphic elements that appear to enter or come out of the product screen; cropping, tilting, or obstructing any part of the images; animating, flipping, or spinning the images“ (Apple-Produktbilder unverändert verwenden; als Veränderung gelten Spiegelungen, Schatten, Glanzlichter oder Grafiken, die in den Bildschirm hinein- oder aus ihm herauszuragen scheinen, Beschneiden, Kippen oder Verdecken sowie Animieren, Spiegeln oder Drehen). Für Bildmaterial, das Sie selbst erstellen: „Straight-on product shots are preferred. Don’t use extreme angles or alter an Apple product in any way.“ (Frontale Produktaufnahmen werden bevorzugt; keine extremen Winkel und keinerlei Veränderung an einem Apple-Produkt.) Und unter „Unauthorized Uses“ (unzulässige Verwendungen) steht ganz oben: „Rendering in 3D or creating any simulation of an Apple product“ (ein Apple-Produkt in 3D rendern oder auf irgendeine Weise simulieren).11 Mein Beitrag über Screenshots geht durch, wie die Preisträger mit diesen Regeln umgehen und wie ein Satz aussieht, der sie einhält; ein Scharnier ändert daran nichts.

Was Apple Ihnen stattdessen gibt, ist ein Rahmenpaket für dieses Telefon, in zwei Ausführungen und fünf Ansichten: das geschlossene Telefon im Hoch- und Querformat, das geöffnete innere Display im Quer- und Hochformat und das geöffnete Telefon von hinten mit dem äußeren Display neben den Kameras. Die Öffnungen in diesen Dateien haben exakt die Screenshot-Größen, eine Simulator-Aufnahme passt also ohne Skalierung hinein.11 Eine halb gefaltete Ansicht gibt es nicht, eine schräge auch nicht.

Die Rahmen unten bestehen deshalb aus drei Teilen: einem Grund in den eigenen Farben der App, einer kurzen Textzeile und der Aufnahme in Apples Rahmen, ganz und aufrecht, mit nichts darüber. Abwechslung entsteht durch den Grund, die Größe des Geräts und einen Rahmen pro Satz, der gar kein Gerät zeigt: die Vollbildkarte der App auf Schwarz, also das eigene 3D der App und niemandes Hardware.

Drei Reihen von App-Store-Screenshots für Kiradex. Sechs Rahmen für ein 6,9-Zoll-iPhone, fünf für das äußere Display des iPhone Duo, fünf für sein inneres Display im Querformat. Jeder Rahmen hat eine kurze Überschrift wie Your collection. In your hands. oder Open it. The binder fills the wall., einen roten, grünen oder dunklen Grund und den Bildschirm der App in einem frontalen Apple-Geräterahmen; je ein Rahmen in der ersten und dritten Reihe zeigt eine einzelne Sammelkarte auf Schwarz mit der Überschrift Turn it over.

Drei Sätze, per Skript aus den Aufnahmen des Rundgangs komponiert, mit 1320 mal 2868, 1398 mal 2034 und 2853 mal 2007 Pixeln. Sie zeigen die Methode, nicht den Store-Eintrag: Diese Aufnahmen tragen Katalogkarten, und was der Store-Satz zeigt, ist die offene Frage im dritten Hinweis unten.

Drei praktische Hinweise aus der Arbeit daran.

Per Skript komponieren. Die Sätze oben stammen aus einer einzigen Python-Datei, die eine Aufnahme, eine Überschrift und einen Grund entgegennimmt und ein PNG in exakter Größe ohne Alphakanal schreibt. Ändert sich die App, und diese änderte sich an dem Tag, an dem ich sie aufnahm, zweimal, läuft der Rundgang erneut, und die Rahmen bauen sich neu.

Zeigen Sie, was das Telefon hinzufügt. Apples Upload-Seite sagt, ein 6,9-Zoll-Satz genüge, wenn die Oberfläche auf allen Größen gleich ist: „provide only the highest resolution screenshots required. They automatically scale down to smaller device sizes.“ (Liefern Sie nur die Screenshots mit der höchsten erforderlichen Auflösung; sie werden automatisch auf kleinere Geräte verkleinert.)9 Auf diesem Telefon ist sie nicht gleich: Die Kartenwand und der geteilte Inspektor existieren nur auf dem inneren Display. Mit diesen beiden Rahmen beginnt der innere Satz.

Achten Sie darauf, was auf dem Bildschirm ist. Dieselben Richtlinien sagen: „You are responsible for securing the rights to all materials used in screen content within your app.“ (Sie sind dafür verantwortlich, die Rechte an allen Materialien zu sichern, die im Bildschirminhalt Ihrer App verwendet werden.)11 Eine Sammler-App zeigt ihrem Wesen nach die Kunstwerke anderer Leute, und ein Store-Eintrag ist Werbung, also etwas anderes als das, was die App im Gebrauch anzeigt. Diese Entscheidung haben wir für Kiradex noch nicht getroffen, und die Rahmen oben werden so, wie sie sind, nicht eingereicht. Aus diesem Grund hat der Rundgang einen zweiten Modus, der mit sechs erfundenen Karten läuft; sie haben noch keine Illustrationen, ein eingereichter Satz bedeutet also, Platzhalter zu gestalten oder die Rechtefrage zu klären.

Kiradex hat noch keinen Store-Eintrag. Sobald es einen gibt, beginnt er mit einem 6,9-Zoll-Satz, und die Duo-Sätze warten mit einer eigenen Version auf den Tag, an dem App Store Connect sie annimmt.

Die Arbeit an einen Coding-Agenten übergeben

Das meiste an dieser Arbeit ist von der Art, die ein Agent gut erledigt, sofern er die App sehen kann. Zwei Hälften, und eine davon liefert Apple mit.

Die statische Hälfte gehört Apple. Der erste Tech Talk endet mit ihr: „During the talk, Modernize Your UIKit App, we introduced a new app modernization skill. With Xcode 27.1, this skill has a new name: App Resizability. It now supports SwiftUI and iPhone Duo.“ (Im Talk „Modernize Your UIKit App“ haben wir einen neuen Skill zur App-Modernisierung vorgestellt; mit Xcode 27.1 heißt er App Resizability und unterstützt nun SwiftUI und das iPhone Duo.) (9:19)3 Der Skill ist ein Satz einfacher Textdateien innerhalb der Beta: in Xcode 27.1 beta Contents/PlugIns/IDEIntelligenceChat.framework/Versions/A/Resources/app-resizability.idechatprompttemplate und fünf Referenzdateien daneben.15 Seine Anweisungen sagen, wie weit das Netz auszuwerfen ist: „Treat a request about the foldable iPhone Duo as a request for every task in the Task Registry, because a screen that changes size exposes all of them at once.“ (Behandeln Sie eine Anfrage zum faltbaren iPhone Duo als Anfrage nach jeder Aufgabe im Task Registry, denn ein Bildschirm, der seine Größe ändert, legt alle auf einmal offen.)15

Es lohnt sich, ihn zu lesen, auch wenn Sie ihn nie ausführen, denn er ist Apples Prüfliste in Schriftform. Er prüft drei Projekteinstellungen und ändert keine davon (einen Schlüssel für den Startbildschirm, die Deklaration der iPad-Ausrichtungen, UIRequiresFullScreen), und dann sucht er fünf Muster: UIScreen.main, Layout nach Oberflächenausrichtung, Layout nach userInterfaceIdiom, App-Lebenszyklus, wo der Szenen-Lebenszyklus hingehört, und Safe-Area-Code, der annimmt, dass beide Seiten gleich sind. Die Safe-Area-Datei enthält den Satz, der die Hälfte dessen erklärt, was auf diesem Telefon schiefgeht: „Asymmetric horizontal insets are the normal case. Where a vertical bar is present, one horizontal edge usually carries the whole inset and the other carries zero.“ (Asymmetrische horizontale Insets sind der Normalfall; wo eine senkrechte Leiste vorhanden ist, trägt meist eine Kante den ganzen Inset und die andere null.)15

Kiradex ist eine SwiftUI-App aus diesem Jahr, und diese fünf Suchen finden darin nichts.13 Jeder Befund oben stammt aus dem Ausführen. Das ist die Grenze der statischen Hälfte: Sie liest Quellcode, und der Falz, die Leiste und die Tastatur sind nur auf einem Bildschirm sichtbar.

Die andere Hälfte ist ein Rundgang, den der Agent ausführen und anschauen kann. Möglich wurde das Audit oben durch drei kleine Bausteine, und keiner davon ist an diese App gebunden:

  1. Ein UI-Test, der jede Art von Bildschirm besucht und an jedem anhält. Keine Assertions, sondern eine Tour. Unsere öffnet den Dex, eine Serie, eine Karte, ein Sheet, die Sammlungsliste, eine Karte aus der Sammlung, den Vollbildbetrachter und die Suche mit eingeblendeter Tastatur: acht Stationen.13
  2. Eine Aufnahme, die auf dem Mac stattfindet, nicht im Test. Der eigene Screenshot eines UI-Tests zeigt ein Display. simctl erreicht beide:
xcrun simctl io "$UDID" screenshot --type=png --display=primary   outer.png
xcrun simctl io "$UDID" screenshot --type=png --display=primary-1 inner.png

Der Test schreibt eine leere Datei, benannt nach der Station; eine Shell-Schleife auf dem Mac bemerkt sie, nimmt beide Displays auf und antwortet mit einer zweiten Datei; der Test wartet darauf und geht weiter. Die äußere Aufnahme hat bei geschlossenem Telefon 1398 mal 2034 Pixel und die innere bei geöffnetem 2853 mal 2007, die Bilder des Audits und die Screenshots für den Store entstehen also im selben Durchlauf.913 3. Eine Möglichkeit, die Pose ohne Hand an der Maus zu wechseln. simctl hat keinen Pose-Befehl, und die UI-Test-Frameworks in dieser Beta haben keinen Scharnier-Aufruf, den ich hätte finden können, also drückt das Skript die Buttons Closed, Book, Open und Rotate Right in Device Hub über die Bedienungshilfen-API, was auch mit Device Hub im Hintergrund funktioniert.13

Damit hört die Prüfung der App in jeder Pose auf, eine Bitte um die Meinung des Agenten zu sein, und wird zu einem Ordner mit Bildern pro Pose, den er und Sie lesen können. Das Briefing unten ist das, was ich übergeben würde. Es ist zum Einfügen geschrieben.

Goal: make this app correct on iPhone Duo in every pose, without device checks.

0. Toolchain. Build with Xcode 27.1 beta. Confirm the binary is stamped with the 27.1 SDK:
   otool -l <App>.app/<App> | grep -A4 LC_BUILD_VERSION      (debug builds: <App>.debug.dylib)
   If "sdk" is lower than 27.1, stop: nothing below will reproduce.

1. Static pass. Report every use, with file and line, of:
   UIScreen.main / UIScreen.mainScreen; userInterfaceIdiom; interface orientation used for layout;
   a UIApplicationDelegate doing scene work; one safe-area inset applied to both sides;
   a bare ignoresSafeArea() on anything a person reads or taps; fixed widths tied to a phone size;
   toolbars or tab bars built by hand instead of owned by NavigationStack, NavigationSplitView or TabView;
   toolbar items with a title and no symbol, or a symbol and no title.
   Confirm Info.plist has a launch screen key and no orientation lock the design does not need.

2. Walk. Run the screenshot tour in each pose and capture BOTH displays at every stop:
   closed; closed and turned; open; open and turned; partly folded; partly folded and turned.
   If no tour exists, write a UI test that stops at each kind of screen and signals a host script, and have
   the script capture with:  xcrun simctl io <udid> screenshot --display=primary     (outer)
                             xcrun simctl io <udid> screenshot --display=primary-1   (inner)
   Poses are buttons in Device Hub (Closed, Book, Open, Rotate Right); simctl has no pose command.

3. Read every capture and answer, per pose:
   - Are the bars where the system puts them (down the side closed and in open landscape, across the top
     and bottom in open portrait)? Is any toolbar item missing from the bar and from the overflow menu?
   - Does any sheet reserve the side rail and leave it empty?
   - With the keyboard up, what is covered? Can every tab still be reached once it is dismissed?
   - Does anything sit under the outer camera corner or the status column?
   - Open: does a grid have an even number of columns? Does any control or line of text cross the middle?
   - Partly folded: does content move off the fold? Do sheets and alerts land on one side?
   - Turned: did a two-pane layout stack when it should have stayed side by side, or the reverse?
   - Is the same selection, scroll position and navigation path still there after the pose changed?

4. Fix with, in this order: a system container that already adapts; size classes; ArrangementView for a
   custom two-pane layout; reservedRegions for hand-placed content. Never branch on the device model,
   the idiom, the orientation, or the raw hinge angle to decide layout.

5. Guard everything from the 27.1 SDK with `if #available(iOS 27.1, *)` and a fallback that keeps both
   panes reachable. If the same source must also build with Xcode 27.0, fence it at compile time.

6. Report what could not be checked in the simulator: cameras, StandBy, extensions, haptics, real reach.

Apples Material, in der Reihenfolge, in der ich es nutzen würde

Alles, was Apple für dieses Gerät veröffentlicht hat, hängt an einer Seite, Get ready for iPhone Duo.19 In Arbeitsreihenfolge:

Was Warum Sie es öffnen
Prepare your app for iPhone Duo (Tech Talk) Die drei SDK-Stufen, Size Classes, Safe Areas. Fangen Sie hier an
Preparing your app for iPhone Duo (Leitfaden) Derselbe Stoff als Text, mit jeder API beim Namen. Die vier Prüfungen unter „Address common layout and resizing considerations“ sind die Audit-Liste2
Raise the bar with iPhone Duo Senkrechte Leisten: was hineingehört, was draußen bleibt, Überlauf
Strike a pose with adaptive layouts on iPhone Duo Der Falz: Verdrängung, reservierte Regionen, Arrangement-Views
Designing for iPhone Duo (HIG) und Design for iPhone Duo Die Regeln, an denen ein Designer Sie messen wird7
Leverage multiple displays and scenes on iPhone Duo Das Scharnier, Split View, eine zweite Szene auf dem äußeren Display
Build a great camera experience for iPhone Duo Nur wenn Sie aufnehmen: zwei Frontkameras und in welche Richtung jede zeigt6
Aufzeichnungen der Group Labs, Tag 1 und Tag 2, sowie die Forum-Q&As zu SwiftUI, UIKit und Photos and Camera Apple-Ingenieure beantworten Fragen von Entwicklern19
Apple Design Resources Kits für Figma und Sketch und die Produktrahmen fürs Marketing11
Außerhalb von Apple: der Simulator-Leitfaden von SwiftLee, iPhone Duo by Examples, die Checkliste von BleepingSwift, der Leitfaden von Adapty Eine Testliste und der Scharnier-Schieberegler; ein lauffähiges Beispiel pro API, mit Praxisnotizen; eine kurze Checkliste; der einzige, den ich gefunden habe, der eine Paywall durcharbeitet17
Workshops Vor Ort. SwiftLee beschreibt sie als Termine „with the opportunity to test your app on a physical device,“ (mit der Gelegenheit, Ihre App auf einem echten Gerät zu testen), was vor dem 23. Oktober der einzige Weg ist, eine Kamera zu prüfen1719

Die Zusammenfassung der Fragen und Antworten aus den Group Labs und die Forum-Threads habe ich nicht gelesen: Apples Forumsseiten beantworten einen automatisierten Abruf mit einer Seite zur menschlichen Verifizierung, und ich habe sie nicht umgangen.

Die wichtigsten Erkenntnisse

  • Wenn Sie heute eine App ausliefern: Bringen Sie die Arbeit an der Größenanpassung jetzt heraus, gebaut mit Xcode 27. Das ist es, was Ihre Kunden am 23. Oktober auf einem Duo haben, falls der Store an diesem Tag noch für das 27.1-SDK geschlossen ist, und nichts davon braucht die Beta.
  • Wenn Sie die Duo-APIs übernehmen: Bauen Sie mit Xcode 27.1 beta, bestätigen Sie sdk 27.1 oder höher mit otool, halten Sie den Build in TestFlight und zäunen Sie die Aufrufe ein, die es nur unter 27.1 gibt, falls derselbe Quellcode weiterhin für den Store bauen muss.
  • Wenn Sie testen: Lesen Sie nicht den Code, spielen Sie die Posen durch. Geschlossen, offen, teilweise gefaltet, jeweils auch gedreht, ein Sheet, die Tastatur, eine Vollbildansicht und ein Bildschirm, der über das Aufklappen hinweg offen bleibt. Nehmen Sie jedes Mal beide Displays auf.
  • Wenn Sie den Store-Eintrag gestalten: Nehmen Sie jetzt in den Duo-Größen auf, komponieren Sie per Skript, verwenden Sie Apples Rahmen frontal und halten Sie eine Version bereit für den Tag, an dem die Plätze aufgehen.
  • Wenn Sie das einem Agenten übergeben: Geben Sie ihm den Rundgang, nicht nur die Dateien. Apples Skill App Resizability deckt ab, was sich durch Lesen finden lässt; alles in den Befunden oben wurde durch Hinsehen gefunden.

Häufige Fragen

Läuft meine bestehende App unverändert auf dem iPhone Duo?

Ja. Apples Talk verspricht es für jedes SDK, und der Simulator bestätigt es: Ein mit dem iOS-26-SDK gestempelter Build lief als Fenster von 375 mal 667 Punkten, und einer mit dem Stempel 27.0 füllte den Bildschirm neben der Statusleiste, mit waagerechten Leisten. Keiner von beiden bekommt senkrechte Leisten oder reservierte Regionen.312

Welches Xcode brauche ich für das volle iPhone-Duo-Layout?

Xcode 27.1 beta (27A9269), das das iOS-27.1-SDK und den einzigen iPhone-Duo-Simulator enthält. Seine 27.1-Simulator-Runtime unterstützt nur den Gerätetyp iPhone Duo, andere iPhones werden also auf der 27.0-Runtime getestet. Das SDK der Xcode-27.2-Beta hat dieselben APIs, und eine mit 27.2 gestempelte Probe-App verhielt sich im Simulator wie 27.1, aber dieses Xcode hat kein Duo, auf dem sie laufen könnte.81214

Kann ich heute einen iPhone-Duo-Build im App Store einreichen?

Keinen, der mit dem 27.1-SDK gebaut ist, Stand 2. Oktober 2026. App Store Connect nimmt Builds aus den Betas von Xcode 27.1 und 27.2 für internes und externes Testen in TestFlight an und Builds aus Xcode 27 für den Store. Apple hat kein Datum für die Änderung genannt.8

Welche Screenshot-Größen verlangt App Store Connect für das iPhone Duo?

1398 mal 2034 oder 2034 mal 1398 Pixel für das äußere Display und 2007 mal 2853 oder 2853 mal 2007 für das innere Display, ein bis zehn Bilder ohne Alphakanal. Der Upload ist als „later this year“ (im Laufe des Jahres) angekündigt.9

Wie nehme ich beide Displays des iPhone-Duo-Simulators auf?

xcrun simctl io <udid> screenshot --display=primary für das äußere Display und --display=primary-1 für das innere. Der eigene Screenshot eines UI-Tests erfasst ein Display.13

Warum sind die Leisten meiner App im iPhone-Duo-Simulator noch waagerecht?

Drei Ursachen, in der Reihenfolge, in der Sie sie prüfen sollten. Das Binary ist nicht mit dem 27.1-SDK gestempelt. Die Leisten sind selbst gebaut, statt einem TabView, NavigationStack oder NavigationSplitView zu gehören. Oder das innere Display steht im Hochformat, wo Apple die Leisten absichtlich waagerecht hält.2712

Brauche ich für jede Pose ein eigenes Layout?

Nein. Apples Richtlinien sehen zwei Layouts vor, kompakte und reguläre Breite, dazu eine Reaktion auf den Falz, wo Inhalt ihn kreuzen würde. Kiradex hat diese beiden und eine Arrangement-View; die Pose Book brauchte keinen Code.713

Verwandtes auf dieser Website: Der Simulator-Beitrag enthält die Installationsschritte, das Geräteprofil und die korrigierten Messungen pro Pose; Gestalten für das iPhone Duo liest Apples Gestaltungsrichtlinien als Regeln; der Duo-Beitrag für Entwickler hat die Hardwarezahlen und die datierte Chronik; der Beitrag über Screenshots begründet, was ein Satz sagen sollte; die Checkliste für das größenveränderliche iPhone ist die Xcode-27-Arbeit, die Sie laut diesem Beitrag zuerst ausliefern sollten; und der Xcode-27-Hub verfolgt die Toolchain.

Quellen


  1. Apple Newsroom, Apple unveils iPhone Duo, 9. September 2026, abgerufen am 2. Oktober 2026: „Pre-orders begin Friday, October 16, with availability beginning Friday, October 23.“ (Vorbestellungen ab Freitag, 16. Oktober, erhältlich ab Freitag, 23. Oktober.) und „iPhone Duo will be available with iOS 27.1.“ (Das iPhone Duo wird mit iOS 27.1 erhältlich sein.) ↩↩↩

  2. Apple, Preparing your app for iPhone Duo, Technology Overviews, abgerufen über den JSON-Endpunkt der Dokumentation am 2. Oktober 2026; zitiert sind die Übersicht und die Abschnitte „Address common layout and resizing considerations“, „Organize items in your bars“ und „Arrange views in different poses“. Der Satz der Übersicht zu den Xcode-Versionen lautete anders, als diese Website ihn am 17. September 2026 zitierte („Build your app with Xcode 27.1 or later to use all of the available screen space on iPhone Duo. In earlier versions, your app doesn’t extend under the status bar and camera.“); der Duo-Beitrag für Entwickler auf dieser Website hielt den heutigen Wortlaut am 19. September fest. Die Seite trägt keinen Revisionshinweis. ↩↩↩↩↩↩

  3. Apple Developer Tech Talk, Prepare your app for iPhone Duo, David Jackson, UI Frameworks. Zitate aus der englischen Untertitelspur des Talks zu den angegebenen Zeitpunkten. ↩↩↩↩

  4. Apple Developer Tech Talk, Raise the bar with iPhone Duo, Anna, Ingenieurin bei UI Frameworks, und Maria, Human Interface Designer. Zitate aus der englischen Untertitelspur des Talks zu den angegebenen Zeitpunkten. ↩↩↩

  5. Apple Developer Tech Talk, Strike a pose with adaptive layouts on iPhone Duo, Maria, Human Interface Designer, und Harry, Ingenieur bei UI Frameworks. Zitate aus der englischen Untertitelspur des Talks zu den angegebenen Zeitpunkten. ↩↩↩

  6. Apple Developer Tech Talks, Leverage multiple displays and scenes on iPhone Duo und Build a great camera experience for iPhone Duo, Zitate aus den englischen Untertitelspuren zu den angegebenen Zeitpunkten; Apple, Choosing a camera by the direction it faces, AVKit, abgerufen am 2. Oktober 2026. ↩↩↩

  7. Apple, Designing for iPhone Duo, Human Interface Guidelines, abgerufen über den JSON-Endpunkt der Dokumentation am 2. Oktober 2026; zitiert sind die Abschnitte „Device poses“ und „Vertical controls“. ↩↩↩↩↩

  8. Apple, App Store Connect release notes, abgerufen am 2. Oktober 2026: zitiert sind die Einträge vom 14. und 18. September 2026; der Eintrag vom 9. September fügt die Screenshot-Spezifikationen für das iPhone Duo hinzu und sagt, dass deren Upload „will be available later this year“, der Satz, den die Spezifikationsseite wiederholt; die Einträge vom 16. und 28. September öffnen TestFlight in derselben Form für Xcode 27.2 beta und beta 2, für sechs Plattformen; kein Eintrag nach dem 18. September nennt Xcode 27.1 oder das iOS-27.1-SDK. Apple, Releases, RSS-Feed abgerufen am 2. Oktober 2026, letztes Build-Datum Mon, 28 Sep 2026 14:00:00 PDT: Ein Eintrag nennt Xcode 27.1, „Xcode 27.1 beta (27A9269)“, datiert auf Fri, 18 Sep 2026; der neueste Xcode-Eintrag ist „Xcode 27.2 beta 2 (27B5028f)“, datiert auf Mon, 28 Sep 2026. ↩↩↩↩↩↩↩↩↩↩↩

  9. Apple, Screenshot specifications und Upload app previews and screenshots, Hilfe zu App Store Connect, abgerufen am 2. Oktober 2026, zitiert. ↩↩↩↩↩↩↩↩↩↩

  10. Apple, TN3208: Preparing your app’s launch screen to meet App Store requirements, abgerufen am 2. Oktober 2026, zitiert; Revisionsverlauf: „2026-09-14 Updated the ITMS-90870 error message to reflect the iOS 27 launch screen requirement.“ und „2026-06-08 First published.“ ↩↩↩

  11. Apple, Marketing Resources and Identity Guidelines, Abschnitte „Apple Product Images“, „Unauthorized Uses“, „Screen Content“ und „Custom Photography and Video“, abgerufen am 2. Oktober 2026, zitiert. Apple, Apple Design Resources, Product Bezels, iPhone Duo (Photoshop und PNG), abgerufen am 2. Oktober 2026. Die Maße der Rahmen stammen vom Autor, aus den PNG-Dateien in Apples Bezel-iPhone-Duo.dmg: „Outer Closed Portrait“ misst 1574 mal 2194 Pixel mit einer transparenten Öffnung von 1398 mal 2034; „Inner Open Landscape“ misst 3093 mal 2247 mit einer Öffnung von 2853 mal 2007; das Paket enthält außerdem „Inner Open Portrait“, „Outer Closed Landscape“ und „Outer Open“, jeweils in Star White und Night Sky. Die Kameraaussparung in „Outer Closed Portrait“, innerhalb der Öffnung mit drei Pixeln pro Punkt gemessen, reicht quer von 400,3 bis 436,3 Punkten und nach unten von 29,7 bis 65,7; die Kamera-Okklusion der Probe-App reicht von 399 bis 436 und von 30 bis 67. ↩↩↩↩↩↩

  12. Durchläufe des Autors am 2. Oktober 2026: macOS 27.0 (26A428), Xcode 27.1 beta (27A9269), die iOS-27.1-Simulator-Runtime (24A94401) und ein aus dem Gerätetyp iPhone Duo erstellter Simulator. Die Probe-App, DuoProbe2, ist eine einzige Swift-Datei: ein TabView, dessen erster Tab einen NavigationStack mit fünf Toolbar-Elementen enthält, eine Anzeige der Größe aus GeometryProxy, der Size Classes, von toolbarVerticalEdge, onHingeChange und reservedRegions beider Arten mit .includeInactive, gelesen bei jeder Auswertung des Body und einmal pro Sekunde neu ausgewertet, ein ArrangementView im Split-Stil und eine UIKit-View, die ihr Fenster, den Bildschirm ihrer Fensterszene, UIScreen.main und das Trait verticalBarEdge protokolliert. Sie wurde aus dieser Datei dreimal mit swiftc gegen das 27.1-Simulator-SDK kompiliert, Deployment Target 27.1, wobei dem Linker mitgeteilt wurde, welche SDK-Version er festhalten soll (-Xlinker -platform_version -Xlinker ios-simulator -Xlinker 27.1 -Xlinker <26.0, 27.0 or 27.1>); otool -l gab für jedes Binary den passenden sdk-Wert aus. Die Posen wurden mit den Buttons Closed, Book, Open und Rotate Right in Device Hub gesetzt, gedrückt über die Bedienungshilfen-API. Konsolenzeilen, Stempel 27.1, geschlossen: size=382x562 ... h=compact v=regular verticalEdge=trailing safe=EdgeInsets(top: 82.0, leading: 0.0, bottom: 34.0, trailing: 84.0) divisions=0 occlusions=2, occlusion[0] active=true frame=(399,-52 37x37), occlusion[1] active=true frame=(382,-82 84x170), window=(466.0, 678.0), verticalBarEdge=2; offen: size=867x553 ... h=regular v=regular verticalEdge=trailing ... divisions=1 occlusions=2, division[0] active=false frame=(455,-82 40x669) margins=EdgeInsets(top: 0.0, leading: 20.0, bottom: 0.0, trailing: 20.0), occlusion[0] active=false frame=(677,-61 58x37), occlusion[1] active=true frame=(867,-82 84x120), window=(951.0, 669.0), hinge=fullyOpen 180 deg; Book: dasselbe mit division[0] active=true und hinge=partiallyOpen 127 deg; offen und gedreht: size=669x734 ... verticalEdge=nil ... divisions=1 occlusions=2, division[0] active=false frame=(0,321 669x40), window=(669.0, 951.0), mainScreen=(466.0, 678.0), verticalBarEdge=0; geschlossen und gedreht: size=594x350 ... h=compact v=compact verticalEdge=trailing, window=(678.0, 466.0). Die Rahmen sind in den Koordinaten der Anzeige-View angegeben, deren Ursprung 82 oder 134 Punkte unterhalb der Fensteroberkante liegt. Stempel 27.0: window=(386.0, 678.0) geschlossen, (871.0, 669.0) offen, (669.0, 871.0) offen und gedreht, (678.0, 386.0) geschlossen und gedreht, mit verticalEdge=nil und divisions=0 occlusions=0 in jeder Zeile jeder Pose. Stempel 26.0: window=(375.0, 667.0) geschlossen, offen, in Book sowie offen und gedreht, und (667.0, 375.0) geschlossen und gedreht, durchgehend mit h=compact. Bei jedem Start mit 27.1 protokollierten die ersten sechs bis neun Auswertungen divisions=0 occlusions=0, bevor die Regionen erschienen, drei davon, bevor die View eine Größe hatte. Die Positionen der Bereiche in den Posen Open und Book wurden aus den Aufnahmen gemessen: flach der primäre Bereich von x 8 bis 433,7 und der sekundäre von 433,7 bis 859; in Book der primäre bis 455,7, ein leeres Band bis 495,7, der sekundäre bis 859. Sheets, geschlossen: Inhalt 374x562 mit reinem Text-Done, ebenso mit Symbol auf Done, 450x428 und verticalEdge=nil mit .toolbarVerticalBehavior(.disabled); offen: 653x501 zentriert mit h=compact; Book: 459x501 an der führenden Kante. Mit der Arrangement-View über den ganzen Inhaltsbereich (eine Startoption) setzte ein schlichtes .split auf dem gedrehten Display den primären Bereich über den sekundären, und .split.axes(.horizontal) zeigte den primären Bereich allein; offen und flach teilte dieselbe View nebeneinander, und in Book ließ sie das Band des Falzes frei. Eine Probe-App, kompiliert wie im Beitrag vom 21. September beschrieben (swiftc -sdk bei nicht gesetztem SDKROOT), gab clang: warning: using sysroot for 'macOS 27.0' but targeting 'arm64-apple-ios27.1.0-simulator' aus und war mit sdk 27.0 gestempelt. Zwei weitere Builds liefen geschlossen und offen. PlainProbe, derselbe Tab-View, Navigationsstack und dieselbe Toolbar ohne irgendetwas aus dem 27.1-SDK, kompiliert von Xcode 27.0 (27A266a) gegen dessen eigenes iOS-27.0-SDK (otool: minos 27.0, sdk 27.0): window=(386.0, 678.0) geschlossen und (871.0, 669.0) offen. DuoProbe2 mit Stempel sdk 27.2: dieselben Zeilen wie mit Stempel 27.1 in beiden Posen. simctl list runtimes -j gibt für die 27.1-Runtime genau einen Eintrag unter supportedDeviceTypes an, iPhone Duo, und simctl create mit dem Typ iPhone 18 Pro Max auf dieser Runtime scheitert mit „Incompatible device“. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  13. Kiradex ist die App des Autors (941 Apps), Bundle-Version 1.0, Build 5, am 2. Oktober 2026 zu TestFlight hochgeladen und an diesem Tag von App Store Connect als gültig geführt. Projektangaben stammen aus dem Quellcode dieses Builds: Deployment Target iOS 27.0, gebaut mit dem 27.1-SDK (otool -l auf dem Binary der App: minos 27.0, sdk 27.1), UILaunchScreen mit einer Farbe, Hochformat und beide Querformate, ein TabView mit fünf Tabs und zwei Stellen mit #available(iOS 27.1, *), eine um ArrangementView und eine um onHingeChange. Die Zeile aus der Roadmap ist aus den eigenen Notizen des Projekts zitiert. Der Rundgang ist ein UI-Test, der an acht Arten von Bildschirm anhält und ein Host-Skript bittet, den Simulator mit simctl io <udid> screenshot --display=primary und --display=primary-1 aufzunehmen; er lief in sechs Posen auf dem iPhone-Duo-Simulator (iOS-27.1-Runtime), mit allen acht Stationen in fünf davon und sieben geschlossen und gedreht, sowie auf einem iPhone-18-Pro-Max-Simulator (iOS-27.0-Runtime, Hoch- und Querformat). Aufnahmegrößen: 1398 mal 2034 und 2034 mal 1398 (außen), 2853 mal 2007 und 2007 mal 2853 (innen), 1320 mal 2868 (6,9 Zoll). Die linke Kante des Inspektors wurde in den Aufnahmen des inneren Displays gemessen, flach bei x 433,7 und in der Pose Book bei 495,7. Der Aufklapp-Test startete die App geschlossen, nahm das innere Display fortlaufend auf und drückte Open; vier aufeinanderfolgende Einzelbilder zeigen die Eröffnung. Der Test mit offener Karte öffnete eine Karte im geschlossenen Zustand, drückte Open und nahm zwanzig Sekunden später auf. Der Betrachter-Test öffnete den Vollbildbetrachter viermal in einer Sitzung auf dem 6,9-Zoll-Simulator und vermaß jede Aufnahme: Die erste hatte 52 Prozent nicht schwarze Pixel, die anderen drei 0,3 Prozent. Eine Textsuche in den Frameworks XCTest und XCUIAutomation der Simulator-Plattform der Xcode-27.1-Beta nach „hinge“, „posture“, „DevicePose“ und „foldState“ fand nichts, und simctl führt keinen Pose-Befehl. ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  14. Test des Autors am 2. Oktober 2026. Eine Datei, die ArrangementView hinter if #available(iOS 27.1, *) verwendet, wurde mit swiftc -typecheck gegen das Simulator-SDK jedes installierten Xcode geprüft: Xcode 27.0 (27A266a) scheiterte mit error: cannot find 'ArrangementView' in scope; Xcode 27.1 beta (27A9269) und Xcode 27.2 beta (27B5019j) bestanden. Dieselbe Datei, eingezäunt mit #if DUO_SDK, bestand unter 27.0 ohne das Flag und unter der 27.1-Beta mit und ohne, und sie scheiterte unter 27.0 mit -D DUO_SDK. Eingezäunt mit #if canImport(SwiftUI, _version: 8.0.85) bestand sie unter allen drei, und ein #warning in jedem Zweig zeigte, dass 27.0 die Rückfallebene kompilierte und die beiden Betas den 27.1-Zweig. xcrun swift --version gibt unter allen drei Apple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1) aus. Die Modulversionen von SwiftUI sind die Werte von -user-module-version in der SwiftUI.swiftinterface jedes SDK. Die hier installierte 27.2-Beta ist Beta 1 (27B5019j); ihre iOS-27.2-Simulator-Runtime (24B5084k) führt den Gerätetyp iPhone Duo nicht, und Apples Notes zu 27.2 verweisen Entwickler dafür auf die 27.1-Beta. Die Grammatik der Bedingung stammt aus The Swift Programming Language, Statements, „Conditional Compilation Block“, abgerufen am 2. Oktober 2026: „platform-condition → canImport ( import-path )“. ↩↩↩↩↩↩↩↩↩

  15. Xcode 27.1 beta (27A9269), Contents/PlugIns/IDEIntelligenceChat.framework/Versions/A/Resources/: app-resizability.idechatprompttemplate sowie app-resizability-ref-uiscreen-task.md.packaged, -orientation-task, -scene-lifecycle-task, -safe-area-task und -idiom-task, gelesen am 2. Oktober 2026; die Zitate stammen aus dem Abschnitt „When to Use“ der Vorlage und aus Regel 6 der Safe-Area-Referenz; die drei Projektprüfungen sind ihre Tabelle „Prerequisites“, die fünf Muster ihr „Task Registry“. Xcode 27.0 (27A266a) hat im selben Ordner uikit-app-modernization.idechatprompttemplate und vier Referenzdateien. ↩↩↩

  16. Apple, Dokumentation, abgerufen über den JSON-Endpunkt am 2. Oktober 2026: ArrangementView, reservedRegions(kind:options:layoutDirectionBehavior:), onHingeChange(isEnabled:_:), toolbarVerticalBehavior(_:) und toolbarVerticalEdge. ↩

  17. Antoine van der Lee, iPhone Duo Simulator: Testing and optimizing your SwiftUI app, SwiftLee, 22. September 2026, zitiert. Artem Novichkov, iPhone Duo by Examples, GitHub-README, „Good to Know“, abgerufen am 2. Oktober 2026: „Its frame is the same in both states: 40 pt wide, with 20 pt margins on each side of a zero-width fold line.“, „Reserved regions arrive after the first layout pass.“ und „When folded, the outer display has no reserved regions at all, not even inactive ones.“ Die ersten beiden stimmen mit der Probe-App hier überein; die dritte nicht, denn die Probe-App las auf dem geschlossenen äußeren Display zwei aktive Okklusionen. Mick MacCallum, How to Get Your App Ready for iPhone Duo, BleepingSwift, 18. September 2026. Yurii Kleimenov, How to adapt your iOS app to iPhone Duo, Adapty, veröffentlicht am 11. September 2026 und als am 15. September aktualisiert gekennzeichnet. ↩↩↩↩↩

  18. Apple, „App Store submissions now open for the latest OS releases“, Entwicklernachrichten, 9. September 2026: Ab April 2027 gilt für Apps, die zu App Store Connect hochgeladen werden, dass sie „need to meet the following minimum requirements“ (folgende Mindestanforderungen erfüllen müssen), deren erste lautet: „iOS and iPadOS apps must be built with the iOS 27 & iPadOS 27 SDK or later“. ↩

  19. Apple, Get ready for iPhone Duo, abgerufen am 2. Oktober 2026: sechs Tech Talks, zwei Aufzeichnungen der Group Labs, ein Link zu Fragen und Antworten aus den Group Labs, Forum-Q&As zu Photos and Camera, SwiftUI und UIKit, Xcode 27.1 beta, die Gestaltungsrichtlinien und Ressourcen, der Vorbereitungsleitfaden und Workshops vor Ort. Die Q&A-Seite der Group Labs und die Forum-Threads wurden nicht gelesen; Anfragen an sie lieferten eine Seite zur menschlichen Verifizierung. ↩↩↩

  20. Apple, Xcode 27.1 Beta Release Notes, abgerufen über den JSON-Endpunkt der Dokumentation am 2. Oktober 2026, Simulator, Known Issues: „StandBy is unavailable in the iPhone Duo Simulator runtime. (187708663)“ und „Running and debugging most app extensions is unavailable in the iPhone Duo Simulator runtime. (187708767)“. Apple, Xcode 27.2 Beta 2 Release Notes, auf dieselbe Weise abgerufen am 2. Oktober 2026: Overview, „Download Xcode 27.1 beta to get the iOS SDK and simulator support for iPhone Duo.“; General, Known Issues, 187146039, zitiert. ↩

Verwandte Beiträge

Xcode 27.1 beta: Ihre App im iPhone Duo Simulator

Xcode 27.1 beta bringt das erste iOS-27.1-SDK und einen iPhone Duo Simulator: was im SDK steckt, was das Geräteprofil sa…

40 Min. Lesezeit

arm64e.x1: Apples Slice für geprüfte Zeigerarithmetik

Die Release Notes zum iOS 27 RC ergänzen arm64e.x1: geprüfte Zeigerarithmetik (CPA2) auf A20 Pro, M6 und S11. Was clang …

19 Min. Lesezeit

Design für das iPhone Duo: Was sich bewegt, was sich teilt und was bleibt

Apples Designleitfaden zum iPhone Duo und drei Tech Talks, als Regeln gelesen: zwei Größenklassen statt einer Pose je La…

23 Min. Lesezeit