Xcode 27.1 beta:iPhone Duoシミュレータでアプリを動かす

Xcode 27.1 beta(27A9269)は2026年9月18日金曜日に公開され、最初のiOS 27.1 SDKと、シミュレータ用のiPhone Duoデバイスタイプを同梱しました。Xcode 27.0の4日後です。SDKにはAppleの準備ガイドが挙げるiPhone Duo APIがすべて入っており、デバイスタイプのプロファイルは2つのディスプレイを3xの1398×2034ピクセルと2007×2853ピクセル、すなわち466×678ポイントと669×951ポイントとして定義しています。シミュレータランタイムは別ダウンロードで、Xcodeが必要に応じて取得します。Apple自身のノートは、シミュレータがまだできないことを3つ挙げています。27.1 SDKに対してリンクしたプローブアプリをDevice Hubの3つのポーズで動かすと、閉じた状態では466×678ポイントのディスプレイを埋めてバーをtrailing側の端に縦に並べ、開いた状態では951×669ポイントのディスプレイを埋めてサイズクラスは両方向ともregularになり、折り目はdivisionとして、カメラとステータスの列はocclusionとして報告されます。そしてアプリが内側ディスプレイにある間も、UIScreen.mainは外側ディスプレイの値を返し続けます。(10月2日訂正:それまでこの段落は、プローブには予約領域が1つも見えなかったと書いていました。そのプローブは、iOS 27.0のアプリとしてリンクされていたのです。)1245613

TL;DR

  • 日付とビルド。 AppleのReleasesフィードは、Xcode 27.1 beta(27A9269)を9月18日金曜日付けとしています。xcodebuild -versionはXcode 27.1とBuild version 27A9269を出力し、iPhoneOSとiPhoneSimulatorのSDKはどちらもiOS 27.1のビルド24A94403だと名乗ります。Swiftコンパイラのバージョン文字列swiftlang-6.4.0.34.1も、リンカのld-27037.1もXcode 27.0と同じです。xipは2,027,292,809バイト、展開後のアプリは3.6 GiBで、Xcode 27.0を置き換えることなく隣にインストールされます。14(10月11日:10月5日にはXcode 27.1 RC(27A9275)が続き、App Store ConnectはそのビルドをTestFlightだけでなくApp Store向けにも受け付けています。14)(10月15日:Xcode 27.1がリリース版として出荷されました。ビルドはRCと同じ27A9275で、同日付けのApp Store Connectの項目はその名前でストア向けにビルドを受け付けています。15)
  • Duo APIはSDKに入っています。 9月17日の確認で27.0 SDKに見つけられなかった10個の名前は、27.1 SDKにはすべてあります。SwiftUICoreのArrangementViewとreservedRegions(kind:options:layoutDirectionBehavior:)、SwiftUIのtoolbarVerticalBehavior(_:)、UIKitのUIArrangementViewController、preferredVerticalBarBehavior、verticalBarEdgeなどです。SwiftUIはこれらに@available(anyAppleOS 27.1, *)を付けています。UIKitのヘッダは、arrangementのコントローラと予約領域のメソッドにAPI_AVAILABLE(ios(27.1), tvos(27.1), visionos(27.1))を付けており、ドキュメントページが挙げるより2つ多いプラットフォームです。4
  • シミュレータのプロファイルがディスプレイのサイズを書き残しています。 iPhone Duoのデバイスタイプ(iPhone19,4、プロダクトクラスV68、モデル番号A3447)は、内蔵ディスプレイを2つ定義します。primaryは1398×2034ピクセルのスケール3、primary-1は2007×2853ピクセルのスケール3で、ネイティブの向きは270度。3で割れば466×678ポイントと669×951ポイントで、内側の数字は、私のDuo開発者向け記事が9月10日にApp Store Connectのスクリーンショットサイズから推論した値そのものです。プロファイルはランタイム27.1以降を要求します。5
  • 実際のアプリを載せるとどうなるか(10月2日訂正)。 Device Hubには3つのポーズ、Closed(閉じた状態)、Book(半開き)、Open(開いた状態)と、Rotate Right(右回転)が並びます。27.1 SDKに対してリンクしたプローブは、閉じると外側ディスプレイ全体、466×678ポイントを受け取ります。幅はcompact、ツールバーとタブバーはtrailing側の端に縦に並び、toolbarVerticalEdgeはtrailingを返し、カメラとステータスの列を覆うアクティブなocclusion領域が2つ報告されます。開くと内側ディスプレイ全体、ランドスケープがネイティブの951×669ポイントを受け取り、サイズクラスは両方向ともregular、バーはここでも縦です。中央を縦に走る幅40ポイントの非アクティブなdivisionがあり、これはBookのポーズでアクティブに変わります。回転させると669×951ポイントで、バーは横向きになります。アプリが内側ディスプレイにある間も、UIScreen.main.boundsは466×678を報告し続けます。10月2日まで、この項目はディスプレイのサイズとして466×678と951×669を挙げ、開いた状態のセーフエリアインセットは左右それぞれ34、ツールバーは横向き、どのポーズでも予約領域はなし、としていました。本文のほうはプローブが測った領域、つまりディスプレイより80ポイント狭い範囲(閉じて386ポイント、開いて34ポイントのインセットの内側に803ポイント)を挙げていました。どれも、誤ってiOS 27.0のアプリとしてリンクされていたプローブから得たものです。それは27.0 SDKのアプリが受け取るものであり、下の追記に両方のビルドを載せています。61213
  • このベータにまだできないこと。 Appleのノートにはこうあります。「Initial Simulator launch can take several minutes.」(187708500)、「StandBy is unavailable in the iPhone Duo Simulator runtime.」(187708663)、そして「Running and debugging most app extensions is unavailable in the iPhone Duo Simulator runtime.」(187708767)。Macにも出しているアプリなら、Mac CatalystのKnown Issuesが2件加わります。さらに、Appleが挙げていないものが1つ。ランタイムのダウンロードは最初の試行でDownload failed.となり、やり直して成功しました。23

10月2日追記:9月のプローブはiOS 27.0のアプリとしてリンクされていた

9月21日から10月2日までこの記事に載っていたシミュレータの結果は、測定は正しく、説明が誤っていました。あれは、iOS 27.0 SDKでビルドしたアプリに対してiPhone Duoシミュレータが行うことです。私はそれを、27.1でビルドしたアプリに対して行うこととして示してしまいました。

何がまずかったのか。 プローブは1つのSwiftファイルで、swiftc -sdk <iPhoneSimulator27.1.sdk>を直接呼んでコンパイルしていました。このフラグはコンパイラには届きますが、リンクの段階には届きません。そこでドライバは同じXcodeの中のmacOS SDKにフォールバックし、そのSDKのバージョンをバイナリに記録しました。LC_BUILD_VERSIONはsdk 27.0となっていたのです。iOSは、アプリにどの挙動を与えるかをこの数字で決めます。10月2日に同じコマンドを走らせ直すと、原因が警告として表示されます。「using sysroot for ‘macOS 27.0’ but targeting ‘arm64-apple-ios27.1.0-simulator’」(ターゲットはarm64-apple-ios27.1.0-simulatorなのに、macOS 27.0のsysrootを使っている)。9月にもこれが表示されていたのだとしても、私はそれを何かの原因として読み取りませんでした。13

どうして発覚したのか。 10月2日、Xcode 27.1 betaが同じSDKでビルドした実際のアプリを、同じシミュレータで動かしました。そのツールバーとタブバーは外側ディスプレイの側面に縦に立っていて、プローブのものが上部を横切っていたのとは違いました。2つのバイナリにotool -lをかけると、アプリにはsdk 27.1、9月のやり方でビルドし直したプローブにはsdk 27.0とありました。SDKROOTを設定してビルドし直すと、プローブはsdk 27.1となり、アプリと同じように振る舞います。さらに、プローブの素朴な版をXcode 27.0そのもので、本物のiOS 27.0 SDKに対してコンパイルすると、誤ってスタンプされた版と同じウィンドウを受け取りました。ですから9月の数字は、27.0のビルドの姿としては妥当なものです。13

再実行。 同じソースを両方のやり方でリンクし、各ポーズで、同じXcode 27.1 beta(27A9269)とランタイム(24A94401)の上で動かしました。13

ポーズ SDK 27.0としてリンク SDK 27.1としてリンク
Closed 黒いレールの隣に386×678ポイントのウィンドウ。バーは横向き。toolbarVerticalEdgeはnil。領域なし 466×678のウィンドウ、ディスプレイ全体。ツールバーとタブバーはtrailing側の端に縦向き。toolbarVerticalEdgeはtrailing。アクティブなocclusionが2つ
Closedで回転 678×386のウィンドウ。バーは横向き。領域なし 678×466のウィンドウ。サイズクラスは両方向ともcompact。バーは縦向き。アクティブなocclusionが2つ(カメラとステータスの列)
Open 871×669のウィンドウ。バーは横向き。領域なし 951×669のウィンドウ。バーは縦向き。非アクティブなdivisionが1つ、非アクティブなocclusionとアクティブなocclusionが1つずつ
Openで回転 669×871のウィンドウ。バーは横向き。領域なし 669×951のウィンドウ。バーは横向き。toolbarVerticalEdgeはnil。同じ3つの領域が回転した形で
Book Openと同じ Openと同じで、divisionがアクティブ
Bookで回転 Openで回転と同じ Openで回転と同じで、divisionがアクティブ

