Xcode 27.1 beta:在 iPhone Duo 模擬器上跑您的 App

Xcode 27.1 beta(27A9269)於 2026 年 9 月 18 日(週五)推出,帶來第一個 iOS 27.1 SDK,以及模擬器可用的 iPhone Duo 裝置類型,比 Xcode 27.0 晚四天。這個 SDK 收錄了 Apple 準備指南點名的每一個 iPhone Duo API;裝置類型的設定檔把兩塊螢幕定義為 1398 × 2034 與 2007 × 2853 像素、scale 3,換算後是 466 × 678 與 669 × 951 點;模擬器執行環境則是另外的下載,由 Xcode 依需要抓取。Apple 自己的說明列出模擬器目前還做不到的三件事;而一支以 27.1 SDK 連結的探測 App 走過 Device Hub 的三種姿態後,闔上時填滿 466 × 678 點的螢幕,各列沿後緣排列,展開時填滿 951 × 669 點的螢幕,後者兩個 size class 都是 regular,摺疊處以分隔區域回報、相機與狀態直欄以遮蔽區域回報,而且 App 明明跑在內側螢幕上,UIScreen.main 仍然回答外側螢幕的數值。(10 月 2 日更正:在此之前,這一段寫的是探測 App 看不到任何保留區域;那支探測 App 當時被連結成了 iOS 27.0 App。)1245613

重點摘要

  • 日期與 build 編號。 Apple 的發佈摘要把 Xcode 27.1 beta(27A9269)繫在 9 月 18 日(週五)。xcodebuild -version 印出 Xcode 27.1 與 Build version 27A9269;iPhoneOS 與 iPhoneSimulator 兩份 SDK 都自稱 iOS 27.1、build 24A94403;Swift 編譯器回報的版本字串 swiftlang-6.4.0.34.1 與 Xcode 27.0 相同,連結器同樣是 ld-27037.1。xip 檔為 2,027,292,809 位元組,解開後的 App 是 3.6 GiB,可以裝在 Xcode 27.0 旁邊而不取代它。14(10 月 11 日:Xcode 27.1 RC(27A9275)隨後於 10 月 5 日推出,App Store Connect 除了 TestFlight,也接受以它建置的版本上架 App Store。14)(10 月 15 日:Xcode 27.1 以正式版推出,建置 27A9275,與 RC 相同;App Store Connect 當天的條目以這個名稱接受它的建置上架 App Store。15)
  • Duo 的 API 都在 SDK 裡了。 我在 9 月 17 日檢查時,有十個名稱在 27.0 SDK 裡遍尋不著,它們在 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)),比文件頁面列出的多了兩個平台。4
  • 模擬器設定檔把螢幕尺寸寫死了。 iPhone Duo 裝置類型(iPhone19,4、產品類別 V68、型號 A3447)定義了兩塊內建螢幕:primary 為 1398 × 2034 像素、scale 3,primary-1 為 2007 × 2853 像素、scale 3,原生方向 270。除以三之後分別是 466 × 678 與 669 × 951 點,其中內側那組數字,正是我在 9 月 10 日的 Duo 開發者文章裡,從 App Store Connect 的螢幕截圖尺寸推得的那組。設定檔要求執行環境 27.1 以上。5
  • 模擬器面對真實 App 的表現(10 月 2 日更正)。 Device Hub 提供三種姿態,Closed(闔上)、Book(書本狀)與 Open(展開),外加 Rotate Right(向右旋轉)。以 27.1 SDK 連結的探測 App,闔上時拿到整塊外側螢幕,466 × 678 點、寬度 compact,工具列與標籤列立在後緣,toolbarVerticalEdge 讀出 trailing,並有兩個作用中的遮蔽區域,也就是相機與狀態直欄。展開時,它拿到整塊內側螢幕,以橫向為原生方向的 951 × 669 點,兩個 size class 都是 regular,各列同樣垂直,中央有一條寬 40 點、非作用中的分隔區域,到了 Book 姿態就轉為作用中;旋轉後為 669 × 951,各列改為橫向。App 在內側螢幕上時,UIScreen.main.bounds 仍持續回報 466 × 678。10 月 2 日之前,這一條列出的是螢幕尺寸 466 × 678 與 951 × 669,展開時左右各有 34 的安全區域邊距,工具列橫向,任何姿態都沒有保留區域;內文列出的則是探測 App 量到的範圍,比螢幕窄 80 點(闔上時 386 點,展開時在 34 點邊距之內為 803 點)。這些全都來自一支誤被連結成 iOS 27.0 App 的探測 App:那是 27.0 SDK 拿到的結果,下方的更新收錄了兩種建置。61213
  • 這個 beta 還做不到的事。 Apple 的說明列出三項限制,分別是漫長的首次啟動、缺席的 StandBy,以及大多數 App Extension:「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)。如果您的 App 同時也在 Mac 上推出,還要再加上兩則 Mac Catalyst 的 Known Issues;另外有一件 Apple 沒有列出來的事:執行環境的下載在我這裡第一次以 Download failed. 收場,重試才成功。23

10 月 2 日更新:9 月的探測 App 被連結成了 iOS 27.0 App

本文從 9 月 21 日到 10 月 2 日所刊載的模擬器結果,量測無誤,描述卻錯了。它們是 iPhone Duo 模擬器面對一支以 iOS 27.0 SDK 建置的 App 時的表現,我卻把它們寫成面對以 27.1 建置的 App 時的表現。

哪裡出了錯。 探測 App 是一個 Swift 檔案,直接呼叫 swiftc -sdk <iPhoneSimulator27.1.sdk> 編譯而成。這個旗標送得到編譯器,卻送不到連結步驟;在那一步,驅動程式退回使用同一個 Xcode 裡的 macOS SDK,並把該 SDK 的版本寫進二進位檔:LC_BUILD_VERSION 讀出來是 sdk 27.0。iOS 正是依據這個數字,決定 App 能拿到哪些行為。10 月 2 日再執行一次,同一道指令以警告的形式印出了原因:「using sysroot for ‘macOS 27.0’ but targeting ‘arm64-apple-ios27.1.0-simulator’」(使用了「macOS 27.0」的 sysroot,目標卻是「arm64-apple-ios27.1.0-simulator」);假如它在 9 月也印過這一行,我當時並沒有把它看成任何問題的原因。13

