mcpField
I
iphone-duo

iphone-duo

github.com/d-date开发4441 次安装2 周前更新
代码仓库

关于 iphone-duo

iphone-duo 是一项指导开发者适配 iPhone Duo 的技能,基于 Apple 文档和实验室资料,涵盖布局、设备行为、测试与迁移。

主要功能

  1. 01自适应布局与尺寸类别指南
  2. 02显示屏、铰链和多任务行为
  3. 03模拟器与尺寸调整测试指南
  4. 04迁移清单与 API 注意事项

适用场景

  1. 01将现有 iPhone 应用适配到 iPhone Duo
  2. 02检查不同设备姿态下的布局
  3. 03审查显示屏切换时的应用行为
  4. 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.md
camera.md
checklist.md
layout.md
scenes.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 代码补全或真机、模拟器确认,请在提出实现方案时明确说明。看似合理但实际错误的拼写,比承认自己不知道更有害。

来源

评论

支持 Markdown