撤回するもの。 3つの記述です。どれも27.0のビルドについては正しく、27.1とスタンプされたビルドについては誤りでした。ツールバーは一度も縦に描かれなかったこと。reservedRegionsはどのポーズでも何も返さなかったこと。そしてシミュレータがアプリに与えたのはステータスのレールの隣の画面だけだったこと。4つ目は、理由のほうが誤っていました。回転させたとき、splitのarrangementは「stays side by side even though the container is now taller than it is wide」(コンテナが幅より高くなっても左右並びのまま)だと私は書きました。実際には、プローブのarrangementのビューはその画面の中でそれ自体が高さより幅のほうが大きく、arrangementは自分自身の形に従って分割します。回転したディスプレイを埋めるarrangementは、Appleのガイドが言うとおり上下に積まれます。5つ目として、TL;DRはディスプレイのサイズとして466×678と951×669を挙げていましたが、本文が挙げていたのはプローブが測った領域で、それは80ポイント狭いもの(閉じて386ポイント、開いて34ポイントのインセットの内側に803ポイント)でした。27.0のビルドは、ディスプレイ全体を得たことが一度もありません。713

変わらないもの。 シミュレータの節の外にあるものはすべてそのままです。日付とビルド、SDKのシンボル表、デバイスプロファイルとそのピクセルおよびポイントのサイズ、ランタイムのダウンロード、AppleのKnown Issues。節の中では、ディスプレイのサイズ、サイズクラス、Device Hubが提供するポーズ、screenConfigによるクラッシュ、そしてUIScreen.mainの罠が残ります。最後のものは、再実行で27.1のスタンプのもとでも再現しました。この追記が置き換える9月24日の追記は、ゼロは領域を早く読みすぎたせいだと推測し、いくつかのヒンジ角度での再実行を約束していました。推測は外れでした。27.0のビルドは、どれだけ長く尋ね続けても領域を1つも返しません。一方で、その追記がMolzahnから引いた観察は今も成り立ちます。正しくリンクしたプローブは、最初の6回から9回の評価では領域を1つも読まず、それ以降はすべてを読みました。ヒンジ角度ごとの実行は行っていません。1213

この記事をもとに自分でプローブを作ったなら、確かめてください。otool -l <app>/<binary> | grep -A4 LC_BUILD_VERSION。Xcodeでビルドしたプロジェクトは正しくスタンプされます。手でコンパイルしたファイルでは、swiftcを走らせる前にSDKROOTをシミュレータのSDKへ向けてexportしておく必要があります。これを見つけるきっかけになった実践例には、iOS 26のスタンプも加えた3通りの比較があります。

10月26日追記:端末は27.1で出荷され、リリース版SDKの番号はこうなった

AppleのNewsroomとセキュリティリリースのページによれば、iPhone Duoは10月23日(金)にiOS 27.1で店頭に並びました。セキュリティリリースのページは「iOS 27.1」を「iPhone Duo」だけ向けとして、公開されたCVEエントリなしで載せています。iOS 27.1の項目がReleasesフィードに届いたことはなく、27.1のリリースノートのページも現れず、索引には27と27.2があります。10月15日からリリース版になっているXcode 27.1(27A9275)を入れたこのMacでは、iPhoneOSとiPhoneSimulatorのSDKがiOS 27.1のビルド24A94232を名乗っています。上に記録したベータの24A94403より小さい番号です。iOS 27.1シミュレータランタイムは24A94425で、xcrun simctl list runtimes -jは対応デバイスタイプとしてiPhone Duoの1つだけを挙げます。これに対してiPhone 16 Proをsimctl createすると、「Incompatible device.」で失敗します。iOS 27.2は今日、10月26日に出荷され(24B119。同じ分に2つ目のiOS 27.2ビルド、24B91020もあります)、Xcode 27.2 RC(27B48、10月19日)のノートにはiPhone Duoのエントリが4件あります。「Fixed: In the iPhone Duo simulator, an app using CameraCaptureAccessory can use both displays at the same time without an active camera capture session.」(iPhone Duoシミュレータで、CameraCaptureAccessoryを使うアプリが、アクティブなカメラキャプチャセッションなしに両方のディスプレイを同時に使えてしまう問題を修正)(190155353)。「When switching between the inner and outer display of the iPhone Duo simulator, modifier keys such as Shift and Command might stop working.」(iPhone Duoシミュレータで内側と外側のディスプレイを切り替えると、ShiftやCommandなどの修飾キーが効かなくなることがある)(189465196)で、回避策は「Click with the mouse on the currently visible screen.」(今見えている画面をマウスでクリックする)です。そしてベータから引き継がれ、今はどちらもDevice Hubの下にある2件のKnown Issuesで、スクリーンショットが「black for up to a few minutes after booting the device」(デバイスの起動後、最大数分間黒くなる)問題(187146039)と、アクセシビリティツールが「cannot convey screen content on an iPhone Duo within Device Hub」(Device Hub内のiPhone Duoの画面の内容を伝えられない)問題(187148389)です。「APIs specific to iOS 27.1」(iOS 27.1に固有のAPI)についてのMac Catalystのエントリは変わっていません。iOS 27.2のノートには27.1を名指しするUIKitのエントリが1件あり、UIViewのデフォルトのレイアウトマージンがゼロになるというものです。1つのソースからビルドしたプローブをiPhone Duoシミュレータの27.1ランタイムで動かすと、LC_BUILD_VERSIONがsdk 27.0とスタンプされているとき(上の10月2日追記が警告している、手作業でのコンパイルの落とし穴です)は8ポイント、sdk 27.1とスタンプされているときはゼロを報告します。つまりこの変更は、OSだけでなく、バイナリがリンクするSDKによっても切り替わります。表はiOS 27.2のリリースノートの記事にあります。16

このベータには何が入っているのか?

AppleのReleasesフィードは「Xcode 27.1 beta (27A9269)」を9月18日金曜日の午前10時(PT)に、同じ日の午後に「TestFlight Update」を載せています。同じ日付のApp Store Connectのリリースノートには「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.」とあります。1 リリースノートのOverviewはSDKの並びを名指ししています。「Xcode 27.1 beta includes Swift 6.4 and SDKs for iOS 27.1, iPadOS 27, tvOS 27, watchOS 27, macOS 27, and visionOS 27. Xcode 27.1 beta supports on-device debugging in iOS 17 and later, tvOS 17 and later, watchOS 10 and later, and visionOS. Xcode 27.1 beta requires a Mac running macOS Tahoe 26.6 or later.」2 この並びは書かれたとおりに読んでください。27.1なのはiOSだけで、SDK自身のSDKSettings.plistもバージョン27.1と報告します。一方でApp Store Connectは同じSDKを「iPadOS 27.1 beta」と呼んでおり、このねじれはXcode 27の記事が引き継いでいるものです。

ダウンロードはバージョン番号から想像するより小さくて済みます。xipは2,027,292,809バイト、AppleのSoftware Update証明書で署名されており、展開するとXcode 27.0と同じ3.6 GiBのアプリになります。コマンドライン作業なら、フォルダへのxip --expand、/Applications/Xcode-27.1-beta.appへのリネーム、そしてそこを指すDEVELOPER_DIR。インストールはこれで全部です。そのあとベータ配下での最初のxcodebuild呼び出しが、同梱のCoreTypes.pkgとXcodeSystemResources.pkgを自力でインストールするのに2分ほどかけました。xcodebuild -runFirstLaunchが明示的に行う工程で、後者のパッケージこそがiPhone Duoのデバイスタイプを置いていく正体です。4 アプリに入っていないものは、シミュレータランタイムです。ベータはこのMacにすでにあるiOSランタイムを見つけ、その中に27.0はあっても27.1はありません。ベータ配下のxcodebuild -downloadPlatform iOSは、欠けている部品を「iOS 27.1 Simulator (24A94401)」と名指しし、Appleのmobile-assetサービス経由でcryptexディスクイメージとして取得します。一方、開発者向けダウンロードページに並ぶディスクイメージのほうは、iOS 18.2 Simulator Runtimeで止まったままです。34 最初の試行はDVTDownloadable: Download FailedとError Domain=DVTDownloadableErrorDomain Code=41 "Download failed."で終わりました。2回目は-buildVersion 24A94401を付けて走らせ、ランタイムを7.85 GBと表示して完走。その後simctl list runtimesには「iOS 27.1 (27.1 - 24A94401)」が並びました。ディスクには余裕を見ておいてください。ランタイムはXcodeのダウンロードの4倍あります。3

