GitHub 开源项目 mirzaaghazadeh/iphone-duo-skills 的能力拆解。8 个专项 skill + 3 份参考手册,把 Apple 六部 Tech Talks 和 HIG 文档蒸馏成 Agent 可直接执行的结构化指导。
Apple 的 iPhone Duo 开发者材料只有六部 Tech Talk 视频 + 一页 HIG。这个项目把它们蒸馏成结构化 skill,让 Agent 能直接「按图索骥」。
支持 npx 一键试用(不安装)或手动 clone 安装到本地。按需选择。
npx skills use mirzaaghazadeh/iphone-duo-skills@iphone-duo-readiness
一行命令临时调用入口 skill,不在本地留文件,适合先评估能力。
git clone https://github.com/mirzaaghazadeh/iphone-duo-skills.git cp -r iphone-duo-skills/skills/* ~/.claude/skills/
克隆后把 skills 目录复制到 ~/.claude/skills/,即可被 Claude Code 等 Agent 识别加载。
按「框架/场景」切分,互不重叠。入口 skill(readiness)负责路由到正确的专家 skill。
多数资料只讲「铰链是 division、相机是 occlusion」。这个项目把第三个区域——外屏相机——的行为差异讲清楚了。
| 区域 | 类型 | 何时存在 | 行为特征 |
|---|---|---|---|
| 外屏前置摄像头 | Occlusion | 常驻 | 位于外屏角落、与侧边竖排控件对齐;有 Live Activity 时扩展为竖排 Dynamic Island。是布局的「永久事实」,一次性处理。 |
| 内屏前置摄像头(屏下) | Occlusion | 仅摄像头激活时 | 平时不可见,激活时 UI 移开露出。时有时无,要按变化做动画响应,不能只在布局时读一次。 |
| 铰链 / 折叠区 | Division | 仅设备半折时 | 把内屏分割成两个可用区域,弯折中央不可用。放平时 inactive 且宽度为 0。 |
用 includeInactive 查询到 division region 即判定设备有 fold → 偏好偶数列,半折时内容均分两侧,不被劈开。
secondary view dismiss 后,primary view 不会像 iPad 那样横跨全屏重新居中,而是留在 fold 定义的当前区域内,保证控件可达。
「栏竖起来」只是开始。Split View、Sheet、控件归属这三处最容易踩坑。
flexible spacer 在竖轴上归零,fixed spacer 保持最小尺寸——手动加间距会在姿态切换时失效。改用 ToolbarItemGroup / UIBarButtonItemGroup 表达分组关系,系统自动留白并根据可用空间调整。
跨端框架没有 fold API,但 80% 的适配不需要桥接。RN 侧已内化进 ios27-adaptation(iphone-duo-rn.md + 扫描器 3 条规则),Flutter 侧待有业务场景时补充。
Flutter 的 MediaQuery.displayFeatures 和 dual_screen 包(TwoPane / hingeAngleEvents)是 Android-only,在 iPhone Duo 上返回空列表。RN 同样没有 fold/hinge API。不要在这里浪费时间。
RN 特有注意:核心 SafeAreaView 已废弃,必须用 react-native-safe-area-context 的 useSafeAreaInsets();Dimensions.get() 快照会过期,换 useWindowDimensions() hook。
好的 skill 不只给 API,更解释「为什么需要这个 API」。这两个例子值得借鉴。
AVCaptureDevice.position 只表示摄像头在硬件上的安装位置(.front / .back),不表示它当前朝向用户。Duo 双屏可翻转,三个场景打破假设:① 用户看内屏时外屏前摄是背向;② 合盖时同一颗外屏前摄转向面对用户;③ 展开翻转后后置摄像头变成自拍视角。DirectionCoordinator 回答的是「哪颗摄像头当前朝前」,RotationCoordinator 回答的是「输出画面是否正立」——两个 coordinator 解决两个问题,多数相机 App 都需要。「可以锁方向,但不能停止填屏」——内屏不遵守 supportedInterfaceOrientations,锁了方向也会 resize。正确做法:锁方向 + 全姿态填屏 + 世界缩放但 HUD/触控保持物理尺寸 + 触控锚定边缘避开折痕。
开源社区的能力已拆解、筛选、合并进我们的内部 skill,与小红书工程实践整合。
| 来源 | 能力 | 已合并到 |
|---|---|---|
| readiness | 排查固定假设:idiom / orientation 分支检测 | scan_ios27.py 新增 3 条 P1-B 规则 |
| adaptive-layout | 三个保留区域行为差异、Split 不跨屏居中、Grid 偶数列 | references/iphone-duo.md#折痕布局 |
| vertical-bars | Split View/Inspector 特例、Sheet 分屏行为、Group 替代 spacer、控件归属原则 | references/iphone-duo.md#竖向栏 |
| camera | Direction vs Rotation 概念区分、position≠朝向的三场景 | references/iphone-duo.md#相机 |
| design-review | 10 问设计走查清单 | references/test-checklist.md#B 线设计走查 |
| react-native | 两档策略(Tier 1 纯 JS / Tier 2 原生桥接)、displayFeatures 空列表坑位 | references/iphone-duo-rn.md + scan_ios27.py 3 条 RN 规则 |
小红书主 App 无 Flutter 业务,暂不吸收。如后续有 Flutter 容器场景,两档策略与 RN 版同构,可快速补出。
游戏场景与主 App 无关;多 skill 架构与我们的单 skill + references 选读模式等价,不改架构。