2026 年 8 月,本站還有一篇摺疊 iPhone 什麼時候釋出,當時名稱和日期都沒落地。9 月 9 日 Apple 在新聞稿裡把產品定名為 iPhone Duo:外屏 5.4 英寸,展開後內屏 7.6 英寸,兩塊屏同一長寬比,晶片是 A20 Pro。美國起售價 1999 美元(256GB),容量還有 512GB、1TB 和 2TB。預購從 10 月 16 日太平洋時間凌晨 5 點開始,包括中國在內的 70 多個國家和地區 10 月 23 日開賣,另有 28 個地區 10 月 30 日。今天是 10 月 13 日,預購還有三天。這篇不再猜釋出日,只回答排期問題:SwiftUI 要改多少、Xcode 要測哪些姿態、Mac 是買還是租。
為什麼不能按真機標價估適配成本
舊演算法和新演算法衝突得很具體。舊演算法是「買一臺摺疊屏,再加兩週人日」。真機標價 1999 美元看起來像預算上限,其實它是驗收資產,不是工程量。新演算法先看程式碼還在不在讀螢幕。Apple 的準備頁寫得很直:用 iOS 27 SDK 及之後構建的 App 會在 Duo 上隨摺疊改變尺寸;寫死的螢幕尺寸、固定方向和裝置假設會把佈局拉變形、裁切或放錯位置。
同一份二進位制在三檔 SDK 上長得不一樣,這是成本的第一刀,不是設計偏好。Apple 準備頁的對照是:iOS 26 SDK 或更早能跑,但展開後視窗居中、四周留白,合蓋後內容偏在狀態列和相機左側;iOS 27 SDK 會鋪滿內屏的大部分,仍避開右側狀態列;iOS 27.1 SDK 及之後才是最佳化態,內容用滿顯示區域,工具欄和標籤欄豎在狀態列下方。只換商店截圖、仍用舊 SDK 交差的團隊,使用者開啟內屏看到的是一塊留白,不是「我們支援摺疊屏」。
第二刀是測試矩陣變了。外屏的 size class 和其他 iPhone 一樣:豎持是垂直 regular、水平 compact,橫持兩邊都是 compact。內屏有足夠空間放側欄,水平和垂直都是 regular。更關鍵的是,內屏不遵守你在 Info 裡宣告的支援方向。用 UIDevice.current.orientation、statusBarOrientation 或 interfaceOrientation 決定佈局,會在開合和分屏時直接走錯分支。Apple 的原話是去比你實際拿到的寬高,UIKit 用 view.bounds,SwiftUI 用 GeometryReader 的尺寸。
第三刀才是機器。Xcode 27.1 裡的 iPhone Duo 模擬器、Device Hub 的開合旋轉,以及 macOS 27 上的 iPhone Mirroring 拉伸,都綁在 Mac 上。Windows 上沒有這條鏈路。團隊打包機怎麼選,見 Xcode Cloud 與遠端 Mac 對比。Xcode Cloud 能編包,替代不了你坐在 Device Hub 前把合蓋、半折、展開各轉一次。
UIScreen.main。模型在系統裡,尺寸在當前視窗裡。
適配工作怎麼分類
把「支援摺疊屏」寫成一個里程碑,排期一定漂。按錢真正花出去的位置分成三層。缺一層,報價就會把人日和裝置費攪在一起。
| 工具 | 入口 | 執行能力 | 上下文 | 適合人群 |
|---|---|---|---|---|
| SwiftUI / UIKit 改造 | 倉庫裡的佈局程式碼 | 去掉螢幕單例、方向分支、固定寬高;系統欄交給導航容器 | size class、安全區、摺痕與相機的預留區 | 要在 10 月 23 日前後上架或更新的 App |
| Xcode 27.1 姿態測試 | Device Hub 的 iPhone Duo 模擬器 | 合蓋、半折、展開,各加一次旋轉;可再加 macOS 27 的視窗拉伸 | 三檔 SDK 的留白、避讓、全屏垂直欄 | 需要一張可迴歸的驗收表,而不是演示影片 |
| Mac 節點 | 本機、買斷或遠端租用 | 安裝對應 macOS 上的 Xcode,跑模擬器和簽名 | DerivedData、模擬器執行時、證書 | 自己的 Apple Silicon 不夠,或不能和日常機搶磁碟 |
改造層裡,SwiftUI 不是自動免單。Human Interface Guidelines 寫的是:如果已經用標準系統元件,並且支援尺寸變化,姿態會自己跟上,不需要為每個姿勢重做一套介面。外屏用 compact 寬、內屏用 regular 寬,就是全部姿勢的底。反過來,固定寬度、按機型高度分支、自己畫的工具欄,系統不會替你改。準備頁點名要搜的東西包括 UIScreen.main、userInterfaceIdiom == .phone 或 .pad、把 regular 寬當成「這是 iPad」、以及 bounds.height == 844 這種已知機型表。
還有一個很容易漏掉的測量。公開的 Xcode 27.1 模擬器探針把外屏記成 466×678 pt、內屏記成 669×951 pt(都是 @3x),並看到 App 已經在內屏上時,UIScreen.main.bounds 仍回報外屏的 466×678。這組點尺寸用來解釋官方禁令,不是讓你再寫一組 == 466。半折時中縫的預留區會變成有效遮擋,探針把它記成大約 40 pt;驗收時以你本機 ReservedRegion 讀到的矩形為準,不要把部落格裡的數字寫進常量。
系統欄不要自己用 UIToolbar、UINavigationBar 或 UITabBar 貼在檢視上。SwiftUI 把 toolbar 加在 NavigationStack 或 NavigationSplitView 上,UIKit 把 toolbar item 交給導航控制器裡的檢視控制器。27.1 把這些欄豎過來之後,自定義欄仍會橫在內容上。摺痕和相機用預留區描述:SwiftUI 從 GeometryProxy 取 ReservedRegion,需要左右分欄或疊層時用 ArrangementView 的 split 和 overlay,而不是再做一套只在「展開」為真時出現的第二棵檢視樹。
import SwiftUI
struct DuoRoot: View {
@Environment(\.horizontalSizeClass) private var width
var body: some View {
NavigationSplitView {
Sidebar()
} detail: {
Detail()
.onGeometryChange(for: CGSize.self) { proxy in
proxy.size
} action: { size in
// Fold changes size mid-session. Do not cache UIScreen.main.bounds.
relayout(size, regularWidth: width == .regular)
}
}
.toolbar {
ToolbarItem(placement: .primaryAction) {
Button("Save", action: save)
}
}
}
}
這段不是完整工程。它只固定三件事:分欄交給 NavigationSplitView,內屏 regular 寬時側欄可以出來,外屏 compact 時收回去;尺寸用 onGeometryChange 在摺疊中途重讀;儲存按鈕走系統 toolbar,好讓 27.1 把它豎到狀態列下方。全幅圖如果用 .fill,寬了之後主體會被裁掉,要用當前 size class 或長寬比在 fill 和 fit 之間換,或設焦點。
核心對比:工期、測試和 Mac 費用
真正差異在於程式碼是否還假設「手機只有一塊屏」,而不是設計師願不願意做摺疊動效。下面兩張表用同一套列。工期是排期估算,不是外包報價;頁面數量和自定義繪製會把週數拉開。Mac 價格是本站定價頁上的美元標價,買斷參考的是另一臺機器,不能併成一個盈虧平衡點而不加說明。
| 工具 | 入口 | 執行能力 | 上下文 | 適合人群 |
|---|---|---|---|---|
| 已自適應的 SwiftUI | size class、系統導航、沒有 UIScreen.main | 查垂直欄、摺痕預留區、全幅圖焦點 | 3–7 個工作日可收口 | 已經為 iPad 分屏做過的小 App |
| 混合 SwiftUI / UIKit | 仍有固定 frame 和自定義欄 | 換掉螢幕尺寸、方向判斷,欄交回容器 | 2–4 周,外加視窗拉伸 | 主體是 SwiftUI、邊角是舊 UIKit 的產品 |
| 固定尺寸的 UIKit | 按 393、844 或機型列表分支 | 容器重建、不對稱安全區、去掉 idiom 判斷 | 4–8 周的頁面清單 | 多年只對一塊 iPhone 屏畫過的商城或工具 |
| 工具 | 入口 | 執行能力 | 上下文 | 適合人群 |
|---|---|---|---|---|
| 手裡已有 Apple Silicon Mac | 本機 Xcode | 模擬器全姿態;有真機時 USB | 增量裝置費為 0,但和日常 DerivedData 搶磁碟 | 一輪適配、機器已經能裝目標 Xcode |
| 日租 M4 16GB | 遠端桌面 | 一輪 Device Hub | 20.2 美元/天。五個工作日是 101 美元 | 自適應檔,而且週五前真能收口 |
| 周租 M4 16GB | 遠端桌面 | 一個自然周的迴歸 | 54.5 美元/周。兩週是 109 美元 | 不確定會不會拖過週五 |
| 月租 M4 16GB / 24GB | 遠端桌面 | 整個改造週期的迴歸機;24GB 能同時開更多模擬器 | 100.9 或 200.9 美元/月 | 混合檔或固定尺寸檔,工期以周計 |
| 買 M6 Mac mini | 本地固定資產 | 適配之後繼續做日常 Xcode 和 CI | 美國起售 899 美元,教育 799。2026-08-25 釋出,09-22 起供貨 | 多人共享、發版不會在 Duo 之後停 |
把日租乘開,結論會反直覺。16GB 的 20.2×5 = 101.0,已經等於月租 100.9。20.2×7 = 141.4,高於周租 54.5,也高於月租。周租 54.5×2 = 109.0,仍略高於一個月。24GB 同樣:40.2×5 = 201.0,對上月租 200.9。所以「先按天試試」只在你確信一到兩天能收口時成立。只要技能掃描在第二天就露出一串 UIScreen.main,計費週期就該改成月,而不是把日租付到第八天。
月租 100.9×9 = 908.1,數字上接近 M6 Mac mini 的美國起售價 899 美元。這兩臺不是同一臺機器:租的是 M4 16GB 雲節點,買的是 M6 起售配置,還不包含顯示器、鍵鼠和稅費。九個月不能寫成盈虧平衡。買斷划算的條件是適配結束之後這臺 Mac 仍然每天編譯,而不是「Duo 測完就閒置」。買還是租的更長討論在 科研場景的買還是租,開發機的負載見 M6 Mac mini 是否適合開發者。
人日不要在這篇裡折成美元。各地報價差一個數量級,寫一個「改造 8000 到 25000 美元」只會把決策變成跟風。能寫進表的是:Mac 這一行在一個四周的混合檔裡,月租是 100.9 美元;如果有人按工作日買了 20 天日租,同一行變成 404 美元。工程時間仍是大頭,機器是小頭。不要為了省 100 美元去買一臺 1999 美元的手機當編譯機,也不要為一輪五天的審計去買一臺 899 美元的 Mac mini。
場景怎麼選
| 如果你是 | 就選 | 理由 |
|---|---|---|
| 純 SwiftUI,已經支援 iPad 分屏 | 本機或日租,先跑技能掃描 | 底已經在。剩下的是垂直欄、預留區和全幅圖 |
| 第二天掃描出一串 UIScreen.main | 立刻改月租,不要把日租付完一週 | 五個工作日的日租已經等於一個月 |
| UIKit 商城,大量固定寬 | 月租 24GB,按 4–8 周排頁面清單 | 同時開 Duo 和其他機型時,16GB 先被模擬器吃掉 |
| 只想更新 App Store 截圖 | 先過 27.1 SDK,再換圖 | 舊 SDK 的內屏是留白,截圖再好看也是另一款裝置 |
| CI 已經在 Xcode Cloud | Cloud 繼續編包,姿態迴歸放遠端 Mac | 互動式 Device Hub 不在雲構建的日誌裡 |
| 辦公室沒有 Mac | 租一臺,先看 sw_vers 和 xcodebuild -version | 系統版本對不上時,日付出去也不產生有效測試 |
| 適配之後還要長期發版 | 再比較買 M6,而不是在第一週買 | 899 美元買的是後續利用率,不是這一輪姿態 |
真機預算單獨放一行。1999 美元是美國 256GB 起售價;MacRumors 在 9 月 28 日列出的更高容量美國標價是 512GB 2199、1TB 2599、2TB 3199 美元,下單仍以蘋果商店頁面為準,中國售價不要用美國數字代替。一臺真機夠看鉸鏈手感和模擬器筆記裡做不到的項。每人一臺 Duo 不會讓 UIScreen.main 消失。
推薦組合
A — 獨立開發者,App 已經自適應: Xcode 27.1,本機或一天遠端節點。先跑準備頁裡的那句「get my app ready for iPhone Duo」。技能掃 UIScreen.main、方向和 idiom。掃完是空的,再進 Device Hub 做合蓋、半折、展開。商店截圖用 App Store Connect 的預覽看 Duo。不必為這一輪買 M6。
B — 小團隊,混合程式碼: 第一週只做掃描和螢幕單例,用周租或直接月租,不要日租滾到第七天。第二、三週交回系統欄,補預留區。第四周把姿態矩陣寫進迴歸:每個主路徑在三種姿勢下截一張。CI 仍走現有打包機;需要人盯著開合的那次,用同一臺遠端 Mac,會話結束清 DerivedData,避免本機快取冒充透過。24GB 月租 200.9 美元,只在你要並行 Duo 和其他模擬器時才上。
C — 要在 Duo 開賣當週提交: 今天是 10 月 13 日,預購 16 日,開賣 23 日。能承諾的是 27.1 SDK 下主路徑不留白、豎欄不擋主按鈕、全幅圖焦點還在。做不到的摺疊動效不要寫進商店文案。節點月費見 Mac mini 定價,開通見 租用頁。系統版本和賬號問題走 幫助中心,不要假設租用映象已經預裝 Xcode 27.1。
常見誤區
- 用 iOS 26 SDK 交差: App 能啟動,內屏四周是空的。使用者不會把留白理解成「適配中」。
- 修完外屏就用 UIScreen.main: 展開之後主螢幕單例仍可能報外屏尺寸。佈局會按 466 pt 寬去排一塊 951 pt 寬的區域。
- 用方向判斷橫豎: 內屏不遵守支援方向。橫豎要拿當前視窗的寬高比。
- 把 regular 寬當成 iPad 專屬: Duo 內屏會把你藏起來的 iPad 佈局直接放出來,包括不該在手機上出現的側欄密度。
- 日租付滿一週: 16GB 五個工作日已經等於月租。第八天是在為計費週期付錢,不是在為測試付錢。
- 把 1999 美元寫進每張工單,或完全不留真機: 真機是鉸鏈驗收的一行,不是改造工時的單價。模擬器仍是 Apple 寫的佈局主路徑。
落地步驟:7 步
- 用同一套原始碼分別對上你能裝的 SDK,先記錄是留白、避讓右側狀態列,還是全屏垂直欄。目標鎖定 27.1。
- 全域性搜尋
UIScreen.main、UIDevice.current.orientation、statusBarOrientation、interfaceOrientation、userInterfaceIdiom,以及 844、852、932 這類高度常量。 - 在 Xcode 裡讓編碼助手跑 App Resizability,或在終端執行
xcrun agent skills export交給別的代理。技能找得到大部分,找不到的用上面的清單補。 - 開啟 Device Hub 的 iPhone Duo,合蓋、半折、展開各轉一次。主路徑每格留一張圖。
- 看工具欄是否豎在狀態列下方,摺痕和相機的預留區有沒有壓住按鈕,全幅圖的主體還在不在。
- 按 Duo 的截圖規格換 App Store 資源,用 Connect 的預覽看,不要用 iPhone 18 的畫布硬縮放。
- 選 Mac 的計費週期:一到兩天用日租;掃描已經變髒就改月租;適配後這臺機器還要每天編譯,再拿 899 美元的 M6 起售價和後續月租比。下單前在節點上跑
sw_vers和xcodebuild -version。
FAQ
舊 App 不改程式碼,能在 iPhone Duo 上開啟嗎?
能開啟。用 iOS 26 SDK 或更早構建時,展開後視窗居中留白,合蓋後內容偏在狀態列和相機左側。能跑不等於適配完成。要鋪滿並使用垂直欄,需要 iOS 27.1 SDK。
必須升到 iOS 27.1 SDK 嗎?
要鋪滿內屏,並且讓工具欄和標籤欄豎到狀態列下方,需要 27.1。上架前確認內容適應這些豎欄。只換截圖、二進位制仍是舊 SDK,內屏看起來仍是留白。
只有模擬器,夠不夠驗收?
佈局主路徑夠。Apple 把 Xcode 27.1 裡的 iPhone Duo 模擬器寫成完整體驗的最佳測試方式,Device Hub 底部可以開、合、旋轉、摺疊。鉸鏈手感仍要真機。1999 美元是這一行的資產,不要攤進每一張 SwiftUI 工單。
沒有 Mac,能做這次適配嗎?
不能在 Windows 上跑 Xcode 27.1。M4 16GB 日租 20.2 美元,五個工作日等於月租 100.9 美元。先確認節點 macOS 能裝你鎖定的 Xcode。系統要求以 Apple 的 Xcode 系統要求為準;iPhone Mirroring 的拉伸測試,準備頁寫的是 macOS 27。
SwiftUI 會不會自動適配摺疊?
系統導航、size class 和標準元件會跟著姿態變。固定 frame、自定義欄、方向判斷和 UIScreen.main 不會。內屏是 regular 寬,過去只在 iPad 出現的佈局會在這臺手機上出現。
總結
iPhone Duo 10 月 23 日開賣,適配成本不是 1999 美元那一行。先看 SDK 檔位和 UIScreen.main,再排三姿態測試,最後用「五個日租等於一個月」決定 Mac 的計費週期。 自適應的小 App 用本機或短租;混合和固定尺寸的程式碼用月租把迴歸留住;買 M6 只在發版不會停的時候比較。遠端節點從 租用頁 和 定價頁 檢視,賬戶和系統版本走 幫助中心。