開發測試iPhone Duo

iPhone Duo 模擬器:獲取、摺疊、測試你的 App

如何獲取 Apple 的 iPhone Duo 模擬器、把它折到任意姿態或轉軸角度、測試你的 App,以及沒有 Mac 也能試用的模擬器。

2026年9月28日 · 更新於 2026年10月6日閱讀約 8 分鐘18 個來源

在 iPhone Duo 於 10 月 23 日上市之前,對幾乎所有人來說,模擬器就是裝置。本文介紹如何獲取 Apple 的 iPhone Duo 模擬器、如何摺疊它,以及要讓 App 過一遍的測試流程。佈局規則見設計、豎向欄和摺痕指南。

要點

  • Apple 的 iPhone Duo 模擬器隨 Xcode 27.1(目前是發布候選版)提供,需要一臺執行 macOS Tahoe 26.6 或更高版本的 Apple 晶片 Mac。還要下載 iOS 27.1 模擬器執行時,然後在 Device Hub 中選擇 iPhone Duo。
  • 沒有 Mac,或者只是想看看它怎麼摺疊?其他模擬器會串流 Apple 的模擬器,或者自己繪製一臺。
  • 用 iOS 27.1 SDK 建置,並檢查二進位制檔案確實連結了它。
  • 把每個頁面都走一遍:合上、展開、旋轉、半折,以及做事做到一半時摺疊。
  • 把 App 拖到分割畫面的兩側各試一次。
  • 分別測量每一條安全區域邊緣。它們各不相同,而且會在欄移動時變化。
  • 看到東西出問題時,先判斷是你的 bug 還是 Xcode 的 bug,再決定要不要寫程式碼繞過去。

獲取 iPhone Duo 模擬器

模擬器是 Xcode 27.1 的一部分。Apple 在 9 月 18 日發布了測試版,在 10 月 5 日(iPhone Duo 的 App Store 提交開放當天)發布了發布候選版。你需要:

  • 一臺 Apple 晶片的 Mac。 Intel Mac 無法執行。
  • macOS Tahoe 26.6 或更高版本。
  • Xcode 27.1,從 Apple 開發者網站下載。你可以把它裝在現有 Xcode 旁邊,而不是覆蓋安裝。用發布候選版歸檔 App Store 建置版本,不要用測試版。
  • iOS 27.1 模擬器執行時,需要單獨下載,大約 8GB。在 Xcode 設定的“元件”中獲取,或者執行 xcodebuild -downloadPlatform iOS。安裝之前,執行目標裡不會出現 iPhone Duo。光是 Xcode 本身更新了,這臺裝置並不會出現。

然後開啟 Device Hub,選擇 iPhone Duo,在上面執行你的 App。第一次啟動可能要好幾分鐘,耐心等它啟動完,再判斷 App 是不是壞了。

摺疊它。 Device Hub 有三個姿態按鈕:合上、書本和展開,還有一個把手機旋轉四分之一圈的按鈕。按住 Option 鍵,會出現一個可以設定精確轉軸角度的滑塊。這是 Jeremy Sequoia 發現的。你不需要什麼隱藏的 defaults 命令就能摺疊手機。如果要從指令碼或測試中摺疊,Artem Novichkov 把那個滑塊逆向做成了一個小小的命令列工具。

用 iOS 27.1 SDK 建置。 SDK 會改變你看到的佈局:

建置工具 在內螢幕上
Xcode 26 一塊帶黑邊的 iPhone 形狀面板。不會響應筆電式姿態。
iOS 27 SDK App 可以延伸到狀態列左側。可調整尺寸已開啟,而且無法關閉。
iOS 27.1 SDK App 延伸到螢幕邊緣,標準導航和工具列按鈕豎向排列。

UIRequiresFullScreen 仍然有效,但使用者開啟或合上手機時,App 依然會調整尺寸。要為此做好準備。

