用途
该技能用于将 UIKit 应用现代化,使其在现代 iOS 的多窗口环境中表现正确。具体目标包括:
- 消除对遗留共享状态 API 的引用
- 从应用生命周期迁移到场景生命周期
- 支持动态场景尺寸和多窗口环境
主要能力
技能针对 Swift 和 Objective-C 代码库执行具体、有针对性的现代化改造:
- 用符合上下文语境的现代 API 替换遗留共享状态 API
- 迁移到基于场景的生命周期(Scene Lifecycle)
- 移除以下用法,使应用支持可调整大小的用户界面:
- 主屏(UIScreen.mainScreen、UIScreen.main)
- 界面方向(interfaceOrientation)
- 对称安全区域的假设(safeAreaLayoutGuide、safeAreaInsets)
技能按任务注册表(Task Registry)组织,包含以下任务:
| 任务 | 说明 |
|---|---|
| UIScreen.main modernization | 用符合上下文的 API 替换 UIScreen.main |
| userInterfaceOrientation modernization | 用尺寸类或窗口边界替换与布局相关的方向判断 |
| Scene lifecycle migration | 将 AppDelegate 迁移到 SceneDelegate |
| Safe Area Insets | 用安全区域引用替换硬编码的插入值,并确保现有引用在非对称安全区域下正常工作 |
核心原则
- 最贴近消费点:优先使用最接近使用点的信息(例如视图的 trait collection 优于窗口的)。
- 目标 API 存在时必须应用替换:仅有 TODO 是失败;对含目标 API 的文件产生空 diff 也是失败。仅在目标 API 只出现在死代码(#if 0/#endif)中时才跳过。
- TODO 必须可操作:每条留下的 TODO 必须说明(a)为何需要改动、(b)正确替换应是什么样、(c)任何生命周期或线程方面的顾虑;TODO 放在未改动代码上方独立一行,不得内联。
- 当已有注释覆盖迁移时,不添加冗余 TODO。
- 进行有风险的代码改动前先询问用户,仅在无法交互时回退到 TODO。
- 遵从用户的明确指令,否则应用任务参考文件中的默认值。
- 绝不用字面量替换动态值——始终保持替换为动态值。
- 保留控制流:优先使用保持原代码结构的直接替换;编辑分支结构后须验证分支保留;绝不删除分支(} else {、default:、catch),除非用户明确要求。
- 保持在范围内:不做机会性清理,只修改含目标废弃 API 的行。
- 提取重复表达式:同一作用域内重复使用的替换值提取为具名局部变量。
- 绝不遍历全局场景/窗口状态:不得使用 UIApplication.shared、UIDevice.current、UIScreen.main 等共享对象作为替换。
- 模式需完整、原子化,不可部分应用:需弃用并转发时,须包含弃用 + 新重载 + 转发;不得降级为对内联共享对象的引用。
- 添加新重载时绝不删除旧方法:旧方法须保留为已弃用的包装器并通过 .current 转发到新重载。
- 保留无关的守卫与回退:移除 UIScreen.mainScreen 引用时只更改该引用,不删 respondsToSelector: 检查、nil 守卫、版本检查等。
- 在触及废弃 API 的最低层方法上应用弃用。
- 替换目标守卫:编辑前须确认该行含目标废弃 API,且是在改用户所问的弃用点。
使用方式
技能的工作流分为多个阶段:
- 阶段 0:简单情况的快速路径。对 UIView/UIViewController 实例方法内、内联使用(未被存储)的 UIScreen.main.scale,直接替换为 self.traitCollection.displayScale;在 layoutSubviews、drawRect:、updateConstraints 或 viewIsAppearing 中无需注册。
- 阶段 1:检测。使用各任务文件的检测模式,对任务注册表中所有适用任务运行检测。
- 阶段 2:分析。对每处出现,阅读上下文以理解类层次结构、方法类型、生命周期阶段和代码意图;可用 subagent 识别需更新的代码。
- 阶段 3:决策与校验。存在安全的一对一替换则应用;有多种有效方式或代码迁移超过 10 行则询问用户;无安全替换(极罕见)则添加明确 TODO。
- 阶段 3b:文件处理完整性。处理每个含目标废弃 API 的文件,不提前停止、跳过或静默丢弃;使用任务/待办工具或 markdown 文件显式跟踪文件列表;按小批量(3–5 个文件)处理。
- 阶段 4:实现。应用任务参考文件中的实现门禁、规则和文件后检查清单。
- 阶段 5:最终验证。用 subagent 对比给定文件列表与实际产出 diff 的文件,确保每个输入文件都有非空 diff。
适用场景
- 需要让已有 UIKit 应用支持多窗口和动态尺寸的 iOS 项目
- 使用 Swift 或 Objective-C 编写、包含 UIScreen.main / UIScreen.mainScreen、interfaceOrientation 等遗留 API 的代码库
- 需从 AppDelegate 迁移到 SceneDelegate 的应用
- 需处理非对称安全区域、替换硬编码安全区插入值的界面
限制
- 技能只做针对性现代化改造,不进行机会性清理或其他范围内的废弃修复
- 不替换动态值为字面量;不使用全局共享对象作为替换
- 进行有风险的改动(如更改被其他模块导入的方法签名)前须先询问用户;无法交互时退回 TODO
- 数据中未提供该技能的收费、价格、平台支持范围等信息