初回起動時、iOS 27.1 betaが動くiPhone Duoシミュレータの外側ディスプレイ。ダークなホーム画面の左上に設定アイコン、右端に時計とWi-Fiのステータスが縦に積まれ、右側にDockのタイル、右下に検索ボタンが並ぶ

初回起動時のiPhone Duoシミュレータの外側ディスプレイ、1398×2034ピクセル。ステータスのまとまりが右端を縦に走ります。AppleのHuman Interface GuidelinesがiPhone DuoのDynamic Islandとステータスバーを置いている、まさにその側です。10

iPhone Duoシミュレータはどうやって手に入れるのか?

手順は3つで、どれもWebページのダウンロードボタンではありません。AppleはシミュレータをXcodeの中でしか配っておらず、それも27.1 betaの中だけです。27.2 betaのノートには「Download Xcode 27.1 beta to get the iOS SDK and simulator support for iPhone Duo.」(iPhone DuoのiOS SDKとシミュレータのサポートを得るにはXcode 27.1 betaをダウンロードしてください)という補足があります。8(10月11日:Xcode 27.1 RC(27A9275)が10月5日に出荷され、そのノートにも同じiPhone Duo Simulatorの既知の問題が載っています。ノートがDuoシミュレータを扱うXcode 27.1は、もうベータだけではありません。なお、私はRCをインストールしていません。14)(10月15日:Xcode 27.1がリリース版として出荷されました。ビルドはRCと同じ27A9275で、ノートにはDuoシミュレータの同じ2つの既知の問題が載っています。私はこれもインストールしていません。15)

  1. Xcode 27.1 beta(27A9269)。 開発者向けダウンロードから入手します。AppleのReleasesフィードでの日付は9月18日金曜日です。xipを展開し、アプリを/Applications/Xcode-27.1-beta.appのようなバージョン入りの名前でXcode 27.0の隣へ移し、コマンドラインでの作業のためにDEVELOPER_DIRをそこへ向けます。ベータが要求するのはmacOS Tahoe 26.6以降です。12
  2. iOS 27.1のランタイム。 xipには入っていません。DEVELOPER_DIRをベータに設定してxcodebuild -downloadPlatform iOSを実行すると、iPhone Duoデバイスタイプを起動可能にする27.1のランタイムが取得されます。Appleのノートは、ダウンロードに加えてSimulatorの初回起動が「can take several minutes」(数分かかることがある)と警告しています。私の場合は最初の試行が失敗し、再試行で成功しました。原因を調べる前に、まず再試行してください。23
  3. Device Hub。 デバイスとそのポーズはここにあります。iPhone Duoのデバイスを追加または選択して起動し、ポーズのボタン、Closed、Book、Openと、Rotate Rightを使います。simctlにはポーズのコマンドがありません。以下のポーズごとのサイズとスクリーンショットは、この経路で得たものです。6

Apple製のブラウザ版はありません。「iPhone Duo simulator online」で見つかるページはAppleのiOS 27.1ランタイムを動かしていないので、何を描いていようと、ここで測ったサイズクラス、予約領域、外側ディスプレイの挙動の出どころにはなりません。ランタイムなしでレイアウトを確かめたいなら、このベータでXcodeのPreviewsキャンバスに、代替ディスプレイ用のDisplayグループが加わっています。2

27.1 SDKにDuo APIは入っているのか?

9月17日、私はAppleの「Preparing your app for iPhone Duo」ガイドが使う名前をiOS 27.0 SDKで探し、このデバイス固有の10個はどれも見つけられませんでした。同じやり方、つまりモジュールインターフェースとヘッダに対する素朴なテキスト検索を27.1 SDKに走らせると、10個すべてが見つかります。表の行は検索した部分文字列です。10個のうち9個は7行に収まっており、2つのreservedRegionsメソッドと2つのaxisBehaviorメンバーがそれぞれ1行を共有しています。残る3行は名前の背後にある型で、ReservedRegion、toolbarVerticalBehavior(_:)に対応するToolbarVerticalBehavior、そしてpreferredVerticalBarBehaviorに対応するUIVerticalBarBehaviorです。4

検索した部分文字列 SwiftUICoreインターフェース SwiftUIインターフェース UIKitインターフェース UIKitヘッダ
ArrangementView 45 0 19 4ファイル
UIArrangementViewController 0 0 19 4ファイル
ReservedRegion 16 0 15 3ファイル
reservedRegions 2 0 5 1ファイル
ToolbarVerticalBehavior 0 5 0 0
UIVerticalBarBehavior 0 0 0 1ファイル
verticalBarEdge 0 0 0 1ファイル
toolbarVerticalEdge 1 0 0 0
axisBehavior 0 2 0 1ファイル
preferredVerticalBarBehavior 0 0 0 1ファイル

この表には、コードの書き方に関わる細部が2つあります。1つ、SwiftUIの型はSwiftUICoreにあり、これはimport SwiftUIが再エクスポートするモジュールですから、普通のimportで届きます。もう1つ、availabilityの属性がプラットフォームの範囲についてドキュメントと食い違っています。SwiftUICoreのインターフェースはArrangementViewを、SwiftUIのインターフェースはtoolbarVerticalBehavior(_:)を、どちらも@available(anyAppleOS 27.1, *)の下で宣言しています。anyAppleOSは、そのバージョンの全プラットフォームを指すAppleの略記です。これに対してUIArrangementViewController.hと、UIView.hのreservedRegionsOfKind:メソッドはAPI_AVAILABLE(ios(27.1), tvos(27.1), visionos(27.1))とAPI_UNAVAILABLE(watchos)を携えています。UIVerticalBarEdge.hでも、enumとverticalBarEdgeのトレイトは同じ組み合わせですが、LeadingとTrailingのケースだけはAPI_AVAILABLE(ios(27.1)) API_UNAVAILABLE(visionos) API_UNAVAILABLE(watchos, tvos)です。Appleのドキュメントページは5つとも、iOS 27.1とiPadOS 27.1だけをbeta扱いで挙げています。47 iOSに向けて書き、残りはコンパイラに教えてもらいましょう。

ガイドが使う名前のうち、すでに27.0 SDKにあった3つは変わっていません。presentationPlacement(_:)は今も@available(anyAppleOS 27.0, *)の下にあり、backgroundExtensionEffect()はiOS 26から引き続き健在です。ガイドが名前を挙げる2つのToolbarItemPlacementのケースについては、topBarPinnedTrailingが@available(iOS 27.0, visionOS 27.0, *)の下にあり、cancellationActionには型のもの以外に固有のavailabilityは付いていません。4

シミュレータのプロファイルは2つのディスプレイについて何と言っているのか?

AppleがベータとともにインストールするデバイスタイプiPhone Duo.simdevicetypeは、/Library/Developer/CoreSimulator/Profiles/DeviceTypesの下に置かれた素朴なバンドルで、その2つのプロパティリストが、スペックシートでは開いたままだった問いに答えてくれます。5

素性を教えるのはprofile.plistです。モデル識別子はiPhone19,4、プロダクトクラスはV68、エイリアスはcom.apple.CoreSimulator.SimDeviceType.V68、minRuntimeVersionは27.1で、27.1以降のランタイムではこのデバイスをデフォルトで作るというルールが入っています。ハードウェアを教えるのはcapabilities.plistです。モデル番号A3447、HomeButtonTypeは2、DeviceSupportsDynamicIslandはtrue、DeviceSupportsEnhancedMultitaskingはfalse、IsLargeFormatPhoneはtrue、CompatibleDeviceFallbackはiPhone18,3、デバイスの角丸半径は59、そして内蔵2つと仮想3つのエントリを持つdisplays配列です。5

プロファイル上のディスプレイ ピクセル スケール ポイント ネイティブの向き 角丸半径 色空間
primary(「LCD」、スクリーン1) 1398×2034 3 466×678 0 8、59、8、59 P3
primary-1(「LCD-1」、スクリーン3) 2007×2853 3 669×951 270 4隅とも55 sRGB

1行目は外側ディスプレイで、Appleのスペックシートとピクセル単位で一致します。2行目は内側ディスプレイですが、そのピクセル数はパネルの1878×2670ではなく、App Store Connectのスクリーンショットサイズである2007×2853のほうです。つまりシミュレータは内側ディスプレイを3xの669×951ポイントで描いており、これはDuo開発者向けの記事が9月10日に行い、推論だと明記した計算そのもの。Apple自身のプロファイルが、いまその数字を持っています。ネイティブの向きが270度だということは、内側ディスプレイはランドスケープがネイティブで、端末を開いたときは幅951ポイント・高さ669ポイントになるという意味で、Appleが示した開いた状態の寸法とも合います。残る2つの数字は、ハードウェアではなくシミュレータの値です。両ディスプレイとも460ppi、60 Hzと書かれていますが、スペックシートでは内側パネルは430ppiですから、hdpiはプレースホルダだと思っておいてください。5