怎麼發現的。 10 月 2 日,我在同一個模擬器上執行了一支真正的 App,由 Xcode 27.1 beta 以同一份 SDK 建置。它的工具列與標籤列沿著外側螢幕的側邊立著,而探測 App 的各列當時是橫躺在頂端。對兩個二進位檔執行 otool -l,App 顯示 sdk 27.1,以 9 月那種方式重新建置的探測 App 則顯示 sdk 27.0。設定好 SDKROOT 再重新建置後,探測 App 讀出 sdk 27.1,行為也和那支 App 一致。另外,一個由 Xcode 27.0 本身、對著真正的 iOS 27.0 SDK 編譯的陽春版探測 App,拿到的視窗和那支標錯版本的探測 App 完全相同,所以 9 月的數字確實足以代表 27.0 建置的樣貌。13

重新執行。 同一份原始碼,以兩種方式連結,在每一種姿態下執行,使用同一個 Xcode 27.1 beta(27A9269)與執行環境(24A94401):13

姿態 以 SDK 27.0 連結 以 SDK 27.1 連結
Closed 視窗 386 × 678 點,旁邊是一條黑色直欄;各列橫向;toolbarVerticalEdge 為 nil;沒有區域 視窗 466 × 678,即整塊螢幕;工具列與標籤列垂直位於後緣;toolbarVerticalEdge 為 trailing;兩個作用中的遮蔽區域
Closed,旋轉後 視窗 678 × 386;各列橫向;沒有區域 視窗 678 × 466;兩個 size class 皆為 compact;各列垂直;兩個作用中的遮蔽區域,即相機與狀態直欄
Open 視窗 871 × 669;各列橫向;沒有區域 視窗 951 × 669;各列垂直;一個非作用中的分隔區域,一個非作用中與一個作用中的遮蔽區域
Open,旋轉後 視窗 669 × 871;各列橫向;沒有區域 視窗 669 × 951;各列橫向;toolbarVerticalEdge 為 nil;同樣三個區域,隨之旋轉
Book 同 Open 同 Open,分隔區域轉為作用中
Book,旋轉後 同 Open 旋轉後 同 Open 旋轉後,分隔區域轉為作用中

撤回的內容。 三項陳述,每一項對 27.0 建置都成立,對標記為 27.1 的建置則不成立:工具列從未直向繪製;reservedRegions 在任何姿態下都回傳空的結果;以及模擬器只把狀態直欄旁的那塊畫面交給 App。第四項錯在原因:我寫過,旋轉之後分割式 arrangement「stays side by side even though the container is now taller than it is wide」(即使容器已經高於寬,仍維持左右並排)。其實探測 App 裡的 arrangement view,在那塊畫面中本身就是寬大於高,而它是依自己的形狀來分割的;一個填滿旋轉後螢幕的 arrangement 會上下堆疊,正如 Apple 指南所說。第五項:重點摘要列出的是螢幕尺寸 466 × 678 與 951 × 669,內文列出的卻是探測 App 量到的範圍,窄了 80 點(闔上時 386 點,展開時在 34 點邊距之內為 803 點);27.0 建置從來沒有拿到整塊螢幕。713

仍然成立的內容。 模擬器那一節以外的一切:日期與 build 編號、SDK 符號表、裝置設定檔及其像素與點的尺寸、執行環境的下載,以及 Apple 的 Known Issues。那一節之內:螢幕尺寸、size class、Device Hub 提供的姿態、screenConfig 造成的當機,以及 UIScreen.main 的陷阱,後者在重新執行時以 27.1 標記同樣重現。被這次更新取代的 9 月 24 日說明曾猜測,那些零來自太早讀取區域,並承諾會在多個鉸鏈角度下重新執行。這個猜測錯了:27.0 建置不論問多久,都一個區域也拿不到。但它引用自 Molzahn 的那項觀察成立:正確連結的探測 App,在前六到九次計算中讀不到任何區域,之後則全部讀得到。鉸鏈角度的測試並沒有進行。1213

如果您照著本文自己做了一支探測 App,請檢查一下:otool -l <app>/<binary> | grep -A4 LC_BUILD_VERSION。由 Xcode 建置的專案會被正確標記。手動編譯的檔案,則需要在 swiftc 執行前把 SDKROOT 匯出為模擬器 SDK。讓這個問題浮上檯面的實作範例收錄了三方比較,另外還有 iOS 26 的標記。

10 月 26 日更新:手機搭載 27.1 出貨,以及正式版 SDK 的編號

