← 所有文章

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 自己的說明列出模擬器目前還做不到的三件事;而我讓一支探測 App 走過 Device Hub 的三種姿態後,闔上時落在 466 × 678 點的螢幕上,展開時落在 951 × 669 點的螢幕上,後者兩個 size class 都是 regular,任何姿態都沒有回報保留區域,而且 App 明明跑在內側螢幕上,UIScreen.main 仍然回答外側螢幕的數值。12456 {.answer-block}

重點摘要

  • 日期與 build 編號。 Apple 的發佈摘要把 Xcode 27.1 beta(27A9269)繫在 9 月 18 日(週五)。xcodebuild -version 印出 Xcode 27.1Build 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
  • Duo 的 API 都在 SDK 裡了。 我在 9 月 17 日檢查時,有十個名稱在 27.0 SDK 裡遍尋不著,它們在 27.1 SDK 裡全都在,其中包括 SwiftUICore 的 ArrangementViewreservedRegions(kind:options:layoutDirectionBehavior:)、SwiftUI 的 toolbarVerticalBehavior(_:),以及 UIKit 的 UIArrangementViewControllerpreferredVerticalBarBehaviorverticalBarEdge。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 的表現。 Device Hub 提供三種姿態,Closed(闔上)、Book(書本狀)與 Open(展開),外加 Rotate Right(向右旋轉)。闔上時,探測 App 拿到外側螢幕:466 × 678 點、寬度 compact,分割式 arrangement 上下堆疊。展開時,它拿到內側螢幕:以橫向為原生方向的 951 × 669 點,兩個 size class 都是 regular,左右各有 34 的安全區域邊距,分割式 arrangement 左右並排;旋轉後為寬 669、高 951,兩個方向依然都是 regular。Book 給 App 的幾何數值與 Open 完全相同。每一種姿態下 reservedRegions 都回傳空的結果,連把非作用中的區域一起納入也一樣;toolbarVerticalEdge 始終是 nil,工具列橫向繪製,而 App 在內側螢幕上時,UIScreen.main.bounds 仍持續回報 466 × 678。6
  • 這個 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

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.pkgXcodeSystemResources.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

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,以及對應 preferredVerticalBarBehaviorUIVerticalBarBehavior4

搜尋的子字串 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.V68minRuntimeVersion 27.1,以及一條規則,讓 27.1 起的執行環境預設建立這個裝置。capabilities.plist 交代硬體:型號 A3447、HomeButtonType 2、DeviceSupportsDynamicIsland true、DeviceSupportsEnhancedMultitasking false、IsLargeFormatPhone true、CompatibleDeviceFallbackiPhone18,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 我裝上了一支單檔的 SwiftUI 探測 App,它會讀取幾何數值、size class、toolbarVerticalEdge 環境值,以及用 includeInactive 取得的兩種保留區域,並以三種樣式各包一層 ArrangementView,再在導覽工具列裡放進六個項目。6

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

探測 App 在外側螢幕、Closed 姿態下:466 × 678 點,寬度 compact,分割式 arrangement 上下堆疊,工具列橫向。

闔上時,探測 App 回報的和一支 compact iPhone 沒兩樣。UIScreen.main.bounds 是 466 × 678 點、scale 3,size class 為寬度 compact、高度 regular,toolbarVerticalEdge 是 nil,UIKit 的 verticalBarEdge trait 讀出來是原始值 0,兩種保留區域查詢都回傳空陣列,連非作用中的區域一起納入也一樣,可見闔上的姿態並未把摺疊處或相機暴露給 App。導覽堆疊裡的 GeometryReader 量到 386 × 510 點,安全區域邊距為上方 134、下方 34,左右皆無;依我的判讀,系統留下的那 80 點寬度,就是右側擺放狀態元件的那條直欄。分割式 arrangement 把主要檢視放在次要檢視之上,也就是 Apple 指南描述的「高大於寬」情境;工具列則橫向繪製於頂端:分享與打勾的「完成」按鈕緊鄰溢位按鈕,四個次要動作沒有出現在列上,從它們的 placement 判斷,應該收進了該按鈕的選單裡。67

姿態就住在 Device Hub 裡。選取 Duo 裝置後,它的視窗會把 Rotate Right、Closed、Book 與 Open 顯示為按鈕,而這些按鈕可以用輔助使用 API 按下,本節其餘的操作就是這麼驅動的。6

Open 會把 App 移到內側螢幕,並維持其原生橫向。探測 App 回報寬度與高度都是 regular,GeometryReader 量到 803 × 515 點,安全區域邊距為上方 134、左右各 34、下方 20,而寬度上少掉的仍是和闔上時同樣的 80 點;依我的判讀又是那條直欄,如今位於一塊寬 951 點的螢幕右側,狀態元件就在裡面。分割式 arrangement 把主要與次要檢視左右並排,也就是 Apple 指南裡「寬大於高」的情境;工具列橫向繪製於右上角,一樣是分享與「完成」緊鄰溢位按鈕,四個次要動作同樣不在列上。6

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

Open 姿態、內側螢幕,2853 × 2007 像素:兩個維度都是 regular,分割式 arrangement 左右並排,直欄在右側。

Rotate Right 會把內側螢幕轉成直向。探測 App 這時量到 669 × 703 點,兩個維度都是 regular,邊距為上方 134、下方 34,左右皆無;依我的判讀,那條 80 點寬的直欄移到了上緣,狀態元件如今坐落在一條黑色橫帶裡,而分割式 arrangement 即使容器已經高於寬,仍維持左右並排。6

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

