开发测试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”(面容 ID)。iPhone Duo 用侧边按钮里的触控 ID 解锁,所以如果提示里写着面容 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 · 规格阅读约 3 分钟

iPhone Duo 能运行 iPad App 吗?iPhone Duo 与 iPad mini

iPhone Duo 的内屏几乎有 iPad mini 那么大,但它运行的是 iOS,不是 iPadOS。这对仅限 iPad 的 App 意味着什么、为什么很多 Duo App 看起来会像它们的 iPad 版,以及 Duo 从 iPad 借来了什么。

10月6日阅读指南