プロファイルは形も配っています。それぞれのディスプレイはフレームバッファマスク、つまり可視領域のPDFを参照しています。外側ディスプレイのマスクは角が非対称で、プロファイルの値では長辺の一方が8、もう一方が59。私の読みでは、半径の小さいほうが、Appleのデザインガイドの言う中央のヒンジに接する側です。内側ディスプレイのマスクは、プロファイルの角の値55をそのまま使った普通の角丸長方形で、フロントカメラの切り欠きはありません。つまりカメラによる遮蔽は、フレームバッファの形ではなく実行時の予約領域APIからやってくることになります。510

シミュレータには何が映るのか?

デバイスは閉じた状態で起動します。初回起動では外側ディスプレイにホーム画面が出て、内側ディスプレイのフレームバッファは点いているのに真っ黒。simctl io enumerateはプロファイルの名前どおり、primaryを1398×2034、primary-1を2007×2853として、いつもの仮想スクリーンと並べて列挙します。6 ポーズが住んでいるのはDevice Hubです。Duoのデバイスを選ぶと、そのウィンドウにはRotate Right、Closed、Book、Openが、アクセシビリティAPIから押せるボタンとして並びます。この節の内容はすべて、そうやって動かしました。simctlにはポーズのコマンドがありません。6

プローブは1ファイルのSwiftUIアプリです。タブビューの中にナビゲーションスタックがあり、そこにツールバー項目が5つ。ジオメトリ、サイズクラス、toolbarVerticalEdgeの環境値、ヒンジ、そしてincludeInactive付きで両方の種類の予約領域を読み出して表示し、splitスタイルのArrangementViewを1つ置いています。領域はbodyが評価されるたびに読み、1秒に1回評価し直します。以下の数字は10月2日の再実行のもので、27.1 SDKに対してリンクしています。誤って27.0としてリンクされていた9月の実行は、そのあとに別の見出しで続きます。13

27.1 SDKに対してリンクした場合

Closed。 アプリは外側ディスプレイ全体を受け取ります。ウィンドウは466×678ポイントで、幅compact・高さregular。ツールバーとタブバーは時計の下、trailing側の端に縦に並び、toolbarVerticalEdgeはtrailing、UIKitのverticalBarEdgeトレイトはraw値2です。ナビゲーションスタックの中のコンテンツは382×562ポイントで、セーフエリアインセットは上82、下34、trailing側84。この84ポイントがレールです。occlusion領域は2つ報告され、どちらもアクティブです。1つは外側カメラの位置にある37ポイント四方のもの、もう1つはバーの上でカメラとステータスの列を覆う84×170のもの。このディスプレイではdivisionは報告されません。横に回すと678×466で、サイズクラスは両方向ともcompact、バーはtrailing側の端に残ります。13

27.1 SDKに対してリンクした、iPhone Duoシミュレータの外側ディスプレイ上のプローブ。コンテンツサイズは382×562ポイント、サイズクラスはcompactとregular、toolbarVerticalEdgeはtrailing、ヒンジはclosed、アクティブなocclusionが2つ、splitのarrangementは上下に積まれ、右端の列に時計とWi-Fiのステータス、4つのツールバーボタン、3つのタブボタンが収まっている

Closed、27.1 SDK。466×678ポイントのディスプレイ全体を使い、バーはtrailing側の端を縦に走ります。

Open。 アプリは内側ディスプレイへ、ランドスケープであるネイティブの向きで移ります。951×669ポイントのウィンドウで、サイズクラスは両方向ともregular、バーはtrailing側の端に縦のままです。コンテンツは867×553で、インセットは同じ3つ。領域は3つ返ってきます。幅40ポイントのdivisionが画面の中央、xが455から495までの範囲を上から下まで走り、両側に20ポイントのマージンを持ちます。これは非アクティブです。端末が平らだからです。58×37の非アクティブなocclusionは内側カメラの位置を示しており、Appleのガイドラインによれば、このカメラは「stays hidden until the camera is active.」(カメラがアクティブになるまで隠れたまま)です。10 84×120のアクティブなocclusionがステータスの列を覆います。splitのarrangementは2つのペインを左右に並べ、幅を均等に分けます。13

27.1 SDKに対してリンクした、Openのポーズの内側ディスプレイ上のプローブ。コンテンツサイズは867×553ポイント、サイズクラスはregularとregular、toolbarVerticalEdgeはtrailing、ヒンジは180度で完全に開き、x 455に幅40ポイントの非アクティブなdivisionが1つ、非アクティブなocclusionとアクティブなocclusionが1つずつ、splitのarrangementは左右並びで、バーは右端の列に収まっている

Open、27.1 SDK。951×669ポイント、折り目は中央を縦に走る非アクティブなdivisionとして報告されます。

Book。 Device HubのBookのポーズは、ヒンジを127度の部分的に開いた状態として報告します。ウィンドウのサイズは変わりません。変わるのはdivisionで、フレームは同じまま、アクティブになります。splitのarrangementはこれに応えて仕切りを折り目の上へ動かし、40ポイントの帯を空けておきます。プライマリのペインはx 455で終わり、セカンダリは495から始まります。このポーズで表示したシートは、中央を外れてleading側の半分へ移ります。13

27.1 SDKに対してリンクした、Bookのポーズの内側ディスプレイ上のプローブ。ヒンジは127度で部分的に開き、アクティブなdivisionが1つあり、splitのarrangementの2つのペインが画面中央の空の帯で隔てられている

Book、27.1 SDK。divisionがアクティブになり、splitのarrangementは折り目を空けておきます。

回転。 端末を開いたままRotate Rightを押すと、669×951ポイントのウィンドウになり、サイズクラスは両方向ともregularのまま、バーは横向きに戻ります。toolbarVerticalEdgeはnil、ツールバーは上部の時計の隣、タブバーは下部に浮かびます。これはAppleのデザインガイダンスと一致しており、ガイダンスは縦向きの内側ディスプレイでは「standard horizontal bars」(標準の横向きのバー)を保つとしています。10 同じ3つの領域が、回転後の座標空間で報告されます。divisionはいまや中央を横切る高さ40ポイントの帯で、平らなときは非アクティブ、Bookではアクティブです。プローブのarrangementのビューは、その画面の中で高さより幅のほうが大きいため、左右並びのままです。13

27.1 SDKに対してリンクした、縦向きに回転させた内側ディスプレイ上のプローブ。コンテンツサイズは669×734ポイント、サイズクラスはregularとregular、toolbarVerticalEdgeはnil、上部の時計の隣に横向きのツールバー、下部に浮かぶタブバー、非アクティブなdivisionが1つとocclusionが2つ

Openで回転、27.1 SDK。バーは横向きで、折り目はいまや横向きの帯です。

どのポーズでも変わらないことが2つあります。1つ目、領域は遅れて届きます。起動のたびに、プローブのbodyの最初の6回から9回の評価では領域が1つも読めず、それ以降は毎回すべてが読めました。ですから、最初のレイアウトのパスで一度だけ尋ねるビューは、空の答えを受け取ります。Sven-Eric MolzahnのDuoProbeフィクスチャは9月20日に、まさにこの現象を40ポイントの帯とともに記録しています。「reservedRegions is empty on the first geometry evaluation and populated on a later one」(reservedRegionsは最初のジオメトリ評価では空で、後の評価で値が入る)。SwiftLeeの9月22日付のシミュレータガイドは「Holding Option ⌥ reveals a slider that you can use to control the hinge angle of the device with precision」(Option ⌥を押し続けると、デバイスのヒンジ角度を精密に操作できるスライダーが現れる)と付け加えていますが、このスライダーを私は使っていません。12 2つ目、アプリが内側ディスプレイにある間も、UIScreen.main.boundsは外側ディスプレイの466×678ポイントを答えます。Appleのガイドがレイアウトの計算を「based on your scene or containing view’s bounds rather than screen dimensions」(画面の寸法ではなく、シーンまたは包含ビューのboundsを基準に)と言って警告しているのが、まさにこの罠です。メインスクリーンは、いま自分が載っているスクリーンではありません。ウィンドウシーン自身のスクリーンは、アプリが実際に載っているディスプレイを報告します。713

他のポーズへ回り込む道のうち、1つはうまくいきません。simctl io screenConfigはスクリーンの電源を落とせますが、内側を点けたまま外側ディスプレイの電源を落としても端末は開きませんでした。落ちたのはシミュレータのシステムシェルのほうで、続くsimctl launchは「The system shell probably crashed.」で失敗し、再起動が必要になりました。ポーズが住んでいるのはDevice Hubのウィンドウです。6

27.0 SDKに対してリンクした場合

以下は、この節が10月2日まで載せていた数字です。9月19日と20日に、ナビゲーションスタックはあってもタブビューのないプローブで測り、10月2日に現行のプローブで測り直しました。Xcode 27.0でビルドしたアプリがこのシミュレータで受け取るものを表しています。613

