Apple Developer 已發布 iPhone Duo 專用技術講座 111461,內容聚焦於多顯示區域與折疊互動;這代表你可以先按官方設計方向改造,而不必等真機才開始。參考 Apple 的 iPhone Duo 技術講座
症狀:現有 App 依賴固定寬高、裝置名稱或單一 safe area,加入折疊狀態後容易出現內容被遮擋、導航錯位,甚至破壞 iPhone 18 Pro 的原有畫面。
最快解法:不要為 iPhone Duo 複製一套獨立介面;先清理固定尺寸、方向判斷與 UIScreen.main 引用,再以 size class、場景邊界和保留區域建立連續自適應佈局。把 iPhone 18 Pro 當作緊湊寬度基線,把 iPhone Duo 用作展開、折疊及多區域狀態的驗證對象。
這篇適合三類人:
- SwiftUI 開發者:需要把固定堆疊改造成可伸縮佈局。
- UIKit 維護團隊:需要處理 trait collection、safe area 和多場景程式。
- 技術負責人:需要把適配工作拆成可驗收的迭代,而不是等真機到手後集中返工。
截至 2026 年 9 月 17 日,Apple 已確認 iPhone Duo 的多顯示與折疊互動方向,並提供相關設計與技術資料;Xcode 27.1 beta 的專屬 API 仍要在實際工具發布後重新核對,不能把未公開行為當成穩定規格。工具鏈要求應以 Apple 的 Xcode 系統要求 為準。本文最後更新於 2026 年 9 月 17 日,資料核實自 Apple Developer 的 iPhone Duo 技術講座、SwiftUI 與 UIKit 文件。
動手前先固定相容基線
改造前不要先改畫面。先為現有版本建立一份可以重跑的基線,否則之後看到 iPhone 18 Pro 畫面變化時,你無法判斷是折疊適配造成,還是原本的回歸問題。
先確認工具鏈與支援範圍
在 CI 和開發機上記錄 Xcode 版本、macOS 版本、iOS SDK,以及專案目前支援的最低 iOS 版本。Xcode 27.1 beta 相關 API 只有在工具實際提供後才進入驗證清單;在此之前,先使用已公開的 SwiftUI 和 UIKit 自適應能力,不要為了追趕傳聞中的 API 改動核心架構。
Apple 的 Xcode 系統要求頁是環境核對的第一來源。若本機無法安裝指定工具鏈,先處理建置環境,再談新裝置行為。把「能否成功建置」與「畫面是否適配」拆成兩個問題,能避免團隊在錯誤環境上反覆猜測。
建立改造前記錄
至少記錄以下內容:
- iPhone 18 Pro 目前的主要頁面截圖、捲動位置和導航路徑。
- 既有支援 iPhone 的直向、橫向行為與鍵盤出現後的版面。
- 登入、付款、相機、分享、深層連結等不應被改變的任務流程。
- 每個頁面在測試工程中的進入條件、預期結果和失敗證據。
完成標準不是「截圖已存檔」,而是另一名開發者可以依同一條導航路徑重現結果。這份基線會成為後續 iPhone 18 Pro 回歸的判斷依據。
第一輪審計:先找出會失效的尺寸假設
現有 iPhone App 怎樣適配 iPhone Duo,關鍵不是先增加裝置判斷,而是找出內容為何只能依賴某個尺寸。建議先以搜尋和程式碼檢查,把問題分成阻斷、風險和整理三個層級。
| 審計項目 | 常見寫法 | 可能造成的問題 | 修改優先級 |
|---|---|---|---|
| 固定寬高 | 固定 frame、硬編碼間距 | 內容在不同顯示區域被截斷或留下空白 | 阻斷 |
| 方向判斷 | 只檢查裝置目前方向 | 展開或場景變化時,方向不等於可用寬度 | 阻斷 |
| 裝置分支 | 依型號名稱複製頁面 | 新狀態需要重複維護,普通 iPhone 容易失去回歸保護 | 阻斷 |
| 主螢幕引用 | UIScreen.main 直接取尺寸 |
多場景或不同視窗邊界下,取得的尺寸未必是內容容器尺寸 | 高風險 |
| 單一 safe area | 假定上下左右永遠對稱 | 折疊或遮擋區域可能讓可用內容區變成非對稱 | 高風險 |
| 只測初始狀態 | 只驗證首次載入 | 狀態轉換後焦點、捲動位置和任務上下文可能遺失 | 高風險 |
這裡的重點是「使用裝置名稱」和「使用可用空間」並不等價。iPhone Duo 的動態尺寸與多個顯示區域會把原本不明顯的假設放大:一個依固定寬度計算的卡片,在普通 iPhone 上可能只是略窄,在跨區域或折疊狀態下則可能直接遮住按鈕。
把 SwiftUI 與 UIKit 改成同一個決策邏輯
SwiftUI 不要以裝置型號決定畫面,而是讀取環境中的 horizontal、vertical size class,再讓 View 透過自適應容器重新排列。可將主從內容、工具列和表單區塊拆成能在緊湊與常規空間之間改變排列方向的元件。
UIKit 則以 traitCollection 和目前場景提供的邊界作為依據。UITraitCollection 的使用方式可參考 Apple 的 UIKit 現代化技術講座,不要再把整個頁面綁定到一個全域螢幕尺寸。
兩套框架應該共享相同的產品決策:
- 空間緊湊時,主內容優先,次要工具收進導覽或底部操作區。
- 空間常規時,主從內容可以並排,但不能假設中間區域必然可用。
- 可用寬度變化時,保留使用者目前的焦點、捲動位置和編輯內容。
- 只有在內容語義真的不同時才拆分呈現,不要把「不同尺寸」誤判成「不同產品流程」。
第二步:不要為 iPhone Duo 建立獨立介面分支
iPhone Duo 是否需要單獨建立一套介面?通常不需要。更穩妥的做法是維護同一套內容模型與任務流程,讓容器根據空間重新組合。獨立分支表面上能快速展示展開畫面,實際上會帶來三項長期成本:
- 同一個資料狀態要在兩套頁面同步,容易出現返回、刷新和錯誤提示不一致。
- 修正 iPhone 18 Pro 的問題時,另一套折疊頁面可能沒有同時更新。
- 測試數量會按分支增加,而不是按狀態合理擴展。
只有在主從關係、輸入方式或任務上下文確實不同時,才考慮拆成兩個呈現容器;資料來源、驗證規則和導航狀態仍應共用。
| 選擇方案 | 適合情況 | iPhone 18 Pro 風險 | iPhone Duo 維護成本 |
|---|---|---|---|
| 同一內容、自適應容器 | 多數資訊頁、列表、表單和工具頁 | 低,能沿用基線回歸 | 低至中 |
| 同一資料、兩種呈現容器 | 主從內容在展開時需要並排 | 中,需保留緊湊狀態測試 | 中 |
| 完全獨立介面 | 任務流程與互動模型本身不同 | 高,容易出現行為分叉 | 高 |
折疊區域遮擋內容應怎樣處理
先分清三種區域,再決定是拆分、避讓還是覆蓋。Apple 的 iPhone Duo 技術資料使用了 division region、occlusion region 和非對稱安全區域等概念;你可以參考 Apple 的自適應佈局技術講座 了解官方示範。
- division region:兩個顯示區域之間的分隔位置。不要把不可自然閱讀的內容硬放在分隔線上;主從內容通常更適合分置兩側。
- occlusion region:內容可能被遮擋或不可見的區域。按鈕、輸入游標、錯誤訊息和拖曳控制項不能只依賴原本的 safe area。
- 非對稱安全區域:左右或上下可用空間不一致。不要用一個統一 inset 強行套用所有方向,應由目前場景的邊界和容器計算內容位置。
進入條件是完成固定尺寸與 UIScreen.main 審計;完成標準則是:在折疊狀態切換後,主要操作仍可觸及,焦點不跳到無關欄位,捲動位置不無故歸零,未送出的表單內容仍然存在。
中段決策:用狀態而不是裝置名稱安排測試
沒有 iPhone Duo 真機能否先做佈局測試?可以先做大量佈局與狀態轉換測試,但不能把模擬器結果當成完整真機證據。模擬器適合驗證容器邊界、排列規則、快照與導航狀態;觸控可達性、相機、姿態轉換和真實多任務流程仍要留到真機驗收。
| 測試層級 | 先驗證的內容 | 不應直接下的結論 |
|---|---|---|
| SwiftUI 預覽與單元測試 | size class、內容排列、狀態保留 | 真實觸控距離一定合適 |
| 模擬器佈局測試 | 外屏、內屏、展開、折疊及邊界變化 | 相機、姿態和實際鉸鏈感受已通過 |
| UI 快照與導航測試 | 截圖差異、返回路徑、深層連結 | 真機效能和多任務流程沒有問題 |
| 真機驗收 | 觸控、相機、姿態、效能和多任務 | 可以省略普通 iPhone 回歸 |
iPhone 18 Pro 怎樣避免被折疊適配影響
把 iPhone 18 Pro 固定為每次合併都要通過的緊湊寬度基線,而不是只在最後一輪測試。每次修改自適應容器後,都重新檢查:
- 首屏主要操作是否仍在原本可理解的位置。
- 導航列、工具列和鍵盤出現後是否發生截斷。
- 文字變長、錯誤訊息出現時是否把按鈕推出畫面。
- 返回、旋轉和深層連結是否維持原有任務路徑。
這也是避免適配折疊屏後影響普通 iPhone 的最有效方法:普通 iPhone 不是次要相容項目,而是緊湊空間的持續回歸基線。
第一週:把回歸測試拆進 CI
完成第一輪佈局改造後,才進入自動化。不要等所有頁面都改完才建立流水線,否則錯誤會集中在一個難以定位的巨大變更中。
| CI 任務 | 觸發時機 | 驗收內容 | 失敗處理 |
|---|---|---|---|
| 建置與單元測試 | 每次提交 | 編譯、模型、格式和狀態邏輯 | 阻止合併 |
| SwiftUI / UIKit 快照 | 佈局相關變更 | 緊湊與常規空間的畫面差異 | 要求附差異說明 |
| UI 導航測試 | 每次候選建置 | 登入、返回、深層連結和表單流程 | 標記發布阻斷 |
| 折疊狀態模擬 | 每日或候選版本 | 展開、折疊、分隔與遮擋區域 | 交由適配負責人分級 |
| iPhone 18 Pro 回歸 | 每次候選版本 | 既有關鍵頁面與任務路徑 | 未通過不得發布 |
模擬狀態應覆蓋外屏、內屏、展開、折疊、橫向與 Split View;這些是測試維度,不代表 Apple 已公開每一種實體形態的所有細節。對未公開的專屬 API,先以官方文件和實際 Xcode 版本驗證,不能用媒體傳聞補足規格。
你可以把完整矩陣拆成平行任務,讓開發者電腦只處理快速反饋,把快照、UI 測試和發布建置交由專用 Mac 建置環境。若要先盤點雲端開發和建置工作,可從 kvmsync 的開發環境文章索引整理現有流程;重點是先定義每個任務的輸入、輸出與可追溯記錄,而不是單純增加執行器數量。
上線前:用真機完成邊界驗收
模擬器通過後,進入真機驗收。這一階段的目標不是再找所有視覺差異,而是驗證模擬器無法可靠證明的使用條件:
- 手指是否能觸及靠近分隔或邊緣的操作。
- 相機預覽、權限提示和回到 App 後的狀態是否正常。
- 姿態切換時,焦點、捲動位置和輸入內容是否保留。
- 多任務返回後,頁面是否回到正確的任務上下文。
- 長時間操作時,動畫、列表和輸入反應是否符合可接受的效能要求。
- iPhone 18 Pro 的緊湊佈局是否仍然通過原有發布案例。
最後把問題分成三類:
發布阻斷項
內容被遮擋、主要按鈕不可觸及、資料遺失、返回路徑中斷、崩潰,或 iPhone 18 Pro 的既有流程失敗。
可延期的體驗優化
間距不夠理想、次要工具列未充分利用展開空間,但不影響主要任務完成。這些問題應建立後續工單,不要混入發布阻斷清單。
上線後監控項
不同場景下的導航失敗、深層連結落點、表單中斷和效能異常。這些要有可識別的事件與版本標記,否則上線後只能依使用者描述猜測。
維護週期:把適配當成持續規則
iPhone Duo 折疊佈局適配不是一次性頁面重做。每次新增卡片、工具列或輸入元件時,都要回答三個問題:它在緊湊空間如何排列?它是否能避開 division 或 occlusion region?它在場景變化後是否保留任務狀態?
SwiftUI 團隊可持續檢查 size class 與容器行為,並參考 Apple 的 UserInterfaceSizeClass 文件;UIKit 團隊則應檢查 traitCollection 是否由目前場景驅動,而非從全域螢幕尺寸推導。涉及 trait 變更時,也可對照 Apple 的 UITraitCollection 文件。
如果你目前只在本機跑完整回歸,現有方案的缺點通常是建置工作會和開發搶同一台 Mac、長時間測試容易被中斷,而且多組 iOS 27 候選版本難以平行執行。短期適配專案採用可調整的 Mac 建置資源,能把折疊狀態快照、iPhone 18 Pro 回歸與發布建置分開;但若你的團隊需要長期固定的重負載,或必須直接操作實體相機、特殊周邊和本地介面,自購設備仍可能更合適。
若你要在適配週期內並行跑多組 iOS 27 建置,可先查看 kvmsync 的 Mac 建置資源方案,按實際測試週期安排臨時或持續資源。這樣的選擇不是把所有工作搬到雲端,而是把最容易佔滿開發機的回歸與候選建置拆出去,讓你能在不犧牲 iPhone 18 Pro 相容性的前提下,逐步完成 iPhone Duo 折疊佈局適配。
延伸閱讀
kvmsync M4 遠端節點
為折疊佈局驗收準備專屬真機環境
使用 kvmsync 獨佔真機節點,透過 SSH 或瀏覽器 VNC 建立穩定的遠端測試環境。