確認二進位制檔案確實寫著 27.1。Blake Crosley 手動用 swiftc 建置了一個探測 App,連結器悄悄把它標記成了 iOS 27.0 App:它得到的是一個帶邊框的視窗、橫向的欄,而且沒有保留區域。在 Blake 發現之前,他的文章一直用的是這些數字。原因是用了 swiftc -sdk 卻沒有匯出 SDKROOT,於是退回到了 macOS SDK 的版本。Xcode 建置的版本標記是正確的。對於用其他方式建置的東西,先匯出 SDKROOT,再檢查結果:

otool -l MyApp.app/MyApp | grep -A4 LC_BUILD_VERSION
# platform 2 (iOS), minos …, sdk 27.1

在這個模擬器出現之前,Apple 的工程師建議在可調整大小的 iPhone 上(包括 Mac 上的 iPhone 映象)找普通的佈局 bug。這個辦法仍然能揪出寫死的寬度,但查不出豎向欄、摺痕或不對稱的內邊距問題。那些需要 Duo。

走遍每一種姿態

Device Hub 的控制元件可以開啟、合上、旋轉和摺疊模擬裝置。對每個頁面檢查:

  • 合上,在外螢幕上,緊湊寬度
  • 合上並橫過來,此時外螢幕的寬度和高度都是緊湊尺寸
  • 展開,在內螢幕上,常規寬度和高度
  • 旋轉,兩個方向都要,包括 App 鎖定直向的情況。鎖定只對外螢幕生效,內螢幕仍然可以旋轉。
  • 半折。按鈕避開摺痕了嗎?
  • 做事做到一半時開啟和合上。滾動位置保住了嗎?文本框裡的內容保住了嗎?頁面會不會重新載入,或者換成另一個根頁面?
  • 如果 App 會讀取轉軸,按轉軸指南所說,用 Option 滑塊慢慢掃一遍角度,再快速掃一遍。
兩隻手各舉著一臺 iPhone Duo,一臺合上,一臺展開
測試流程的兩端:合上和展開。每個頁面都要在兩種狀態下走一遍,以及兩者之間的摺疊過程。圖片:Apple

Nikolozi 的音樂 App Mela 是完全自定義的介面,算上各種不對稱的情況,他數出了十一種佈局:四種合上的,兩種半開的,兩種完全展開的,兩種分割畫面的,外加一種豎向分割畫面,影片在上、App 在下。讓程式設計模型來適配 Mela,結果很糟糕。一個用標準 SwiftUI 寫的 App 不需要十一套設計,而一個手工繪製介面的 App 可能需要檢查十一次。

Nikolozi@Nikolozi

If your app's UI is fully custom, you have to deal with 11 completely new layouts due to iPhone Duo's asymmetries. 4 - when closed 2 - half open 2 - fully open 2 - split-screen multitasking 1 - split-screen portrait, video at the top, app at the bottom Did I miss any?

Nikolozi@NikoloziAstra eats more of the weekly credit now. Feels that way, at least. Asked Astra xhigh to adapt Mela's layout for iPhone Duo. It already adapts to every existing Apple device and AUv3 DAW windows. Did a terrible job and burned 30% of the weekly credit.

在分割畫面的兩側都測一遍

在內螢幕上,通過主畫面指示條把 App 拖到一側,再拖到另一側。

  • 佈局在一半寬度下能正常工作。分割畫面始終是 50/50,使用者無法拖動分隔線讓某個 App 佔更多空間。
  • 控制元件會根據你佔據的是哪一半,移到外側邊緣,左邊或右邊。
  • 沒有任何地方假定 App 在左邊。
  • 從一半拖到另一半時,不會有控制元件留在分隔線下面或跑出玻璃之外。
以分割畫面展開的 iPhone Duo:左邊是一個介紹編織工作坊的 Safari 網頁,右邊是 Siri App 裡的對話
Apple 發布公告中的分割畫面。每個 App 的控制元件都在它的外側邊緣,所以同一個 App 放在另一側看起來是映象的。圖片:Apple

拖動時,盯著安全區域和欄看,而不只是內容。放控制元件的那一側會隨你落在哪一半而改變。