Closedでは、466ポイントのディスプレイの上でウィンドウの幅は386ポイントです。システムが80ポイントのレールを自分のために確保し、そこに時計とステータスを黒地で描き、アプリのツールバーは上部を横切ります。Openではウィンドウは871×669で、同じ80ポイントが右側から欠け、セーフエリアインセットは左右それぞれ34です。Openで回転させると、80ポイントは今度は上から削られます。どのポーズでも、サイズクラスは27.1のビルドと同じ、toolbarVerticalEdgeはnil、verticalBarEdgeはraw値0で、予約領域への2つの問い合わせは、非アクティブな領域を含めても、プローブがどれだけ長く尋ね続けても空の配列を返します。BookはOpenと見分けがつきません。

SDK 27.0としてリンクされた9月のプローブ、iPhone Duoシミュレータの外側ディスプレイ。右上のツールバーに共有アイコン、省略記号のオーバーフロー、チェックマークが並び、値はサイズ386×510ポイント、サイズクラスはcompactとregular、toolbarVerticalEdgeはnil、divisions 0、occlusions 0。splitのarrangementではプライマリビューがセカンダリビューの上にあり、右端の黒いレールに時計とWi-Fiのステータスが積まれている

Closed、27.0としてリンク。アプリはレールの手前で止まり、ツールバーは横向きのままです。

SDK 27.0としてリンクされた9月のプローブ、Openのポーズの内側ディスプレイ。サイズ803×515ポイント、サイズクラスはregularとregular、toolbarVerticalEdgeはnil、divisions 0、occlusions 0。splitのarrangementでプライマリとセカンダリが左右に並び、ツールバーは右上、右端の黒いレールに時計とWi-Fiのステータスが入っている

Open、27.0としてリンク。両方向ともregularで、レールはシステムが確保しています。

SDK 27.0としてリンクされた9月のプローブ、縦向きに回転させた内側ディスプレイ。サイズ669×703ポイント、サイズクラスはregularとregular、splitのarrangementは左右並びで、上端を横切る黒い帯に時計とWi-Fiのステータスが入っている

回転、27.0としてリンク。上端を横切る帯はシステムのものです。

このベータにまだできないこと

ベータ自身のノートのSimulator、Known Issuesには、限界が3つ挙がっています。「Initial Simulator launch can take several minutes.」(187708500)、「StandBy is unavailable in the iPhone Duo Simulator runtime.」(187708663)、そして「Running and debugging most app extensions is unavailable in the iPhone Duo Simulator runtime.」(187708767)。2 StandByの1件は、それ向けのウィジェットやライブアクティビティを持っている人には効いてきます。Appleの発表はこの端末について「enters StandBy on either the outer or inner display」(外側でも内側でもStandByに入る)と述べ、それを「hub for widgets」(ウィジェットのハブ)と呼んでいます。そこに何が現れるのかはDuo開発者向けの記事で扱いました。後続のベータがこの制限を外すまで、この端末のStandByは実機で確かめるものです(10月15日:リリース版のノートにも、まだ載っています15)。11

もう2件はMac CatalystのKnown Issuesにあり、これらのAPIを採用していてMac向けにもビルドするアプリを直撃します。1件目は「Projects that use APIs specific to iOS 27.1 show compile errors when building for Mac Catalyst (“undeclared identifier”, “not found”, “has no member”, “cannot find”, etc). (185924957)」で、Appleの回避策はSwiftなら#if !targetEnvironment(macCatalyst)、Objective-Cなら#if !TARGET_OS_MACCATALYST。2件目は「Projects that target iOS 27.1 show no Mac Catalyst run destination available. (187046347)」で、回避策は「Add a Mac Catalyst 27.0 minimum deployment in target settings.」です。2 Xcode 27.2ベータのノートは、反対方向から3件目を加えます。「macOS, watchOS, tvOS, and visionOS SDKs in Xcode 27.2 incorrectly report 27.1 as a valid deployment target,」、そして「Mac Catalyst builds with a 27.1 or 27.2 deployment target may be unable to use newly introduced API.」 (187160501)。8

私なら今週こうする

  1. Xcode 27.0に被せるのではなく、その隣にベータを入れる。xipを展開し、アプリをリネームし、コマンドラインのビルド用にDEVELOPER_DIRをそこへ向けます。ベータのノートに27.0のツールチェーンを変えるものは1つもなく、コンパイラとリンカのバージョン文字列も同一です。4
  2. 必要になる前にランタイムのダウンロードを始める。ベータ配下でxcodebuild -downloadPlatform iOSを走らせ、失敗したらやり直します。iPhone Duoのデバイスタイプを起動可能にするのはこのランタイムであり、そのうえAppleは初回起動に数分かかると警告しています。23
  3. Mac Catalystのターゲットを含めたまま、27.1 SDKに対して一度ビルドする。新しいAPIを#if !targetEnvironment(macCatalyst)で囲うのか、Catalystの下限を27.0へ上げるのかを決める前に、Appleが名指ししている2つの診断を読んでおきましょう。2
  4. プレビューとテストで使うサイズは、プロファイルの数字にする。閉じて466×678ポイント、開いて669×951ポイント、内側ディスプレイはランドスケープがネイティブです。ベータのPreviewsのノートは、キャンバスのオーバーライドのピッカーに「for previewing content on a device’s alternative display.」(デバイスのもう一方のディスプレイでコンテンツをプレビューするため)のDisplayグループを加えたと書いています。(182598534)25
  5. 予約領域は、何度でも読み直される場所で読む。ビューのbodyの中でジオメトリプロキシを通して読むか、ジオメトリが変わるたびに読むかで、最初のレイアウトで一度だけ読むことはしません。.includeInactiveを渡したreservedRegions(kind:options:layoutDirectionBehavior:)は、プローブの最初の6回から9回の評価では何も返さず、それ以降は毎回、そのディスプレイにあるすべての領域を返しました(閉じた状態ではカメラとステータスの列、開いた状態では折り目、内側カメラ、ステータスの列)。ですから、最初のパスでキャッシュした値は、そのビューが生きている間ずっと空の配列です。そして何かを信じる前に、ビルドが27.1 SDKでスタンプされていることを確かめてください。otool -l <app>/<binary> | grep -A4 LC_BUILD_VERSION。713

よくある質問

Xcode 27.1 betaにiPhone Duoシミュレータは入っていますか?

はい。ベータはiPhone Duoというデバイスタイプ、com.apple.CoreSimulator.SimDeviceType.iPhone-Duoをインストールします。そのプロファイルが要求するiOS 27.1のランタイムは、Xcodeがxcodebuild -downloadPlatform iOSで別途ダウンロードします。Appleのノートは、初回起動に「can take several minutes」(数分かかることがある)こと、そしてそのランタイムではStandByとほとんどのApp Extensionが使えないことを警告しています。235

iPhone Duoシミュレータはどうやって手に入れますか?

Xcode 27.1 betaをインストールし、ベータの下でxcodebuild -downloadPlatform iOSを使ってiOS 27.1のランタイムをダウンロードし、Device HubでiPhone Duoのデバイスを選びます。ポーズはそこにボタンとして並んでいます。27.2 betaには含まれておらず、Appleの27.2のノートは「the iOS SDK and simulator support for iPhone Duo.」(iPhone DuoのiOS SDKとシミュレータのサポート)の入手先として27.1 betaを示しています。238(10月11日:Xcode 27.1 RC(27A9275)が10月5日に出荷され、そのノートにも同じiPhone Duo Simulatorの既知の問題が載っています。ノートがDuoシミュレータを扱うXcode 27.1は、もうベータだけではありません。なお、私はRCをインストールしていません。14)(10月15日:Xcode 27.1がリリース版として出荷されました。ビルドはRCと同じ27A9275で、ノートにはDuoシミュレータの同じ2つの既知の問題が載っています。私はこれもインストールしていません。15)

オンラインのiPhone Duoシミュレータはありますか?

Appleからは出ていません。シミュレータはRCが出るまではXcode 27.1 betaの中でだけ提供されていたもので、AppleのiOS 27.1ランタイムの上で動きます。その名前を掲げたブラウザのページが描いているのは、別のものです。手早くレイアウトを確かめるなら、ベータのPreviewsキャンバスに代替ディスプレイ用のDisplayグループがあります。2(10月11日:Xcode 27.1 RC(27A9275)が10月5日に出荷され、そのノートにも同じiPhone Duo Simulatorの既知の問題が載っています。ノートがDuoシミュレータを扱うXcode 27.1は、もうベータだけではありません。なお、私はRCをインストールしていません。14)(10月15日:Xcode 27.1がリリース版として出荷されました。ビルドはRCと同じ27A9275で、ノートにはDuoシミュレータの同じ2つの既知の問題が載っています。私はこれもインストールしていません。15)

Xcode 27の隣にXcode 27.1 betaを入れるにはどうしますか?

