SuperAPI AI 工具集

uikit-app-modernization

编程与开发

查看项目

更新于 10-15 10:54

技能介绍

用途

UIKit App Modernization 技能用于将 UIKit 应用现代化,使其在现代 iOS 上正确运行。具体目标包括:

  • 消除对旧式共享状态 API 的引用
  • 从应用生命周期迁移到场景(Scene)生命周期
  • 支持动态场景尺寸与多窗口环境

主要能力

该技能在 Swift 和 Objective-C 代码库中执行具体、有针对性的现代化改造:

  • 用符合上下文的现代 API 替换旧式共享状态 API
  • 迁移到基于场景的生命周期
  • 更新应用以支持可调整大小的用户界面,移除对以下内容的依赖:
    • 主屏幕(UIScreen.mainScreen、UIScreen.main)
    • 界面方向(interfaceOrientation)
    • 对称安全区假设(safeAreaLayoutGuide、safeAreaInsets)

核心原则

  • 就近消费:优先使用离使用点最近的信息(例如视图的 trait collection 而非窗口的)。
  • 必须应用替换:当目标 API 存在时,必须应用替换。仅留 TODO 视为失败;包含目标 API 的文件产生空 diff 也视为失败。只有在目标 API 仅出现在死代码(#if 0/#endif)中时才跳过。不确定时选择最符合用户请求的替换,而非产生空 diff。绝不静默跳过文件。
  • TODO 必须可操作:每个留下的 TODO 必须说明(a)为何需要更改,(b)正确的替换应是什么样,(c)任何生命周期或线程问题。TODO 应单独成行放在未更改代码上方,绝不内联。
  • 不添加冗余 TODO:如果现有注释已覆盖迁移,则不再添加。
  • 风险更改前询问用户:当替换可能破坏调用方或改变可观察行为时,先询问用户。仅在非交互运行时或用户明确拒绝提供指导时,才留下 TODO。
  • 尊重用户明确指令:用户指定具体方法时,严格使用。用户表述笼统时,应用任务参考文件中的默认值。
  • 绝不用字面量替换动态值:始终保持替换为动态值。
  • 保留控制流:优先使用保持原始代码结构的直接替换。仅在直接替换不可行时才添加 guard/提前返回模式。编辑控制流周围代码时,验证分支结构是否保留。绝不删除分支,除非用户明确要求。
  • 不越界清理:只修改包含当前任务目标弃用 API 的行。不修复附近的其他弃用,不修剪空白,不重新格式化。
  • 提取重复表达式:同一作用域内多次使用相同替换值时,提取为命名局部变量。
  • 绝不遍历全局场景/窗口状态:绝不使用 UIApplication.shared、UIDevice.current、UIScreen.main 或其他共享对象作为替换。若无本地对象可用,修改方法以接受新参数并弃用旧方法。
  • 完整模式,原子化,绝不部分:每个多部分模式要求所有部分作为单个原子单元一起应用。弃用并转发模式要求弃用 + 新重载 + 转发,绝不只做内联替换。若无法完成所有部分,要么完成完整模式,要么以明确原因跳过。
  • 添加新重载时绝不删除旧方法:应用弃用并转发时,旧方法必须保留在文件中作为弃用包装器,通过 .current 转发到新重载。
  • 保留无关的守卫和回退:移除 UIScreen.mainScreen 引用时,只更改该引用。不删除 respondsToSelector: 检查、nil 屏幕守卫、版本检查等防御逻辑。
  • 在触及弃用 API 的最低方法上应用弃用:当多个调用方汇聚到一个实际读取弃用共享状态的辅助方法时,将弃用并转发放在该辅助方法上,而非每个公共调用方。
  • 目标替换守卫:编辑任何行之前,验证(a)该行包含当前任务的目标弃用 API,(b)编辑的是用户询问的弃用,而非附近“看起来相似”的行。

使用方式

技能按以下工作流执行:

阶段 0:简单情况的快速路径

在进入决策树之前,检查是否匹配简单情况。大量 UIScreen.main/UIScreen.mainScreen 出现是 UIView/UIViewController 实例方法内的简单替换,值被新鲜消费。这些情况无需分析,直接替换:

  • UIScreen.main.scale(Swift)在 UIView/UIViewController 实例方法内,内联使用(未存储)→ self.traitCollection.displayScale
  • [UIScreen mainScreen].scale(ObjC)在 UIView/UIViewController 实例方法内,内联使用(未存储)→ self.traitCollection.displayScale
  • UIScreen.main.scale 在 layoutSubviews、drawRect:、updateConstraints 或 viewIsAppearing: 内 → self.traitCollection.displayScale(无需注册,UIKit 在 trait 变化时自动调用这些方法)

阶段 1:检测

使用每个相关任务文件的检测模式识别需要现代化的模式。对任务注册表中适用于该代码库的每个任务运行检测。

阶段 2:分析

对每个出现,阅读周围上下文以理解:类层次结构、方法类型、生命周期阶段、代码意图。可使用子代理识别需要更新的代码以保持上下文窗口小。

阶段 3:决策与验证

  • 存在安全 1:1 替换 → 应用它,不添加注释。
  • 多种有效方法或代码重定位 >10 行 → 询问用户。
  • 无安全替换可能(极罕见)→ 添加 TODO,明确任务。绝不产生静默空 diff。

阶段 3b:文件处理完整性

处理每个包含目标弃用 API 的文件。不提前停止、跳过文件或静默丢弃文件。显式跟踪文件列表,处理每个文件时标记完成。使用子代理防止静默丢弃。大文件(1000+ 行)不豁免。批量处理纪律:一次处理一个或小批量(3–5 个文件)。

阶段 4:实现

应用当前任务的实现门、规则和文件后检查清单。

阶段 5:最终验证

文件覆盖审计:使用子代理比较给定文件列表与实际产生 diff 的文件。每个输入文件必须有非空 diff。

任务注册表

除非开发者请求明确限定子集,否则将本注册表中的每个任务应用于代码库。每个任务独立,有自己的检测模式、决策树和验证规则。按从上到下顺序运行:

  • UIScreen.main modernization(uiscreen-task.md):用符合上下文的 API 替换 UIScreen.main
  • userInterfaceOrientation modernization(orientation-task.md):用尺寸类或窗口边界替换布局相关的方向检查
  • Scene lifecycle migration(scene-lifecycle-task.md):将 AppDelegate 迁移到 SceneDelegate
  • Safe Area Insets(safe-area-task.md):用安全区引用替换硬编码的 inset 值,并确保现有引用在非对称安全区下正常工作

适用场景

适用于需要现代化改造的 UIKit 应用代码库,特别是需要支持多窗口、动态场景尺寸、场景生命周期的 iOS 应用。适用于 Swift 和 Objective-C 代码。

限制

  • 技能只执行特定、有针对性的现代化,不进行机会性清理。
  • 无安全替换时需询问用户或留下 TODO,不保证所有情况都能自动完成。
  • 部分模式要求原子化应用,无法完成时需跳过并说明原因。
  • 具体收费、价格、平台支持等信息暂未提供。