別再讀取螢幕尺寸

  • 選擇導航結構時,用 horizontalSizeClass 和 verticalSizeClass,而不是介面方向。
  • 需要像素數時,讀取檢視的 bounds,或者從視窗場景獲取螢幕(window?.windowScene?.screen)。這裡有兩塊螢幕,UIScreen.main 出錯的次數多到足以讓你棄用它。
  • 列表加詳情的佈局,優先用 NavigationSplitView 或 UISplitViewController。三欄的 iPad 佈局在這裡通常顯示兩欄,側邊欄可以以浮層形式調出。系統版本還會在裝置半折時調整尺寸。

處理不對稱的安全區域

Duo 上的內邊距經常每一側都不一樣,而且會在欄移動時變化。每條邊都要單獨測量。

// 每條邊單獨計算。
let width = view.bounds.inset(by: view.safeAreaInsets).width

// 這樣寫假定左右相同,而它們常常不同。
let width = view.bounds.width - view.safeAreaInsets.left * 2

Davyd 發布了一個具體的例子:上 0,左 0,右 84,下 34。Gautham Vijayan 的庫在合上、豎向的螢幕上也讀到了同樣的數字,此時豎向欄佔據了右側。這些數字只對應一種姿態,不是常量。它們展示的是“不對稱”是什麼樣子。

Davyd NRB@tell_me_mur

By the way, here’s how 𝚂𝚊𝚏𝚎 𝙰𝚛𝚎𝚊 𝙸𝚗𝚜𝚎𝚝𝚜 look on the 𝗶𝗣𝗵𝗼𝗻𝗲 𝗗𝘂𝗼 📱 { "𝚋𝚘𝚝𝚝𝚘𝚖": 𝟹𝟺, "𝚕𝚎𝚏𝚝": 𝟶, "𝗿𝗶𝗴𝗵𝘁": 𝟴𝟰, "𝚝𝚘𝚙": 𝟶 }

把可互動的內容放在安全區域內。背景圖可以無視它。專門忽略水平邊緣,即 ignoresSafeArea(.horizontal) 或 edgesIgnoringSafeArea(.horizontal),現在會讓背景滑到側邊控制元件的下面。Vilteros 在適配現有 App 時專門提到了這一點。全出血的照片沒問題,那條區域裡的按鈕就不行了。

還要檢查佈局邊距。Maximilian 在回覆 Harshil 時說,他看到容器的預設邊距返回了 0,希望這只是測試版的 bug。讀取 contentMargins,而不是用一個內邊距常量;在用魔法數字“修復”之前,先在兩種姿態下看看結果。

還有一個要搜尋的字串:“Face ID”(Face ID)。iPhone Duo 用側邊按鈕裡的 Touch ID 解鎖,所以如果提示裡寫著 Face ID,只是因為你把它寫死了,那在這臺手機上就是錯的。詢問 LAContext.biometryType,裝置報告什麼就用什麼。

先試系統介面,再試你自己的

對每個主要頁面,在顯示以下內容時開啟和摺疊:

  • 一個面板,包括放在尾側的面板。在 27.1 測試版中,Natalia Panferova 發現尾側面板沒有用上豎向工具列,關閉按鈕落在了狀態顯示區下面。在 Natalia 的測試中,設定 presentationDetents([.large]) 解決了這個問題,但這是測試版的臨時辦法,不是文件規定的要求。詳見豎向欄指南。
  • 一個帶文本框的警告框。Emre Degirmenci 發現,外觀或姿態改變時,SwiftUI 原生警告框裡的文本框會出問題。這是應該提交回饋的模擬器 bug,而不是需要寫程式碼繞過的佈局問題。
Emre Degirmenci@emrdgrmnci

another iphone duo simulator bug on the native SwiftUI alert texfield when the appearance or pose changed

  • 鍵盤、上下文選單和彈出框。
  • 浮動按鈕、自定義標籤列以及任何播放控制元件。系統不會替你挪動這些。
  • 最大號的動態字型、很長的本地化字串、從右到左的語言、深色模式,以及“降低透明度”。“降低透明度”會改變透過豎向欄顯示出來的內容。