根據 Apple Newsroom 與 Apple 的安全性更新頁面,iPhone Duo 於 10 月 23 日(星期五)搭載 iOS 27.1 上架門市;安全性頁面只為「iPhone Duo」列出「iOS 27.1」,沒有公布的 CVE 條目;iOS 27.1 的項目始終沒有出現在發佈摘要中,27.1 的發行說明頁面也始終沒有出現,索引只列出 27 與 27.2。在這台 Mac 上,Xcode 27.1(27A9275)自 10 月 15 日起就是正式版,其中的 iPhoneOS 與 iPhoneSimulator SDK 自稱 iOS 27.1,建置 24A94232,比上文記錄的 beta 版 24A94403 還小;iOS 27.1 模擬器執行環境則是 24A94425,xcrun simctl list runtimes -j 為它只列出一種支援的裝置類型,也就是 iPhone Duo;以它為執行環境 simctl create 一台 iPhone 16 Pro,會以「Incompatible device」失敗。iOS 27.2 在今天(10 月 26 日)推出(24B119,同一分鐘還有第二個 iOS 27.2 建置 24B91020),而 Xcode 27.2 RC(27B48,10 月 19 日)的發行說明載有四則 iPhone Duo 條目:「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 的 App 可以在沒有進行中的相機擷取工作階段時,同時使用兩塊螢幕。)(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.」(用滑鼠點一下目前可見的螢幕。);以及兩則從 beta 沿用下來、如今都歸在 Device Hub 之下的已知問題:截圖在「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」的 Mac Catalyst 條目沒有改變。iOS 27.2 發行說明中有一則 UIKit 條目提到 27.1,也就是 UIView 的預設版面邊距歸零;用同一份原始碼建置、在 iPhone Duo 模擬器的 27.1 執行環境上執行的探測 App,在 LC_BUILD_VERSION 標記為 sdk 27.0 時回報 8 點(正是上方 10 月 2 日更新所警告的手動編譯陷阱),標記為 sdk 27.1 時則回報零,所以這項變更除了取決於作業系統,也取決於二進位檔所連結的 SDK;完整表格請見 iOS 27.2 發行說明那篇文章。16

beta 裡有什麼?

Apple 的發佈摘要把 「Xcode 27.1 beta (27A9269)」 列在 9 月 18 日(週五)上午 10:00 PT,同日下午還有一則 「TestFlight Update」;App Store Connect 當天的發行說明則寫明,現在可以把用 Xcode 27.1 beta 搭配 iOS 27.1 beta 或 iPadOS 27.1 beta SDK 建置的 App,送交內部與外部測試:「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 這份清單請照字面讀:只有 iOS 停在 27.1,SDK 自己的 SDKSettings.plist 回報的版本是 27.1,而 App Store Connect 卻把同一份 SDK 稱作 「iPadOS 27.1 beta」,這個小矛盾在 Xcode 27 那篇文章裡也同樣存在。

下載量比版本號看起來要小。xip 檔為 2,027,292,809 位元組,由 Apple 以其 Software Update 憑證簽署,解開後是一個 3.6 GiB 的 App,和 Xcode 27.0 一樣大;用 xip --expand 解到某個資料夾、改名為 /Applications/Xcode-27.1-beta.app、再把 DEVELOPER_DIR 指過去,命令列工作的安裝就到此為止。接著在這個 beta 底下第一次呼叫 xcodebuild 時,它自行花了大約兩分鐘安裝隨附的 CoreTypes.pkg 與 XcodeSystemResources.pkg,也就是 xcodebuild -runFirstLaunch 會明確執行的那個步驟,而其中第二個套件,正是把 iPhone Duo 裝置類型放到位的那一個。4 App 裡沒有的東西,是模擬器執行環境。這個 beta 找得到這台 Mac 上既有的 iOS 執行環境,27.0 也在其中,卻沒有任何 27.1 的;在 beta 底下執行 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.";第二次加上 -buildVersion 24A94401,回報執行環境為 7.85 GB,順利跑完,之後 simctl list runtimes 就列出了 「iOS 27.1 (27.1 - 24A94401)」。請先把硬碟空間算進去:這個執行環境是 Xcode 下載量的四倍。3

iPhone Duo 模擬器首次開機時的外側螢幕,執行 iOS 27.1 beta:深色主畫面,左上角是「設定」圖示,時鐘與 Wi-Fi 狀態沿右緣垂直排列,右側有一個 Dock 圖磚,右下角則是搜尋按鈕

iPhone Duo 模擬器首次開機時的外側螢幕,1398 × 2034 像素:狀態元件沿著右緣排列,而那一側正是 Apple 的 Human Interface Guidelines(人機介面指南)在 iPhone Duo 上安置動態島與狀態列的位置。10

要怎麼取得 iPhone Duo 模擬器?

總共三個步驟,沒有一個是網頁上的下載按鈕。Apple 只在 Xcode 裡提供這個模擬器,而且只在 27.1 beta 裡:27.2 beta 的說明有一段旁註寫著「Download Xcode 27.1 beta to get the iOS SDK and simulator support for iPhone Duo.」(下載 Xcode 27.1 beta,即可取得 iPhone Duo 的 iOS SDK 與模擬器支援)。8(10 月 11 日:Xcode 27.1 RC(27A9275)已於 10 月 5 日推出,其說明列出了相同的 iPhone Duo 模擬器已知問題,因此 beta 不再是唯一一個說明涵蓋 Duo 模擬器的 Xcode 27.1;我沒有安裝 RC。14)(10 月 15 日:Xcode 27.1 以正式版推出,建置 27A9275,與 RC 相同,其說明列出同樣兩則 Duo 模擬器已知問題;我沒有安裝它。15)

  1. Xcode 27.1 beta(27A9269),從開發者下載頁面取得,Apple 的 Releases 頁面把日期標在 9 月 18 日(週五)。展開 xip,把 App 以帶版本號的名稱(例如 /Applications/Xcode-27.1-beta.app)移到 Xcode 27.0 旁邊,並在命令列工作時把 DEVELOPER_DIR 指向它;這個 beta 需要 macOS Tahoe 26.6 或更新版本。12
  2. iOS 27.1 執行環境,xip 裡並沒有。在 DEVELOPER_DIR 指向 beta 的情況下執行 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 執行環境,所以無論它畫出什麼,都不是這裡測得的 size class、保留區域或外側螢幕行為的來源;若想在沒有執行環境的情況下檢查版面,這個 beta 替 Xcode 的 Previews 畫布加上了一個供替代螢幕使用的 Display 群組。2

27.1 SDK 有 Duo 的 API 嗎?

9 月 17 日,我拿 Apple 「Preparing your app for iPhone Duo」 指南裡的名稱去搜 iOS 27.0 SDK,十個裝置專屬名稱一個也沒找到。同樣的搜法對 27.1 SDK 再跑一次,也就是對模組介面與標頭檔做單純的文字搜尋,這次全部找得到。表格的每一列是搜尋用的子字串:其中七列涵蓋了十個名稱中的九個,因為兩個 reservedRegions 方法共用一列、兩個 axisBehavior 成員也共用一列;另外三列則是這些名稱背後的型別,也就是 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 個檔案

這張表裡有兩個細節會影響您的寫法。SwiftUI 的型別其實住在 SwiftUICore,也就是 import SwiftUI 會再匯出的那個模組,所以一般的 import 就找得到;另一點是,可用性標註在平台上和文件說得不一樣。SwiftUICore 介面宣告 ArrangementView、SwiftUI 介面宣告 toolbarVerticalBehavior(_:),兩者都掛在 @available(anyAppleOS 27.1, *) 之下,那是 Apple 用來代表「該版本的所有平台」的簡寫;而 UIArrangementViewController.h 以及 UIView.h 裡的 reservedRegionsOfKind: 方法,帶的是 API_AVAILABLE(ios(27.1), tvos(27.1), visionos(27.1)) 搭配 API_UNAVAILABLE(watchos);在 UIVerticalBarEdge.h 裡,列舉與 verticalBarEdge trait 帶著同樣一組,Leading 與 Trailing 兩個 case 則帶著 API_AVAILABLE(ios(27.1)) API_UNAVAILABLE(visionos) API_UNAVAILABLE(watchos, tvos)。Apple 這五個名稱的文件頁面,都只列出 iOS 27.1 與 iPadOS 27.1,並標示為 beta。47 就針對 iOS 來寫,其餘的讓編譯器告訴您。

指南用到、而 27.0 SDK 裡本來就有的那三個名稱沒有變動:presentationPlacement(_:) 依然掛在 @available(anyAppleOS 27.0, *) 底下,backgroundExtensionEffect() 從 iOS 26 就在了,而指南提到的兩個 ToolbarItemPlacement case 中,topBarPinnedTrailing 掛在 @available(iOS 27.0, visionOS 27.0, *) 底下,cancellationAction 則除了型別本身的可用性之外沒有自己的標註。4

模擬器的裝置設定檔怎麼描述這兩塊螢幕?

Apple 為這個 beta 安裝的裝置類型 iPhone Duo.simdevicetype,是放在 /Library/Developer/CoreSimulator/Profiles/DeviceTypes 下的一個普通 bundle,它的兩份 property list 回答了規格表留下的問題。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,以及一個含兩筆內建與三筆虛擬項目的 displays 陣列。5

設定檔中的螢幕 像素 Scale 點 原生方向 圓角半徑 色彩空間
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 四角皆 55 sRGB

第一列是外側螢幕,和 Apple 規格表的像素完全吻合。第二列是內側螢幕,它的像素數是 App Store Connect 的螢幕截圖尺寸 2007 × 2853,而不是面板本身的 1878 × 2670:模擬器以 3x、669 × 951 點來繪製內側螢幕,那正是我在 9 月 10 日的 Duo 開發者文章裡算出、並標明為推論的那筆算式。如今 Apple 自己的設定檔就寫著這個數字。270 度的原生方向說明內側螢幕原生是橫向的,手機展開時寬 951 點、高 669 點,這和 Apple 給展開狀態的尺寸吻合。剩下兩個數字則屬於模擬器而非硬體:兩塊螢幕在設定檔裡都寫成每英寸 460 像素、60 Hz,而規格表給內側面板的是 430 ppi,所以 hdpi 應當視為佔位值。5

設定檔連形狀也一併附上。每塊螢幕都指向一份 framebuffer 遮罩,也就是可視區域的 PDF。外側螢幕的遮罩四角不對稱,設定檔的值是長邊其中一側 8、另一側 59;依我的判讀,半徑較小的那一側,就是接上 Apple 設計指南所描述之中央轉軸的那一側。內側螢幕的遮罩則是單純的圓角矩形,用設定檔裡的圓角值 55,而且沒有為前置相機留下缺口,所以相機造成的遮蔽是執行期由保留區域 API 提供的,而不是來自 framebuffer 的形狀。510

模擬器實際顯示什麼?

裝置開機時是闔上的。首次開機時外側螢幕顯示主畫面,內側螢幕的 framebuffer 是開著的但一片漆黑;simctl io enumerate 會用設定檔裡的名稱列出兩塊內建螢幕,primary 為 1398 × 2034、primary-1 為 2007 × 2853,旁邊則是一如往常的虛擬螢幕。6 姿態就住在 Device Hub 裡。選取 Duo 裝置後,它的視窗會把 Rotate Right、Closed、Book 與 Open 顯示為按鈕,而這些按鈕可以用輔助使用 API 按下,本節的所有操作都是這麼驅動的;simctl 沒有姿態指令。6

探測 App 是一支單檔的 SwiftUI App:一個 tab view,裡面是帶有五個工具列項目的導覽堆疊;一塊讀數區,顯示幾何數值、size class、toolbarVerticalEdge 環境值、鉸鏈,以及用 includeInactive 取得的兩種保留區域;再加上一個 split 樣式的 ArrangementView。它在 body 的每一次計算時讀取區域,並每秒重新計算一次。以下數字來自 10 月 2 日以 27.1 SDK 連結後的重新執行;9 月那幾次誤以 27.0 連結的執行,放在後面自己的標題之下。13

以 27.1 SDK 連結

Closed。 App 拿到整塊外側螢幕:視窗為 466 × 678 點,寬度 compact、高度 regular。工具列與標籤列立在後緣、時鐘下方,toolbarVerticalEdge 讀出 trailing,UIKit 的 verticalBarEdge trait 讀出原始值 2。導覽堆疊裡的內容量到 382 × 562 點,安全區域邊距為上方 82、下方 34、後緣 84,後緣那 84 點就是那條直欄。回報的遮蔽區域有兩個,都是作用中:一個 37 點見方,位於外側相機所在處;另一個 84 × 170,蓋住相機以及各列上方的狀態直欄。這塊螢幕上沒有回報分隔區域。把它轉成橫放,是 678 × 466,兩個 size class 都是 compact,各列仍在後緣。13

以 27.1 SDK 連結的探測 App 顯示在 iPhone Duo 模擬器的外側螢幕上:內容尺寸 382 × 562 點,size class 為 compact 與 regular,toolbarVerticalEdge 為 trailing,鉸鏈為闔上,兩個作用中的遮蔽區域,分割式 arrangement 上下堆疊,右緣則有一條直欄,依序放著時鐘與 Wi-Fi 狀態、四個工具列按鈕與三個分頁按鈕

Closed,27.1 SDK:整塊 466 × 678 點的螢幕,各列沿後緣排列。

Open。 App 以原生橫向移到內側螢幕:視窗為 951 × 669 點,兩個 size class 都是 regular,各列仍垂直位於後緣。內容量到 867 × 553,三個邊距和闔上時相同。回傳的區域有三個。一條寬 40 點的分隔區域,在螢幕正中央縱貫全高,從 x 455 到 495,兩側各有 20 點邊距,而且是非作用中的:手機是攤平的。一個 58 × 37、非作用中的遮蔽區域標出內側相機,Apple 的指南說這顆相機「stays hidden until the camera is active.」(在相機啟用之前都保持隱藏)。10 一個 84 × 120、作用中的遮蔽區域蓋住狀態直欄。分割式 arrangement 把兩個窗格左右並排,平分寬度。13

以 27.1 SDK 連結的探測 App 顯示在 Open 姿態的內側螢幕上:內容尺寸 867 × 553 點,size class 為 regular 與 regular,toolbarVerticalEdge 為 trailing,鉸鏈完全展開為 180 度,一個位於 x 455、寬 40 點的非作用中分隔區域,一個非作用中與一個作用中的遮蔽區域,分割式 arrangement 左右並排,各列則在右緣排成一條直欄

Open,27.1 SDK:951 × 669 點,摺疊處以一條縱貫中央、非作用中的分隔區域回報。

Book。 Device Hub 的 Book 姿態把鉸鏈回報為部分展開,角度 127 度。視窗大小不變,改變的是分隔區域:框不變,但轉為作用中。分割式 arrangement 隨之把分隔線移到摺疊處,並讓那條 40 點的帶子空著,因此主要窗格止於 x 455,次要窗格從 495 開始。在這個姿態下呈現的 sheet,會偏離中央,移到前緣那一半。13

以 27.1 SDK 連結的探測 App 顯示在 Book 姿態的內側螢幕上:鉸鏈部分展開為 127 度,一個作用中的分隔區域,分割式 arrangement 的兩個窗格之間,在螢幕中央隔著一條空白帶

Book,27.1 SDK:分隔區域轉為作用中,分割式 arrangement 讓摺疊處空著。

旋轉後。 在手機展開時按下 Rotate Right,得到 669 × 951 點的視窗,兩個 size class 仍是 regular,各列則回到橫向:toolbarVerticalEdge 為 nil,工具列位於頂端、時鐘旁邊,標籤列浮在底部。這和 Apple 的設計指引一致,指引在內側螢幕直向時保留「standard horizontal bars」(標準的橫向列)。10 同樣三個區域會在旋轉後的座標空間中回報:分隔區域如今是一條橫跨中央、高 40 點的橫帶,攤平時非作用中,Book 時作用中。探測 App 的 arrangement view 在那塊畫面中寬大於高,因此維持左右並排。13

以 27.1 SDK 連結的探測 App 顯示在轉為直向的內側螢幕上:內容尺寸 669 × 734 點,size class 為 regular 與 regular,toolbarVerticalEdge 為 nil,頂端時鐘旁是一條橫向工具列,底部是浮動的標籤列,一個非作用中的分隔區域與兩個遮蔽區域

Open 並旋轉,27.1 SDK:各列橫向,摺疊處如今是一條橫帶。

有兩件事在每一種姿態下都成立。第一,區域來得晚:每次啟動時,探測 App 的 body 前六到九次計算都讀不到任何區域,之後的每一次則全部讀得到,所以只在第一次版面配置時問一次的檢視,得到的是空的答案。Sven-Eric Molzahn 的 DuoProbe 測試夾具在 9 月 20 日就記錄了這一點(「reservedRegions is empty on the first geometry evaluation and populated on a later one」,reservedRegions 在第一次幾何計算時為空,之後的計算才有內容),也記錄了那條 40 點的帶子;SwiftLee 9 月 22 日的模擬器指南則補充「Holding Option ⌥ reveals a slider that you can use to control the hinge angle of the device with precision」(按住 Option ⌥ 會出現一個滑桿,可精確控制裝置的鉸鏈角度),這個滑桿我沒有用過。12 第二,App 明明跑在內側螢幕,UIScreen.main.bounds 卻回答 466 × 678 點,也就是外側螢幕,這正是 Apple 指南提醒的陷阱,它要開發者把版面計算建立在 「based on your scene or containing view’s bounds rather than screen dimensions」(依據您的 scene 或容器檢視的 bounds,而非螢幕尺寸):主螢幕並不是您所在的那塊螢幕。視窗 scene 自己的螢幕,回報的才是 App 實際所在的那塊。713

有一條通往其他姿態的路走不通。simctl io screenConfig 可以把某塊螢幕的電源關掉,但在內側螢幕保持開啟的情況下關掉外側螢幕,並不會讓手機展開;它反而弄垮了模擬器的系統 shell,接下來的 simctl launch 以 「The system shell probably crashed.」 失敗,只能重新開機。姿態還是住在 Device Hub 的視窗裡。6

以 27.0 SDK 連結

以下是本節到 10 月 2 日為止所刊載的數字,9 月 19 日與 20 日以一支只有導覽堆疊、沒有 tab view 的探測 App 量得,10 月 2 日再以目前這支重新量過。它們描述的是以 Xcode 27.0 建置的 App 在這個模擬器上拿到什麼。613

闔上時,視窗在 466 點寬的螢幕上只有 386 點寬:系統把那條 80 點的直欄留給自己,在黑底上畫出時鐘與狀態,App 的工具列則橫躺在頂端。展開時,視窗為 871 × 669,右側同樣少了 80 點,安全區域邊距左右各 34。展開並旋轉時,那 80 點改從頂端扣掉。每一種姿態下,size class 都和 27.1 建置相同,toolbarVerticalEdge 為 nil,verticalBarEdge 讀出原始值 0,兩種保留區域查詢都回傳空陣列,連非作用中的區域一起納入也一樣,而且不論探測 App 持續問多久都是如此;Book 與 Open 無從分辨。

9 月的探測 App 以 SDK 27.0 連結,顯示在 iPhone Duo 模擬器的外側螢幕上:右上方工具列有分享圖示、代表更多動作的刪節號與打勾按鈕,下方列出尺寸 386 × 510 點、size class 為 compact 與 regular、toolbarVerticalEdge 為 nil、divisions 0 與 occlusions 0,分割式 arrangement 把主要檢視放在次要檢視之上,時鐘與 Wi-Fi 狀態則沿右緣的黑色直欄垂直排列

Closed,以 27.0 連結:App 停在直欄前,工具列維持橫向。

9 月的探測 App 以 SDK 27.0 連結,顯示在 Open 姿態的內側螢幕上:尺寸 803 × 515 點,size class 為 regular 與 regular,toolbarVerticalEdge 為 nil,divisions 0 與 occlusions 0,分割式 arrangement 把主要與次要檢視左右並排,工具列位於右上角,時鐘與 Wi-Fi 狀態則在右緣的黑色直欄中

Open,以 27.0 連結:兩個維度都是 regular,直欄由系統保留。

9 月的探測 App 以 SDK 27.0 連結,顯示在轉為直向的內側螢幕上:尺寸 669 × 703 點,size class 為 regular 與 regular,分割式 arrangement 左右並排,時鐘與 Wi-Fi 狀態則位於橫跨頂端的黑色帶狀區域中

旋轉後,以 27.0 連結:橫跨頂端的那條帶子屬於系統。

這個 beta 還做不到的事

在這個 beta 自己的說明裡,Apple 於 Simulator、Known Issues 之下列出三項限制,分別是漫長的首次啟動、缺席的 StandBy,以及大多數 App Extension:「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 這一項,對於把小工具或即時動態設計給它用的人特別重要:Apple 的發表文說這支手機 「enters StandBy on either the outer or inner display」,並稱之為 「hub for widgets」,Duo 開發者文章寫過那裡會顯示什麼;在後續 beta 解除這道限制之前,這台裝置上的 StandBy 只能拿實機來確認(10 月 15 日:正式版的說明仍列出這一項15)。11

另外兩項落在 Mac Catalyst、Known Issues 之下,凡是採用這些 API 又同時為 Mac 建置的 App 都會被咬到:「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;以及 「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 beta 的說明又從反方向補上第三項:「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. 把這個 beta 裝在 Xcode 27.0 旁邊,而不是蓋過去:解開 xip、替 App 改名,再把 DEVELOPER_DIR 指向它來做命令列建置;beta 的說明裡沒有任何一項會動到 27.0 的工具鏈,而且編譯器與連結器帶的版本字串完全相同。4
  2. 在真正需要之前就先開始下載執行環境,在 beta 底下執行 xcodebuild -downloadPlatform iOS,失敗就重試;正是這個執行環境讓 iPhone Duo 裝置類型能夠開機,而且 Apple 已經先說了,首次啟動還要再多花上好幾分鐘。23
  3. 把 Mac Catalyst target 一併納入,對著 27.1 SDK 建置一次,先讀過 Apple 點名的那兩則診斷訊息,再決定要用 #if !targetEnvironment(macCatalyst) 把新 API 圍起來,還是把 Catalyst 的最低版本提高到 27.0。2
  4. 就拿設定檔裡的數字當作預覽與測試的尺寸:闔上 466 × 678 點、展開 669 × 951 點,內側螢幕原生橫向。這個 beta 的 Previews 項目還替畫布的覆寫選單加上了一個 Display 群組,「for previewing content on a device’s alternative display.」(182598534)25
  5. 在會被再次讀取的地方讀取保留區域:在檢視的 body 裡透過幾何 proxy 讀取,或在每一次幾何變化時讀取,絕不要只在第一次版面配置時讀一次。reservedRegions(kind:options:layoutDirectionBehavior:) 搭配 .includeInactive,在探測 App 的前六到九次計算中什麼也沒回傳,之後的每一次則回傳該螢幕擁有的每一個區域(闔上時是相機與狀態直欄;展開時是摺疊處、內側相機與狀態直欄),所以從第一次計算快取下來的值,在該檢視的整個生命週期裡都會是空陣列。而在相信這些結果之前,請先確認建置標記的是 27.1 SDK:otool -l <app>/<binary> | grep -A4 LC_BUILD_VERSION。713

常見問題

Xcode 27.1 beta 裡有 iPhone Duo 模擬器嗎?

有。這個 beta 會安裝一個 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,在該 beta 下以 xcodebuild -downloadPlatform iOS 下載 iOS 27.1 執行環境,再到 Device Hub 選取 iPhone Duo 裝置,姿態就是那裡的按鈕。27.2 beta 並不包含它;Apple 的 27.2 說明指向 27.1 beta,用來取得「the iOS SDK and simulator support for iPhone Duo.」(iPhone Duo 的 iOS SDK 與模擬器支援)。238(10 月 11 日:Xcode 27.1 RC(27A9275)已於 10 月 5 日推出,其說明列出了相同的 iPhone Duo 模擬器已知問題,因此 beta 不再是唯一一個說明涵蓋 Duo 模擬器的 Xcode 27.1;我沒有安裝 RC。14)(10 月 15 日:Xcode 27.1 以正式版推出,建置 27A9275,與 RC 相同,其說明列出同樣兩則 Duo 模擬器已知問題;我沒有安裝它。15)

有線上的 iPhone Duo 模擬器嗎?

Apple 沒有提供。在 RC 推出之前,這個模擬器只隨 Xcode 27.1 beta 提供,執行的是 Apple 的 iOS 27.1 執行環境;掛著這個名稱的瀏覽器頁面畫的是別的東西。若只想快速檢查版面,beta 的 Previews 畫布提供了供替代螢幕使用的 Display 群組。2(10 月 11 日:Xcode 27.1 RC(27A9275)已於 10 月 5 日推出,其說明列出了相同的 iPhone Duo 模擬器已知問題,因此 beta 不再是唯一一個說明涵蓋 Duo 模擬器的 Xcode 27.1;我沒有安裝 RC。14)(10 月 15 日:Xcode 27.1 以正式版推出,建置 27A9275,與 RC 相同,其說明列出同樣兩則 Duo 模擬器已知問題;我沒有安裝它。15)

如何把 Xcode 27.1 beta 裝在 Xcode 27 旁邊?

用 xip --expand 解開 xip,把解出來的 App 移成帶版本的名稱,例如 /Applications/Xcode-27.1-beta.app,再把 DEVELOPER_DIR 設為它的 Contents/Developer 資料夾,供 xcodebuild、xcrun 與 swiftc 使用。這個 beta 需要 macOS Tahoe 26.6 或更新版本,和 Xcode 27.0 的下限相同。24

iPhone Duo 內側螢幕以點為單位有多大?

669 × 951 點,依據模擬器的裝置設定檔,它把內側螢幕定義為 2007 × 2853 像素、scale 3,原生方向為橫向;外側螢幕則是 1398 × 2034 像素、scale 3,換算為 466 × 678 點。5

Xcode 27.1 beta 會改動 iOS 27.0 SDK 或 Xcode 27 工具鏈嗎?

不會。Swift 編譯器與連結器回報的版本字串和 Xcode 27.0 相同,而這個 beta 的發行說明只有三節,Mac Catalyst、Previews 與 Simulator,沒有一節碰到工具鏈。iOS 27.1 SDK 是新增的東西,在裝置與模擬器兩份 SDK 中都標示為 build 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. 作者於 2026 年 9 月 19 日在 macOS 26.6.2(25G83)上進行的執行環境下載,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」。同一天登入後以 「Simulator Runtime」 搜尋 Apple 的開發者下載頁面,其磁碟映像檔最新僅到 iOS 18.2 Simulator Runtime。 ↩↩↩↩↩↩↩

  4. 作者於 2026 年 9 月 19 日對 /Applications/Xcode-27.1-beta.app 的檢視: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 回報 「signed Apple Software」 並帶有 Software Update 憑證鏈;du -sk 對解開後的 App 回報 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 所得;可用性標註讀自同一批檔案:SwiftUICore 介面中 public struct ArrangementView< 之上的 @available(anyAppleOS 27.1, *),以及 SwiftUI 介面中宣告 func toolbarVerticalBehavior 的 extension SwiftUICore.View 之上的同一行;UIArrangementViewController.h 中 API_AVAILABLE(ios(27.1), tvos(27.1), visionos(27.1)) 後接 API_UNAVAILABLE(watchos),UIView.h 中兩處 reservedRegionsOfKind: 宣告之上亦然,UIVerticalBarEdge 列舉與 verticalBarEdge trait 之上亦然;其 UIVerticalBarEdgeLeading 與 UIVerticalBarEdgeTrailing case 之上則是 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 之上沒有任何標註。首次啟動:在 beta 的 DEVELOPER_DIR 底下第一次執行 xcodebuild -version 超過了兩分鐘的逾時,而 /var/log/install.log 記錄 xcodebuild 於 9 月 19 日 16:01:54 排入一項 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、四個圓角半徑皆 55、colorspace sRGB),另有 external-0(TVOut)、wireless0(carPlay)與 resizable(scene)。兩份 framebufferMaskIdentifier PDF 以 qlmanage 算圖後檢視;Apple 規格表中面板的數字,收錄在 Duo 開發者文章裡。在這個 beta 底下,xcrun simctl list devicetypes 列出 「iPhone Duo (com.apple.CoreSimulator.SimDeviceType.iPhone-Duo)」。 ↩↩↩↩↩↩↩↩↩

  6. 作者於 2026 年 9 月 19 日與 20 日在 macOS 26.6.2(25G83)上的執行紀錄。裝置:simctl create "Duo-27.1" com.apple.CoreSimulator.SimDeviceType.iPhone-Duo com.apple.CoreSimulator.SimRuntime.iOS-27-1,以 simctl boot 與 simctl bootstatus -b 啟動(在這台 Mac 上約一分鐘);simctl io <udid> enumerate 列出兩個顯示類別 0 的 com.apple.framebuffer.display 連接埠,尺寸為 1398 × 2034 與 2007 × 2853,並在 Connected Screens 之下列出 「LCD-1」,裝置名稱 primary-1、螢幕 ID 3、像素尺寸 {2007, 2853}。探測 App:DuoProbe,一支單檔 SwiftUI App,在 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 code 5 失敗,訊息為 「The system shell probably crashed.」;以 simctl shutdown 再 boot 才救回裝置。9 月 20 日的姿態測試分兩輪,兩輪都透過輔助使用 API,對 Device Hub 為所選裝置提供的按鈕發出 AXPress 動作,依序按下 Rotate Right、Closed、Book 與 Open;兩輪也都由 27.2 beta 的 simctl 命令列工具驅動,使用那些指令稿所設定的 DEVELOPER_DIR,對象則是 27.1 beta 的執行環境、裝置類型與 Device Hub。第一輪中,按下下一個按鈕時,上一個姿態的探測 App 仍在執行,之後才終止並重新啟動,主控台擷取十二秒,兩塊螢幕都取截圖;上文的旋轉數值與過渡輸出就來自這一輪。第二輪則在每次擷取後終止探測 App,因此按下一個按鈕時前景沒有任何 App;重新啟動前的截圖來自這一輪。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 的截圖顯示探測 App,--display=primary 則是全黑。Book:重新啟動後是同樣三行;按下之後、重新啟動之前、沒有 App 執行時所取的內側螢幕截圖,顯示的是主畫面。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[ 開頭的行。旋轉後的闔上狀態只在姿態切換過程中以過渡輸出出現過,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(_:):每一頁的平台可用性都寫著 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 日取得:「Set iPhone Duo down and it enters StandBy on either the outer or inner display」 與 「hub for widgets」,引自 StandBy 段落。 ↩

  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 模擬器。探測 App:DuoProbe2,一個 Swift 檔案,內含一個 TabView,其第一個分頁裝著帶有五個工具列項目的 NavigationStack、內文所述的讀數區,以及一個 UIKit 檢視,記錄它的視窗、視窗 scene 的螢幕、UIScreen.main 與 verticalBarEdge trait。以該檔案對著 27.1 模擬器 SDK 建置兩次,並告知連結器要記錄哪個 SDK 版本(-Xlinker -platform_version -Xlinker ios-simulator -Xlinker 27.1 -Xlinker 27.0 與 ... 27.1);otool -l 印出 sdk 27.0 與 sdk 27.1。第三次以 9 月的方式建置,即 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 後,同一道指令標記的是 sdk 27.1。揭露這個差異的真實 App 是 Kiradex(941 Apps),由 Xcode 27.1 beta 建置:minos 27.0、sdk 27.1。主控台輸出,27.1 標記,闔上: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;闔上並旋轉:size=594x350 ... h=compact v=compact verticalEdge=trailing、window=(678.0, 466.0);展開: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,並有 mainScreen=(466.0, 678.0) 與 sceneScreen=(951.0, 669.0) 並列;展開並旋轉: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 標記:闔上時 window=(386.0, 678.0),展開與 Book 時 (871.0, 669.0),展開並旋轉時 (669.0, 871.0),闔上並旋轉時 (678.0, 386.0),每一行都是 verticalEdge=nil、verticalBarEdge=0 與 divisions=0 occlusions=0。PlainProbe 具有同樣的 tab view、導覽堆疊與工具列,但不含任何來自 27.1 SDK 的東西,由 Xcode 27.0(27A266a)對著它自己的 iOS 27.0 SDK 編譯(otool:minos 27.0、sdk 27.0):闔上時 window=(386.0, 678.0),展開時 (871.0, 669.0)。每次以 27.1 啟動時,前六到九次計算都記錄 divisions=0 occlusions=0,之後區域才出現,其中三次發生在檢視還沒有尺寸之前。相機的遮蔽區域與 Apple 的「Outer Closed Portrait」外框 PNG 做了比對,該圖在 3x 下的相機開孔橫向跨 400.3 到 436.3 點、縱向跨 29.7 到 65.7 點;遮蔽區域以視窗座標計,橫向跨 399 到 436、縱向跨 30 到 67,每一邊的誤差都在 1.3 點以內。窗格位置由擷取畫面量得:攤平時主要窗格從 x 8 到 433.7,次要窗格從 433.7 到 859;Book 時主要窗格到 455.7,空白帶到 495.7,次要窗格到 859。探測 App 的 sheet 在展開時量得 653x501、置中,在 Book 時為 459x501、靠前緣。用一個讓探測 App 的 arrangement view 填滿內容區的啟動選項時,旋轉後的螢幕把主要窗格顯示在次要窗格之上,而 .split.axes(.horizontal) 只顯示主要窗格。 ↩↩↩↩↩↩↩↩↩↩↩↩↩↩↩

  14. Apple,Releases,2026 年 10 月 11 日擷取的 RSS 摘要:「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.」Apple,Xcode 27.1 RC Release Notes,2026 年 10 月 11 日擷取,Simulator,Known Issues:「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)」,與 beta 的說明相同。 ↩↩↩↩

  15. Apple,Releases,2026 年 10 月 15 日太平洋時間 17:16(10 月 16 日 00:16 UTC)擷取的 RSS 摘要:日期為 Thu, 15 Oct 2026 13:00:00 PDT 的「Xcode 27.1 (27A9275)」,建置編號與 10 月 11 日擷取時那則 10 月 5 日的 RC 項目相同,而摘要已不再列出該項目。Apple,Xcode 27.1 Release Notes,2026 年 10 月 15 日太平洋時間 17:21 透過文件 JSON 端點擷取,標題由「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.」;兩則 iPhone Duo 模擬器 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.」與「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.」。同一小時擷取的 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 支援,「Apple security releases」,2026 年 10 月 26 日擷取:「iOS 27.1」、「This update has no published CVE entries.」、「iPhone Duo」、「23 Oct 2026」這一列,沒有連結。Apple,Releases,2026 年 10 月 26 日太平洋時間 16:12 擷取的 RSS 摘要:「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 的發行。iOS & iPadOS Release Notes 索引於 10 月 26 日擷取,只列出「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),Xcode 27.1(27A9275)位於 /Applications/Xcode.app: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」;在 com.apple.CoreSimulator.SimRuntime.iOS-27-1 上 xcrun simctl create 一台 com.apple.CoreSimulator.SimDeviceType.iPhone-16-Pro,以「Incompatible device」(SimError 403)失敗;邊距探測 App 及其輸出記載於 iOS 27.2 發行說明那篇文章的註腳 4。 ↩↩

相關文章

為 iPhone Duo 準備您的 App:一個完整的實作範例

為 iPhone Duo 準備並送審 App:決定版面的 SDK 版本標記、一款真實 App 逐一走過每種姿態、兩塊螢幕的截圖,以及 App Store 的規則。

43 分鐘閱讀

iOS 27.2 發行說明:推出了什麼,27.1 又去了哪裡

iOS 27.2(24B119)於 10 月 26 日推出:2 項新功能、5 項修正、7 則已知問題、162 個 CVE,以及只有 iPhone Duo 拿到的 iOS 27.1。寫給開發者的發行說明解讀。

20 分鐘閱讀

像素藝術建築:iPhone 上的房屋、廳堂與室內

從原始碼實測寶可夢、超任 RPG 與《星露谷物語》如何建造房屋、室內與樓層,以及 Kiradex 的城鎮如何在 iPhone 上蓋起真正的建築。

56 分鐘閱讀