旋轉後的內側螢幕:寬 669 點,兩個方向仍是 regular,直欄移到了上緣。

Book 是半摺的姿態,本該是保留區域 API 大顯身手之處,但在這個 beta 上,它對我的探測 App 並未如此。前景沒有任何 App 時,按下 Book 之後內側螢幕顯示的是主畫面;重新啟動後,探測 App 回報的和 Open 時一模一樣:803 × 515 點、兩個維度都是 regular,divisions 與 occlusions 都是零,連非作用中的區域一起納入也一樣,SwiftUI 與 UIKit 皆然。闔上的姿態同樣回報零。我沒有找到任何一種姿態會讓 reservedRegions 回傳摺疊處或相機,所以隨摺疊處調整的版面配置,是這個 beta 的模擬器沒能讓我看見的東西;Apple 的指南把 division 描述為 「when iPhone Duo is partially open」(iPhone Duo 半開時)才作用,至於這究竟是 beta 的缺口,還是我探測 App 的缺口,只能留給下一個 beta 回答。67

還有兩件事在每一種姿態下都成立。工具列從來沒有直向繪製過:toolbarVerticalEdge 在 SwiftUI 裡是 nil,verticalBarEdge 在 UIKit 裡讀作原始值 0,闔上、展開、旋轉皆然,可見 Apple 指南描述的垂直列,在這個 beta 裡並未出現在導覽堆疊的工具列上。另外,App 明明跑在內側螢幕,UIScreen.main.bounds 卻回答 466 × 678 點,也就是外側螢幕,這正是 Apple 指南提醒的陷阱,它要開發者把版面計算建立在 「based on your scene or containing view’s bounds rather than screen dimensions」(依據您的 scene 或容器檢視的 bounds,而非螢幕尺寸):主螢幕並不是您所在的那塊螢幕。探測 App 編譯時,編譯器早就說了 'main' was deprecated in iOS 26.0,而這台裝置正是原因所在。67

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

這個 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 只能拿實機來確認。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. 開發期間,請逐一姿態記錄保留區域:文件寫明 reservedRegions(kind:options:layoutDirectionBehavior:) 搭配 .includeInactive 會以 ReservedRegion 值回傳摺疊處與相機,而這些值可能是作用中或非作用中;在這個 beta 裡每種姿態都回傳零,所以在 onChange(of: proxy.size) 裡寫一行 log,就能告訴您某個姿態是從哪一刻開始回報它們的。67

常見問題

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

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

xip --expand 解開 xip,把解出來的 App 移成帶版本的名稱,例如 /Applications/Xcode-27.1-beta.app,再把 DEVELOPER_DIR 設為它的 Contents/Developer 資料夾,供 xcodebuildxcrunswiftc 使用。這個 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

資料來源


  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.1Build version 27A9269xcrun --sdk iphoneos --show-sdk-versionxcrun --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.swiftinterfaceSwiftUI.swiftmodule/arm64e-apple-ios.swiftinterfaceUIKit.swiftmodule/arm64e-apple-ios.swiftinterfacegrep -c 搜尋子字串所得,檔案數則是對 UIKit.framework/Headersgrep -rl 所得;可用性標註讀自同一批檔案:SwiftUICore 介面中 public struct ArrangementView< 之上的 @available(anyAppleOS 27.1, *),以及 SwiftUI 介面中宣告 func toolbarVerticalBehaviorextension SwiftUICore.View 之上的同一行;UIArrangementViewController.hAPI_AVAILABLE(ios(27.1), tvos(27.1), visionos(27.1)) 後接 API_UNAVAILABLE(watchos)UIView.h 中兩處 reservedRegionsOfKind: 宣告之上亦然,UIVerticalBarEdge 列舉與 verticalBarEdge trait 之上亦然;其 UIVerticalBarEdgeLeadingUIVerticalBarEdgeTrailing 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.pkgXcodeSystemResources.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.plistmodelIdentifier iPhone19,4、productClass V68、aliases com.apple.CoreSimulator.SimDeviceType.V68、minRuntimeVersion 27.1、createByDefaultForRuntimeVersions versionMin 27.1。capabilities.plistModelNumber 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;displaysprimary(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 bootsimctl 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.1DUOPROBE 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 launchFBSOpenApplicationServiceErrorDomain code 5 失敗,訊息為 「The system shell probably crashed.」;以 simctl shutdownboot 才救回裝置。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),並未計入上文。 

  7. Apple,2026 年 9 月 19 日取得的文件 JSON:ArrangementViewUIArrangementViewControllerreservedRegions(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,引用。 

  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」。 

  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 段落。 

相關文章

arm64e.x1:Apple 的檢查式指標運算切片

iOS 27 RC 發行說明新增 arm64e.x1:在 A20 Pro、M6 與 S11 上啟用的檢查式指標運算(CPA2)。clang 會產生什麼指令、Xcode 的四個開關,以及支援的硬體清單。

12 分鐘閱讀

iOS 27.0 發行說明:棄用項目、破壞性變更與修正

iOS 27.0(24A437)已於 9 月 14 日推出。從開發者角度解讀發行說明:11 項棄用、改用 27 SDK 建置後會生效的變更,以及一項我親自驗證的修正。

20 分鐘閱讀

為 iPhone Duo 做設計:什麼會移動、什麼會分割、什麼保持不動

把 Apple 的 iPhone Duo 設計指南與三場 Tech Talk 當成規則來讀:以兩個尺寸類別取代逐一適配的姿勢、摺痕處的位移、arrangement,以及側邊列。

16 分鐘閱讀