关于 iphone-duo
iphone-duo 是一项指导开发者适配 iPhone Duo 的技能,基于 Apple 文档和实验室资料,涵盖布局、设备行为、测试与迁移。
主要功能
- 01自适应布局与尺寸类别指南
- 02显示屏、铰链和多任务行为
- 03模拟器与尺寸调整测试指南
- 04迁移清单与 API 注意事项
适用场景
- 01将现有 iPhone 应用适配到 iPhone Duo
- 02检查不同设备姿态下的布局
- 03审查显示屏切换时的应用行为
- 04为 App Store 提交准备应用
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ d-date/ iphone-duo-skill --skill iphone-duo安装后在 Claude Code 中输入/iphone-duo确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/bars.mdcamera.mdchecklist.mdlayout.mdscenes.md详细介绍
让应用适配 iPhone Duo
本实施指南以六场 Apple Tech Talks、Human Interface Guidelines、Apple Developer Documentation,以及两场 iPhone Duo Group Labs(2026-09-16 和 2026-09-17)为主要资料来源。
App Store Connect 将从 2026-10-05 起接受优化后的应用。自 2027-04 起提交应用时,必须提供 iPhone Duo 截图。
从这里开始
iPhone Duo 将于 2026-10-23 随 iOS 27.1 发布。支持 iPhone Duo 的 SDK 和 Device Hub 已包含在 Xcode 27.1 中(测试版于 2026-09-18 发布,Release Candidate 于 2026-10-05 发布)。
iPhone Duo 配有内屏和外屏两块显示屏,可围绕中央铰链开合。你的应用仍然是 iPhone 应用;设备开合时,应用会调整大小。它没有专用的用户界面 idiom:返回的是 phone。唯一新增的特性是,内屏在水平和垂直轴上均采用 regular 尺寸类别,这在 iPhone 上尚属首次。
在内屏上全屏运行的应用会在设备合上时移至外屏,并继续运行,不会进入后台。分屏视图是例外:两个应用并排显示时,最近使用的应用会移至外屏,另一个应用则进入后台。如果立即重新打开设备,两个应用都会返回;如果等待一段时间,原先显示在外屏上的应用会铺满内屏。
基础在于采用能够处理尺寸变化的布局。现有的 iPad 或 iPhone Mirroring 尺寸调整支持可直接沿用。
按 SDK 划分的行为
| 构建 SDK | 行为 |
|---|---|
| iOS 27 之前(Xcode 26) | 以加黑边的方式运行。外屏的宽高比接近 iPhone mini,竖向边缘栏一侧会有黑色条带。内屏上的界面会以相同宽高比居中显示,且不会响应姿态变化。 |
| iOS 27 | 启用尺寸调整支持(不可选择退出)。几乎占满整个内屏,但状态栏下方一侧仍会保留黑色条带。 |
| iOS 27.1 | 延伸至显示屏边缘,标准边栏垂直放置在状态栏下方。 |
你无需一开始就为每种姿态打造专属体验。Apple 建议先在发布时提供尺寸调整支持并遵循最佳实践,然后再逐步改进体验。
使用 Xcode 27.1 的 Device Hub 中的 iPhone Duo 模拟器进行测试。你可以调整铰链角度,并选择合上、打开、书本、笔记本电脑和帐篷姿态。检查姿态之间的切换,以及每种姿态本身。模拟器还会返回保留区域:将设备部分折叠并绘制这些区域,以检查避开折痕或摄像头的自定义布局(参见 references/layout.md 中的“在模拟器中测试”)。由于需要摄像头,模拟器无法重现内屏和外屏同时亮起的情况。iOS 27.1 模拟器现在可以启动使用摄像头的应用。它不会显示视频,并会报告没有可用摄像头,但你可以检查其余用户界面。
你还可以使用 Device Hub 的 iOS 可调整大小模拟器检查尺寸调整支持。在 iPad 上运行应用并调整窗口大小;对于仅支持 iPhone 的应用,则可在 macOS 27 上使用 iPhone Mirroring,并沿两个方向将尺寸调整至极限。iPhone Duo 模拟器是测试完整原生体验的最佳方式。iPhone Mirroring 使用接近内屏的宽高比,并保留 iPhone 界面 idiom。它可以复现许多问题。若没有 iPhone Duo 模拟器,就较难发现由垂直边栏导致的安全区域和边距不对称问题。
应阅读哪些参考文档
只阅读完成任务所需的参考文档。
| 参考文档 | 涵盖内容 |
|---|---|
references/layout.md | 尺寸类别、安全区域的不对称性、显示屏圆角、保留区域、布局 |
references/bars.md | 垂直栏、项目排序、轴向控制、徽标、溢出、工作表、禁用垂直栏 |
references/scenes.md | 铰链、多任务处理、分屏浏览中的窗口位置、多个窗口、场景配件、相机配件、Core Motion、Web |
references/camera.md | 双前置摄像头、摄像头方向、预览、旋转 |
references/checklist.md | 现有应用的迁移与验证,以及 App Store 检查清单 |
一般原则
这些原则适用于所有领域。牢记它们,以便更快地做出决策。
使用尺寸类别做决策。 不要根据用户界面习惯推断屏幕尺寸或设备功能,也不要根据 UIDevice.current.orientation、statusBarOrientation 或 interfaceOrientation(包括 windowScene.effectiveGeometry.interfaceOrientation)切换布局。比较边界的宽度和高度,以确定布局是高还是宽,并移除 bounds.height == 844 这类设备尺寸比较。内屏不会根据应用声明支持的界面方向旋转,而是会缩放。检查方向不会得到预期结果。即使是仅支持纵向的应用,在内屏上也具有 regular/regular 尺寸类别。你可以从环境或特征中读取当前方向,但应基于可用宽度做决策。建议不再使用锁定方向或尺寸的设置,例如 UIRequiresFullScreen。
不要通过分支重建视图层级。 在 SwiftUI 代码中,如果根据尺寸类别使用 if,并在每个分支中采用不同的容器,那么分支变化时,一个视图层级就会被丢弃。除非将状态提升到父级,否则状态会丢失。iPad 调整大小时就会发生这种情况;在 iPhone Duo 上,每次设备从内屏切换到闭合状态时都会发生。首先考虑移除分支本身,例如使用 ArrangementView。
不要直接引用屏幕。 在双显示屏设备上,UIScreen.main 指代不明确,而且已在文档中弃用。请使用环境、特征集合和场景边界。如果需要屏幕,请从 window?.windowScene?.screen 获取。将 UIWindow(frame: UIScreen.main.bounds) 替换为 UIWindow(windowScene:),并动态获取 UIScreen,而不是保留它。不要只在启动时或 viewIsAppearing 中读取一次尺寸;应在 layoutSubviews / viewDidLayoutSubviews 中重新读取,并在 viewWillTransition(to:with:) 中处理尺寸变化。对于显示比例,displayScale / traitCollection.displayScale 已足够。
检查全出血媒体是否会被裁切。 检查 .scaleAspectFill / .aspectRatio(contentMode: .fill) 是否会在宽布局中裁切内容。根据尺寸类别或宽高比,在填充和适应之间切换,或指定焦点。在发布使用 iOS 27.1 SDK 构建的应用之前,请验证当栏变为垂直方向时,内容能否自适应。
安全区域会变得不对称。 假设相对边缘的内边距相等的代码会出错。不要再使用 view.bounds.width - insets.left * 2 这类表达式,并分别处理每条边。布局边距和内容内边距也会不对称。请使用系统实际提供的值,而不要将一侧边缘的值复用于另一侧边缘。
标准组件会自动处理大部分适配。 标准导航栏、栏、工作表、警告框和菜单会自动适配设备姿态和折叠状态。系统也会处理折叠避让。每个自定义替代方案都会增加你需要自行处理的工作。 从更高层级的 API 入手。 与折叠相关的 API 分为多个层级:铰链角度 → 保留区域 → 排列视图 → 系统组件。在自行根据铰链角度计算布局之前,先考虑更高层级的 API 是否足以满足需求。
它是一部手机。 现有的 iPad 设计是很好的起点,但不要原样照搬。移除仅适用于 iPad 的元素,或按设备类型区分。同样,不要构建只能在 iPhone Duo 上运行或假设设备只有一种姿态的应用。用户会将它视为产品线中的一种机型。将 iPad 应用移植过来的第一步,是让应用支持通用平台,并添加对 iPhone 的支持(目前尚不清楚是否存在类似 Apple Vision Pro 兼容模式的方案)。
将其视为一台设备。 将打开设备设计为扩大应用窗口的调整大小操作。用户会以多种方式握持和放置设备,因此不要假设特定姿态。设备处于桌面姿态时,无论摄像头一侧还是外屏朝下,都应提供相同的体验。如果要根据姿态更改 UI,请考虑能否流畅地为转换添加动画。
关于 iOS 27.1 API
截至 2026-09-18,已确认排列、保留区域、铰链(UIKit)、垂直栏控件、摄像头方向协调器和其他 API 的文档已发布为 iOS 27.1+ Beta。这些 API 在正式版发布前可能会发生变化。
截至 2026-09-18,已确认本指南涵盖的所有 API 均已在文档中声明。
如果仍要支持 iOS 16 等较早版本,请使用可用性检查封装 iPhone Duo 专属代码。具体范围取决于应用:可以构建全新的独立 UI 并冻结旧版 UI,也可以使用更细粒度的条件,在所有设备上继续提供相同功能。
实现时,请通过 Xcode 代码补全以及真机或模拟器进行验证。
如何作答
使用用户的语言撰写说明、方案和验证结果。保留 API 名称、类型名称、标识符和来源标题的原始拼写。
由于本指南涉及尚未发布的 API,不要编造无法验证的签名。 如果无法通过 Xcode 代码补全或真机、模拟器确认,请在提出实现方案时明确说明。看似合理但实际错误的拼写,比承认自己不知道更有害。
来源
-
A Summary of the iPhone Duo Group Lab (Apple Developer Forums)
-
Tech Talks: Prepare your app for iPhone Duo / Raise the bar with iPhone Duo / Strike a pose with adaptive layouts on iPhone Duo / Leverage multiple displays and scenes on iPhone Duo / Build a great camera experience for iPhone Duo / Design for iPhone Duo
-
Human Interface Guidelines: Designing for iPhone Duo
-
Meet with Apple: iPhone Duo Group Lab (2026-09-16 / 2026-09-17)
-
Apple Developer Documentation: Preparing your app for iPhone Duo / Registering a camera capture accessory on iPhone Duo / Choosing a camera by the direction it faces / Supporting device rotation in your camera app / iOS 27.1 Beta API reference