xip --expandでxipを展開し、できたアプリを/Applications/Xcode-27.1-beta.appのようなバージョン入りの名前へ移し、xcodebuild・xcrun・swiftcのためにDEVELOPER_DIRをそのContents/Developerフォルダへ設定します。ベータが要求するのはmacOS Tahoe 26.6以降で、Xcode 27.0と同じ下限です。24

iPhone Duoの内側ディスプレイはポイントでいくつですか?

669×951ポイントです。シミュレータのデバイスプロファイルが、内側ディスプレイをスケール3の2007×2853ピクセル、ランドスケープがネイティブの向きとして定義しています。外側ディスプレイはスケール3の1398×2034ピクセルから466×678ポイントです。5

Xcode 27.1 betaはiOS 27.0 SDKやXcode 27のツールチェーンを変えますか?

いいえ。SwiftコンパイラもリンカもXcode 27.0と同じバージョン文字列を報告しますし、ベータのリリースノートにあるのはMac Catalyst、Previews、Simulatorの3つの節だけで、どれもツールチェーンには触れていません。iOS 27.1 SDKは追加であり、デバイスとシミュレータの両方のSDKでビルド24A94403として識別されます。24

iPhone Duoはいつ、何の上で出荷されますか?

10月23日、iOS 27.1の上で。Appleの9月16日のニュース記事にこうあります。「When iPhone Duo becomes available on October 23, it will run iOS 27.1.」9(10月26日:そのとおりになり、iOS 27.1はほかのどのデバイスにも出ていません。AppleのセキュリティのページはこれをiPhone Duoだけ向けとして載せており、このMacの27.1シミュレータランタイムはiPhone Duoのデバイスタイプしか受け付けません。16)

このサイトの関連記事: Duo開発者向けの記事には、この記事がSDKと突き合わせたスペック表の数値とAPIの一覧があります。iPhone Duoのデザイン記事はAppleのデザインガイダンスを読み解き、リサイズ可能なiPhoneのチェックリストはプロファイルの数値が流れ込むレイアウトの作業そのもので、Xcode 27のハブ記事は日付入りのbetaの節をまとめ、Xcode 27のビルド失敗の記事はこのbetaが変えなかったツールチェーンを扱い、iOS 27のリリースノート記事は27.xのビルドを追っています。