不要輕信每一段螢幕錄影

EchoPod 的開發者在開始適配一個側邊導航器時,嘗試在 Device Hub 裡錄下摺疊過程。手機開啟後,螢幕錄影是黑的。如果錄下來的畫面是空的,先親眼看看模擬器,再去改佈局。警告框文本框和尾側面板也適用同樣的規則:先判斷你看到的是自己的 bug 還是 Xcode 的。

ClothPath@huang4fun

EchoPod 开始适配 iPhone Duo 侧边导航栏了,吐槽下模拟器的录像功能,以为是可以录展开折叠屏的app 内容变化,结果点击展开后录的是黑屏,apple 家东西是越来越糊弄人了

Image from ClothPath's post

UI 測試也有一個相關的陷阱。Daniel Bernal 在開發 FlowDeck 時發現,外螢幕和內螢幕使用各自獨立的幀緩衝區和觸控路徑。一次轉軸移動或旋轉可能會悄悄切換當前路徑,於是下一次點按就落空了。Raul 遇到過一個小版本的問題:對“返回”按鈕的輔助功能查詢不再能匹配上。姿態改變之後,要重新指定你想點按的那塊螢幕。

模擬器完全做不到的一件事是執行捕捉會話。前置鏡頭之間的切換和外螢幕相機配件,都要等真機。屆時要檢查什麼,見相機指南。

錄下來,告訴大家

能正常工作之後,就可以提交到 App Store 了:提交 iPhone Duo App 介紹了建置、新的截圖尺寸和 2027 年 4 月的規定。然後錄一段你親自看過的影片(展開、摺疊、分割畫面),並把 App 發給 FoldHunt。在硬體上市之前,一段短影片是你最好的證明,也是大家會點開看的東西。

沒有 Mac 時體驗 Duo 的其他方式

Apple 的模擬器只能在 Mac 上執行。下面這些替代方案適用於其他環境。要清楚你用的是哪一種:只有第一種是在 Apple 的模擬器上執行你真正的 iOS App。

  • VibeView 把 Apple 自己的 iPhone Duo 模擬器從它的 Mac 串流到瀏覽器標籤頁裡,所以在 Windows 和 Linux 上也能用。你可以把它折到合上、半折或展開,拖到任意轉軸角度,旋轉它,還可以讓程式設計智慧體通過它的命令列工具做同樣的事。它自己的說明提到,用正式版 Xcode 建置的 App 會在內螢幕上以手機大小的視窗開啟。要鋪滿螢幕,請上傳用 iOS 27.1 SDK 建置的版本。
  • Bitrig 是一款適用於 Mac 和 iPhone 的 AI App 建置工具,它在 9 月 19 日加入了自己的互動式 3D iPhone Duo。你可以把它合上、完全展開、半折和立起,你在 Bitrig 裡做的 App 會隨著你的操作做出響應。這是 Bitrig 的模擬器,不是 Apple 的,執行的是用 Bitrig 做的 App。
  • Thanh Doan 的 Duo 是一個受 iPhone Duo 啟發的桌面端摺疊手機演練場,可以在瀏覽器裡預覽。它不是 iOS 模擬器:為它建置的 App 只能在它裡面執行。
  • 只是想看看各種姿態? 我們首頁上的模型可以在合上、展開、筆電式和立起之間摺疊。拖動它,或者選一個姿態。

一旦你的 App 能在 Apple 的模擬器上執行,Matte 可以一次性錄下兩塊螢幕和每一次摺疊,並把摺疊過程做成 3D Duo 上的動畫,用於示範影片。

繼續閱讀

App · 規格閱讀約 4 分鐘

iPhone Duo 能執行 iPad App 嗎?iPhone Duo 與 iPad mini

iPhone Duo 的內螢幕幾乎有 iPad mini 那麼大,但它執行的是 iOS,不是 iPadOS。這對僅限 iPad 的 App 意味著什麼、為什麼很多 Duo App 看起來會像它們的 iPad 版,以及 Duo 從 iPad 借來了什麼。

10月6日閱讀指南