出典


  1. Apple、Releases、2026年9月19日に取得したRSSフィード。「Xcode 27.1 beta (27A9269)」はFri, 18 Sep 2026 10:00:00 PDT付け、「TestFlight Update」はFri, 18 Sep 2026 14:00:00 PDT付け。Apple、App Store Connectのリリースノート、2026年9月18日、TestFlightの更新を全文引用。 ↩↩↩↩

  2. Apple、Xcode 27.1 Beta Release Notes、2026年9月19日にドキュメントのJSONエンドポイント経由で取得。Overviewを引用。Mac CatalystのKnown Issues 185924957と187046347を、それぞれの回避策とともに引用。PreviewsのNew Features 182598534を引用。SimulatorのKnown Issues 187708500、187708663、187708767を引用。このノートに他の節はありません。 ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  3. 筆者によるmacOS 26.6.2(25G83)上でのランタイムのダウンロード、2026年9月19日、DEVELOPER_DIRはXcode 27.1 betaに設定。xcodebuild -downloadPlatform iOSは、インストール済みの27.0ランタイムについて「iOS is already downloaded.」と表示し、続いて「Downloading iOS 27.1 Simulator (24A94401) (arm64)」と表示したあと、DVTDownloadable: Download Failed. Downloadable: DVTDownloadable(identifier: 0a4e7582-0061-5907-bea9-fe234c1f9392, version: 27.1.0.1, category: simulator, contentType: cryptexDiskImage, downloadMethod: mobileAsset, platform: com.apple.platform.iphoneos)とError Domain=DVTDownloadableErrorDomain Code=41 "Download failed."を出しました。やり直しのxcodebuild -downloadPlatform iOS -buildVersion 24A94401は「Downloading iOS 27.1 Simulator (24A94401) (arm64): 0.0% (66 kB of 7.85 GB)」と表示して完走し、その後xcrun simctl list runtimesには「iOS 27.1 (27.1 - 24A94401) - com.apple.CoreSimulator.SimRuntime.iOS-27-1」が並びました。同じ日にサインインした状態でAppleの開発者向けダウンロードページを「Simulator Runtime」で検索すると、iOS 18.2 Simulator Runtimeより新しいディスクイメージは見当たりません。 ↩↩↩↩↩↩↩

  4. 筆者による/Applications/Xcode-27.1-beta.appの調査、2026年9月19日。xcodebuild -versionはXcode 27.1とBuild version 27A9269を出力。xcrun --sdk iphoneos --show-sdk-versionとxcrun --sdk iphonesimulator --show-sdk-versionはどちらも27.1を出力。両SDKのSystemVersion.plistはProductBuildVersion 24A94403とProductVersion 27.1を持ちます。xcrun swift --versionはApple Swift version 6.4 (swiftlang-6.4.0.34.1 clang-2100.3.34.1)、xcrun ld -vはld-27037.1を出力し、同じMac上でXcode 27.0(27A266a)が出力するバージョン文字列と同一です。Xcode_27.1_beta.xipは2,027,292,809バイト。pkgutil --check-signatureはSoftware Updateの証明書チェーンとともに「signed Apple Software」と報告します。展開後のアプリに対するdu -skは3,813,336 KB、/Applications/Xcode-27.appに展開したXcode 27.0(27A266a)は3,804,188 KBでした。名前の件数は、iPhoneOS SDKのSwiftUICore.swiftmodule/arm64e-apple-ios.swiftinterface、SwiftUI.swiftmodule/arm64e-apple-ios.swiftinterface、UIKit.swiftmodule/arm64e-apple-ios.swiftinterfaceに対するgrep -cと、UIKit.framework/Headers全体に対するgrep -rlのファイル数です。availabilityの属性は同じファイルから読みました。SwiftUICoreのインターフェースのpublic struct ArrangementView<の上と、SwiftUIのインターフェースでfunc toolbarVerticalBehaviorを宣言するextension SwiftUICore.Viewの上には@available(anyAppleOS 27.1, *)。UIArrangementViewController.h、UIView.hの2つのreservedRegionsOfKind:宣言、そしてUIVerticalBarEdgeのenumとverticalBarEdgeのトレイトにはAPI_AVAILABLE(ios(27.1), tvos(27.1), visionos(27.1))に続けてAPI_UNAVAILABLE(watchos)。そのUIVerticalBarEdgeLeadingとUIVerticalBarEdgeTrailingのケースにはAPI_AVAILABLE(ios(27.1)) API_UNAVAILABLE(visionos) API_UNAVAILABLE(watchos, tvos)。func presentationPlacementの上には@available(anyAppleOS 27.0, *)。public static let topBarPinnedTrailingの上には@available(iOS 27.0, visionOS 27.0, *)、public static let cancellationActionの上には属性なし。初回起動については、ベータのDEVELOPER_DIR配下での最初のxcodebuild -versionが2分のタイムアウトを超えて走り、/var/log/install.logには、9月19日16時01分54秒にxcodebuildがPackageKitのインストールをキューに入れ、Xcode-27.1-beta.app/Contents/Resources/PackagesからCoreTypes.pkgとXcodeSystemResources.pkgを展開して16時03分04秒に完了した記録が残っています。そのあとのxcodebuild -checkFirstLaunchStatusは0を返しました。 ↩↩↩↩↩↩↩↩↩↩↩

  5. /Library/Developer/CoreSimulator/Profiles/DeviceTypes/iPhone Duo.simdevicetype。Xcode 27.1 betaがインストールしたもので、2026年9月19日にplutil -convert xml1で読みました。profile.plistはmodelIdentifier iPhone19,4、productClass V68、aliases com.apple.CoreSimulator.SimDeviceType.V68、minRuntimeVersion 27.1、createByDefaultForRuntimeVersionsのversionMin 27.1。capabilities.plistはModelNumber A3447、ThinningProductType iPhone19,4、CompatibleDeviceFallback iPhone18,3、DeviceCornerRadius 59、HomeButtonType 2、DeviceSupportsDynamicIsland true、DeviceSupportsEnhancedMultitasking false、IsLargeFormatPhone true。ScreenDimensionsCapabilityはmain-screen-width 1398、main-screen-height 2034、main-screen-pitch 460、main-screen-scale 3。displaysはprimary(displayName LCD、screenID 1、width 1398、height 2034、scale 3、hdpiとvdpi 460、refreshRate 60、nativeOrientation 0、cornerRadiusUL 8、UR 59、LL 8、LR 59、colorspace P3)とprimary-1(displayName LCD-1、screenID 3、width 2007、height 2853、scale 3、hdpiとvdpi 460、refreshRate 60、nativeOrientation 270、4隅の角丸半径はすべて55、colorspace sRGB)、加えてexternal-0(TVOut)、wireless0(carPlay)、resizable(scene)。2つのframebufferMaskIdentifierのPDFはqlmanageでレンダリングして確認しました。パネルについてのAppleのスペックシートの数字はDuo開発者向けの記事にあります。ベータ配下のxcrun simctl list devicetypesは「iPhone Duo (com.apple.CoreSimulator.SimDeviceType.iPhone-Duo)」を挙げます。 ↩↩↩↩↩↩↩↩↩

  6. 筆者によるmacOS 26.6.2(25G83)上での実行、2026年9月19日および20日。デバイスはsimctl create "Duo-27.1" com.apple.CoreSimulator.SimDeviceType.iPhone-Duo com.apple.CoreSimulator.SimRuntime.iOS-27-1で作成し、simctl bootとsimctl bootstatus -bで起動(このMacでは1分ほど)。simctl io <udid> enumerateはディスプレイクラス0のcom.apple.framebuffer.displayポートを1398×2034と2007×2853の2つ挙げ、Connected Screensの下には「LCD-1」がデバイス名primary-1、スクリーンID 3、ピクセルサイズ{2007, 2853}として並びます。プローブはDuoProbe。1ファイルのSwiftUIアプリで、Xcode 27.1 beta配下のxcrun swiftc -sdk <iPhoneSimulator.sdk> -target arm64-apple-ios27.1-simulator -parse-as-libraryでビルドし、simctl installでインストール、simctl launch --console-ptyで起動、スクリーンショットはsimctl io <udid> screenshot --mask=alpha --display=primaryと--display=primary-1で取得しました。閉じたポーズのコンソール行はDUOPROBE screen=(466.0, 678.0) scale=3.0 idiom=0 model=iPhone name=Duo-27.1、DUOPROBE size=386x510 h=compact v=regular verticalEdge=nil safe=EdgeInsets(top: 134.0, leading: 0.0, bottom: 34.0, trailing: 0.0)、DUOPROBE uikit bounds=(354.0, 44.0) divisions=0 occlusions=0 verticalBarEdge=UIVerticalBarEdge(rawValue: 0)。division[やocclusion[の行はありません。--display=primary-1のスクリーンショットは真っ黒です。スクリーンの電源については、simctl io <udid> screenConfig --display=primary power offが「Screen 1 power state set to off」と出力し、次のsimctl launchがFBSOpenApplicationServiceErrorDomainのコード5、「The system shell probably crashed.」で失敗。simctl shutdownとbootでデバイスは復旧しました。ポーズごとの実行は9月20日に2シリーズ行い、いずれもDevice Hubが選択中のデバイスに対して出すボタンに対し、アクセシビリティAPIのAXPressアクションでRotate Right、Closed、Book、Openを押しています。どちらも27.2ベータのsimctlコマンドラインツール(スクリプトが設定するDEVELOPER_DIR)から、27.1ベータのランタイム、デバイスタイプ、Device Hubに対して駆動しました。1つ目のシリーズでは、次のボタンを押した時点で前のポーズのプローブがまだ動いており、そのあと終了・再起動させて、コンソールを12秒分、両ディスプレイのスクリーンショットを取得しています。上記の回転時の値と遷移中の行は、こちらのシリーズのものです。2つ目のシリーズでは、取得のたびにプローブを終了させ、次のボタンを押すときに前面にアプリがない状態にしました。再起動前のスクリーンショットはこちらのものです。Open: DUOPROBE size=803x515 h=regular v=regular verticalEdge=nil safe=EdgeInsets(top: 134.0, leading: 34.0, bottom: 20.0, trailing: 34.0)、DUOPROBE uikit bounds=(771.0, 44.0) divisions=0 occlusions=0 verticalBarEdge=UIVerticalBarEdge(rawValue: 0)、そしてDUOPROBE screen=(466.0, 678.0)。--display=primary-1のスクリーンショットにはプローブが写り、--display=primaryは真っ黒です。Book: 再起動後に同じ3行。押したあと再起動する前に撮った内側ディスプレイのスクリーンショットには、アプリが動いていない状態でホーム画面が写っています。Closed: 上記の閉じたポーズの行。Rotate Rightのあと、Open: DUOPROBE size=669x703 h=regular v=regular verticalEdge=nil safe=EdgeInsets(top: 134.0, leading: 0.0, bottom: 34.0, trailing: 0.0)とuikit bounds=(637.0, 44.0)、内側ディスプレイのスクリーンショットは縦向き。division[やocclusion[の行を出した実行は1つもありません。回転した閉じた状態は、ポーズが変わる途中の遷移行としてDUOPROBE size=610x232 h=compact v=compact ... screen=(678.0, 466.0)が現れただけで、上の数には入れていません。このビルドはsdk 27.0とスタンプされていました。10月2日の追記と脚注13を参照してください。 ↩↩↩↩↩↩↩

  7. Apple、2026年9月19日に取得したドキュメントのJSON。ArrangementView、UIArrangementViewController、reservedRegions(kind:options:layoutDirectionBehavior:)、reservedRegions(kind:options:)、toolbarVerticalBehavior(_:)。いずれのページも、プラットフォームのavailabilityはiOS 27.1とiPadOS 27.1で、beta表示です。Apple、Preparing your app for iPhone Duo、同じ日に取得。ガイドが使う名前の出どころです。 ↩↩↩↩

  8. Apple、Xcode 27.2 Beta Release Notes、2026年9月19日取得、SDK、Known Issues、187160501を引用。2026年9月26日に再取得し、Overviewの補足「Download Xcode 27.1 beta to get the iOS SDK and simulator support for iPhone Duo.」を引用。 ↩↩↩

  9. Apple、「Get ready with the latest beta releases」、ニュース、2026年9月16日、「Note about iOS 27.1 and iPhone Duo」を引用。 ↩

  10. Apple、Designing for iPhone Duo、Human Interface Guidelines、2026年9月20日にドキュメントのJSONエンドポイント経由で取得。「Controls on the side include both system and app elements: the Dynamic Island, the status bar, the toolbar (including navigation buttons), and the tab bar.」、そして「A hinge in the center lets people open and close the device」。2026年10月2日に再取得し、Vertical controlsから「The exception is the inner display in portrait, which has enough vertical space to keep standard horizontal bars.」、Anatomyから「The inner camera is behind the display and stays hidden until the camera is active.」を引用。 ↩↩↩↩

  11. Apple Newsroom、Apple unveils iPhone Duo、2026年9月9日、2026年9月20日取得。StandByの段落から「Set iPhone Duo down and it enters StandBy on either the outer or inner display」と「hub for widgets」を引用。 ↩

  12. Sven-Eric Molzahn、iphone-duo-probe、GitHubのREADME、2026年9月24日取得(最新コミットは2026年9月20日)。「Two caveats before reaching for it: reservedRegions is empty on the first geometry evaluation and populated on a later one」と「Half-folded, inner display, content 867 × 575, hinge band at x 455.5…495.5」を引用。Antoine van der Lee、iPhone Duo Simulator: Testing and optimizing your SwiftUI app、SwiftLee、2026年9月22日、引用。 ↩↩↩

  13. 筆者による再実行、2026年10月2日。macOS 27.0(26A428)、Xcode 27.1 beta(27A9269)、iOS 27.1ランタイム(24A94401)、同じDuo-27.1シミュレータ。プローブはDuoProbe2。1つのSwiftファイルで、最初のタブに5つのツールバー項目を持つNavigationStackを収めたTabView、本文で説明した読み出し表示、そしてウィンドウ、ウィンドウシーンのスクリーン、UIScreen.main、verticalBarEdgeトレイトをログに出すUIKitのビューから成ります。このファイルから27.1のシミュレータSDKに対して2回ビルドし、記録するSDKバージョンをリンカに指定しました(-Xlinker -platform_version -Xlinker ios-simulator -Xlinker 27.1 -Xlinker 27.0と... 27.1)。otool -lはsdk 27.0とsdk 27.1を出力しました。9月のやり方による3つ目のビルド、つまりSDKROOTを未設定にしたswiftc -sdk <iPhoneSimulator27.1.sdk>は、clang: warning: using sysroot for 'macOS 27.0' but targeting 'arm64-apple-ios27.1.0-simulator'を出力してsdk 27.0とスタンプされました。SDKROOTをシミュレータSDKへ向けてexportすると、同じコマンドでsdk 27.1とスタンプされます。違いを明らかにした実際のアプリはKiradex(941 Apps)で、Xcode 27.1 betaでビルドしたもの、minos 27.0、sdk 27.1です。コンソールの行、27.1スタンプ、Closed: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。Closedで回転:size=594x350 ... h=compact v=compact verticalEdge=trailing、window=(678.0, 466.0)。Open: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:同じで、division[0] active=trueとhinge=partiallyOpen 127 deg、そしてsceneScreen=(951.0, 669.0)と並んでmainScreen=(466.0, 678.0)。Openで回転:size=669x734 ... verticalEdge=nil safe=EdgeInsets(top: 134.0, leading: 0.0, bottom: 83.0, trailing: 0.0) divisions=1 occlusions=2、division[0] active=false frame=(0,321 669x40)、occlusion[0] active=false frame=(611,543 37x58)、occlusion[1] active=true frame=(535,-134 134x82)、window=(669.0, 951.0)、mainScreen=(466.0, 678.0)、verticalBarEdge=0。Bookで回転:同じで、division[0] active=true。フレームは読み出し表示のビューの座標系で、その原点はウィンドウの上端から82または134ポイント下にあります。27.0スタンプ:Closedでwindow=(386.0, 678.0)、OpenとBookで(871.0, 669.0)、Openで回転して(669.0, 871.0)、Closedで回転して(678.0, 386.0)、どの行でもverticalEdge=nil、verticalBarEdge=0、divisions=0 occlusions=0。PlainProbeは、同じタブビュー、ナビゲーションスタック、ツールバーを持ち、27.1 SDK由来のものを何も含まない版で、Xcode 27.0(27A266a)がそれ自身のiOS 27.0 SDKに対してコンパイルしたもの(otool:minos 27.0、sdk 27.0)です。Closedでwindow=(386.0, 678.0)、Openで(871.0, 669.0)。27.1での各起動では、最初の6回から9回の評価が、領域が現れる前にdivisions=0 occlusions=0をログに出し、そのうち3回はビューがサイズを持つ前でした。カメラのocclusionは、Appleの「Outer Closed Portrait」ベゼルPNGと比較しました。その3xのカメラの切り欠きは、横方向に400.3から436.3ポイント、縦方向に29.7から65.7ポイントの範囲です。occlusionはウィンドウのポイントで横399から436、縦30から67の範囲にあり、どの辺でも1.3ポイント以内に収まります。ペインの位置はキャプチャから測りました。平らなときはプライマリがx 8から433.7、セカンダリが433.7から859。Bookではプライマリが455.7まで、空の帯が495.7まで、セカンダリが859まで。プローブのシートは、Openでは中央に653x501、Bookではleading側の端に459x501と測れました。プローブのarrangementのビューをコンテンツ領域いっぱいに広げる起動オプションを付けると、回転したディスプレイではプライマリのペインがセカンダリの上に表示され、.split.axes(.horizontal)ではプライマリのペインだけが表示されました。 ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  14. Apple、Releases、RSSフィードを2026年10月11日に取得:「Xcode 27.1 RC (27A9275)」は Mon, 05 Oct 2026 10:00:00 PDT 付け。Apple、App Store Connect release notes、2026年10月11日取得、2026年10月5日付けの項目:「You can now upload apps built with Xcode 27.1 RC using the SDK for iOS 27.1, 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.」(Xcode 27.1 RCでiOS 27.1、iPadOS 27.0、macOS 27.0、tvOS 27.0、visionOS 27.0、watchOS 27.0のSDKを使ってビルドしたアプリを、App Store向け、およびTestFlightによる内部・外部テスト向けにアップロードできるようになった)。Apple、Xcode 27.1 RC Release Notes、2026年10月11日取得、Simulator、Known Issues:「StandBy is unavailable in the iPhone Duo Simulator runtime. (187708663)」(iPhone Duo SimulatorランタイムではStandByを使えない)と「Running and debugging most app extensions is unavailable in the iPhone Duo Simulator runtime. (187708767)」(iPhone Duo Simulatorランタイムでは大半のApp Extensionの実行とデバッグができない)。ベータのノートと同じです。 ↩↩↩↩

  15. Apple、Releases、RSSフィードを2026年10月15日の太平洋時間17:16(10月16日の00:16 UTC)に取得:「Xcode 27.1 (27A9275)」は Thu, 15 Oct 2026 13:00:00 PDT 付けで、10月11日の取得時にあった10月5日のRCの項目と同じビルド番号です。そのRCの項目は、もうフィードにありません。Apple、Xcode 27.1 Release Notes、ドキュメントのJSONエンドポイント経由で2026年10月15日の太平洋時間17:21に取得、「Xcode 27.1 RC Release Notes」から改題。Overview:「Xcode 27.1 includes Swift 6.4 and SDKs for iOS 27.1, iPadOS 27, tvOS 27, watchOS 27, macOS 27, and visionOS 27.」(Xcode 27.1にはSwift 6.4と、iOS 27.1、iPadOS 27、tvOS 27、watchOS 27、macOS 27、visionOS 27のSDKが含まれる)。iPhone Duo Simulatorの2つのKnown Issues、187708663と187708767は変更なし。Apple、App Store Connect release notes、2026年10月15日の太平洋時間17:20に取得、2026年10月15日付けの項目「App Store Connect updates」:「You can now upload apps built with Xcode 27.1 using the SDK for iOS 27.1, 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.」(Xcode 27.1でiOS 27.1、iPadOS 27.0、macOS 27.0、tvOS 27.0、visionOS 27.0、watchOS 27.0のSDKを使ってビルドしたアプリを、App Store向け、およびTestFlightによる内部・外部テスト向けにアップロードできるようになった)と「Submit your iPhone Duo optimized apps and games in App Store Connect today. Starting April 2027, any apps or games submitted will need to include screenshots for iPhone Duo.」(iPhone Duoに最適化したアプリやゲームを、今日からApp Store Connectで提出できる。2027年4月以降、提出するアプリやゲームにはiPhone Duoのスクリーンショットが必要になる)。同じ時間帯に取得したAppleのデベロッパニュースのフィードには、このリリースの項目はありません。 ↩↩↩↩↩

  16. Apple Newsroom、「iPhone Duo arrives at Apple Store locations worldwide」、2026年10月23日、10月26日に取得:「On Friday, October 23, the highly anticipated iPhone Duo made its debut at Apple Store locations worldwide.」。Apple Support、「Apple security releases」、2026年10月26日に取得:「iOS 27.1」「This update has no published CVE entries.」「iPhone Duo」「23 Oct 2026」の行で、リンクはありません。Apple、Releases、RSSフィードを2026年10月26日の太平洋時間16:12に取得:「iOS 27.2 (24B91020)」と「iOS 27.2 (24B119)」は Mon, 26 Oct 2026 10:00:00 PDT 付け。「Xcode 27.2 RC (27B48)」は Mon, 19 Oct 2026 付けで、最新のXcodeの項目です。iOS 27.1のリリースを名前に含む項目のタイトルはありません。10月26日に取得したiOS & iPadOS Release Notesの索引には「iOS & iPadOS 27 Release Notes」と「iOS & iPadOS 27.2 Release Notes」しかなく、27.1のページのJSONエンドポイントは404を返しました。Apple、Xcode 27.2 RC Release Notes、2026年10月26日に取得(Last-ModifiedはMon, 19 Oct 2026 04:56:10 GMT):Device Hub、Known Issues(187146039、187148389、回避策付きの189465196)。Mac Catalyst、Known Issues(185924957)。Simulator、Resolved Issues(190155353)。引用。Apple、iOS & iPadOS 27.2 Release Notes、2026年10月26日に取得:UIKit、New Features(186294594)。筆者のMac、2026年10月26日、macOS 27.0(26A428)、/Applications/Xcode.appのXcode 27.1(27A9275):iPhoneOS.sdk/System/Library/CoreServices/SystemVersion.plistとiPhoneSimulator SDKのplistはどちらもProductVersionを27.1、ProductBuildVersionを24A94232としています。xcrun simctl list runtimesは「iOS 27.1 (27.1 - 24A94425)」と表示し、-jはsupportedDeviceTypesのエントリとして「iPhone Duo」の1つだけを挙げます。com.apple.CoreSimulator.SimRuntime.iOS-27-1上でのcom.apple.CoreSimulator.SimDeviceType.iPhone-16-Proのxcrun simctl createは、「Incompatible device」(SimError 403)で失敗しました。マージンのプローブとその出力は、iOS 27.2のリリースノートの記事の脚注4にあります。 ↩↩

関連記事

iPhone Duoへのアプリ対応:実例でたどる準備と提出

iPhone Duo向けにアプリを準備して提出する方法。レイアウトを切り替えるSDKスタンプ、実アプリで全ポーズを歩いた結果、スクリーンショット、App Storeのルールまで。

55 分で読める

iOS 27.2リリースノート:何が出荷され、27.1はどこへ消えたのか

iOS 27.2(24B119)が10月26日に出荷されました。新機能2件、修正5件、既知の問題7件、CVE 162件、そしてiPhone Duoだけが受け取ったiOS 27.1。開発者向けにノートを読み解きます。

25 分で読める

ピクセルアートの建物:iPhoneでつくる家、ホール、室内

ポケモン、スーパーファミコンのRPG、Stardewは家と室内と階をどう作っているのか。ソースから実測し、KiradexのiPhoneの町に本物の建物を建てるまでをまとめました。

63 分で読める