一个面向 Objective-C + UIKit 项目的 Agent Skill,可用于 Codex 和 Claude Code,帮助维护、审查、重构、调试和编写更安全的 OC iOS 代码。
它重点关注旧项目里最容易出问题的地方:ARC 所有权、循环引用、KVO/KVC、Swift 混编、Xcode 工程与依赖配置、静态库/Pod category 符号裁剪、-ObjC / -force_load、CocoaPods/SPM 混用、闭源 .a 到 xcframework 迁移、头文件/PCH/modulemap、编译速度、废弃 API 与合规适配、UIWebView 到 WKWebView、隐私清单、Required Reason API、ATT/IDFA、权限体系、UIKit 性能、列表滚动、渲染卡顿、网络异步、本地数据持久化、内存泄漏、野指针诊断、崩溃日志符号化、dSYM/MetricKit、OOM/Jetsam/watchdog、pre-main 启动拆解、崩溃边界、重构安全网、安全审计、推送后台和静态扫描工具链落地。
- 维护老 Objective-C iOS 项目。
- 审查
.h、.m、.mm中的内存、线程、崩溃和性能风险。 - 治理 Xcode 工程、
.xcconfig、CocoaPods、SPM、静态库、闭源二进制、modulemap/PCH 和编译速度问题。 - 盘点并迁移废弃 API,处理 App Store 隐私清单、Required Reason API、ATT/IDFA、相册/定位权限和现代 UI 适配。
- 优化 UIKit 页面、列表、cell 复用、Auto Layout、渲染和启动性能。
- 处理 retain cycle、block capture、timer、observer、delegate、KVO/KVC 等常见坑。
- 为无测试老代码补 characterization test、OCMock、快照测试,并安全拆分 Massive ViewController、收敛单例和
NSNotificationCenter。 - 审查 ATS 例外、SSL pinning、硬编码密钥、WKWebView JS bridge 注入面、本地敏感数据和越狱检测边界。
- 治理 APNs 证书到 p8 token auth 迁移、推送回调、
beginBackgroundTask泄漏和 BackgroundTasks 适配。 - 落地 clang static analyzer、Infer、OCLint 和
-Wallwarning baseline / 分级 / CI 门禁。 - 审查
NSUserDefaults、Keychain、文件存储、归档、Core Data、SQLite/FMDB、离线缓存和数据迁移问题。 - 改善 Objective-C 与 Swift 混编边界。
- 给新手生成更保守、更不容易出错的 OC + UIKit 基础架构。
- 内存与所有权:
strong/weak/copy/assign、block 必须copy、weak delegate、weak/strong dance。 - 崩溃治理:崩溃分类、证据闭环、崩溃日志符号化、dSYM/UUID 管理、MetricKit 接入、集合 nil/越界、KVC/KVO 崩溃、动态 selector、列表批量更新一致性、野指针诊断、OOM/Jetsam/FOOM/watchdog、运行时兜底边界。
- UIKit 性能:离屏渲染、圆角、阴影、mask、透明混合、
shouldRasterize、cell 复用、滚动掉帧、pre-main/+load/动态库启动拆解。 - 异步与线程:
NSError **、completion handler、GCD、NSOperation、NSURLSession、主线程 UI 更新、队列死锁、QoS 优先级反转、锁迁移、GCD 线程膨胀和atomic边界。 - 数据持久化:
NSUserDefaults滥用、Keychain 后台访问时机、文件目录与备份策略、原子写、NSCoding到NSSecureCoding、Core Data 跨线程和迁移失败兜底、SQLite/FMDB 线程安全与 WAL、离线缓存和数据迁移。 - Swift 混编:bridging header、module、生成的
-Swift.h、nullability、generics、NS_SWIFT_NAME、NS_REFINED_FOR_SWIFT。 - 构建系统与依赖:
project.pbxproj冲突、target/scheme 配置漂移、.xcconfig分层、CocoaPods/SPM 混用、静态库 category 符号裁剪、-ObjC/-force_load、闭源.a到xcframework、PCH/modulemap 和编译速度治理。 - 合规与废弃 API:
UIWebView→WKWebView、JS bridge 白名单、cookie/session、AddressBook→Contacts、ALAssetsLibrary→Photos/PHPicker、UIAlertView→UIAlertController、PrivacyInfo.xcprivacy、Required Reason API、ATT/IDFA、相册 Limited、精确定位、安全区、Dark Mode、Dynamic Type 和 iPad 多窗口。 - 重构安全网:characterization test、OCMock、快照测试、Massive ViewController 拆分、单例 façade/protocol 化和 notification typed payload 收敛。
- 安全审计:ATS 例外收敛、SSL pinning 设计与轮换、硬编码密钥扫描、WKWebView JS bridge 注入面、deep link、本地敏感数据和越狱检测。
- 推送与后台:APNs p8 token auth、device token 环境隔离、notification extension、静默推送、
beginBackgroundTask和BGTaskScheduler生命周期。 - 静态工具链:clang static analyzer /
xcodebuild analyze、Infer、OCLint、warning baseline、CI 分级门禁和误报处理。 - 诊断辅助:提供 Objective-C 风险巡检脚本,帮助快速发现需要人工 review 的代码线索。
- 新手安全层:当用户经验不明确或从零写功能时,默认采用保守 MVC + MVVM-lite 分层,避免 runtime/swizzling/manual KVO 等高风险方案。
这个仓库以 SKILL.md 作为统一入口,Codex 和 Claude Code 都可以读取。agents/openai.yaml 只用于 Codex/OpenAI UI 展示;Claude Code 会使用 SKILL.md、references/、scripts/ 和 assets/。
将仓库克隆到 Codex skills 目录:
mkdir -p "${CODEX_HOME:-$HOME/.codex}/skills"
git clone https://github.com/sun6762/objc-ios-maintenance.git "${CODEX_HOME:-$HOME/.codex}/skills/objc-ios-maintenance"在 Codex 中可通过 $objc-ios-maintenance 明确调用,也可以让 Codex 根据任务自动选择:
使用 $objc-ios-maintenance 审查这个 Objective-C 页面退出后不释放的问题。
使用 $objc-ios-maintenance 帮我优化这个 UITableView 滚动掉帧问题。
使用 $objc-ios-maintenance 从零写一个安全的 Objective-C + UIKit 列表页。
作为个人 skill 安装到 Claude Code:
mkdir -p ~/.claude/skills
git clone https://github.com/sun6762/objc-ios-maintenance.git ~/.claude/skills/objc-ios-maintenance也可以作为某个项目的 project skill 安装。若希望团队共享,推荐用 git submodule 提交到业务项目:
mkdir -p .claude/skills
git submodule add https://github.com/sun6762/objc-ios-maintenance.git .claude/skills/objc-ios-maintenance在 Claude Code 中可通过 /objc-ios-maintenance 明确调用,也可以直接描述任务让 Claude 自动选择:
/objc-ios-maintenance 审查这个 Objective-C 页面退出后不释放的问题。
/objc-ios-maintenance 帮我优化这个 UITableView 滚动掉帧问题。
/objc-ios-maintenance 从零写一个安全的 Objective-C + UIKit 列表页。
- 如果是审查、修复或重构旧 OC 项目,直接描述代码位置和问题现象。
- 如果是从零写 OC + UIKit 功能,说明页面类型、数据来源、是否已有 Masonry/SDWebImage 等项目依赖。
- 如果是处理本地数据问题,说明数据类型、存储位置、是否涉及账号切换/退出登录、升级迁移、离线可用或敏感数据。
- 如果要求 runtime 防崩溃兜底,需要同时提供崩溃日志、启用范围、灰度/回滚要求;该 Skill 默认不会把 runtime/swizzling 当作首选方案。
- Claude Code skills 官方说明见 Extend Claude with skills。
objc-ios-maintenance/
├── SKILL.md
├── agents/
│ └── openai.yaml # Codex/OpenAI UI 元数据;Claude Code 可忽略
├── scripts/
│ ├── scan_objc_risks.py
│ └── test_scan_objc_risks.py
├── references/
│ ├── beginner-uikit-architecture.md
│ ├── memory-ownership.md
│ ├── scrolling-performance.md
│ ├── uikit-rendering-performance.md
│ ├── crash-symbolication-metrickit.md
│ ├── build-system-dependencies.md
│ ├── refactoring-safety-net.md
│ ├── security-audit.md
│ ├── push-background.md
│ ├── static-analysis-toolchain.md
│ ├── compliance-adaptation.md
│ ├── dangling-pointer-diagnostics.md
│ ├── data-persistence.md
│ ├── oom-watchdog-diagnostics.md
│ ├── runtime-crash-guard.md
│ └── ...
├── assets/
│ ├── snippets/
│ │ └── webview/
│ └── templates/
└── evals/
└── evals.json
scripts/scan_objc_risks.py 可以对 Objective-C 项目做启发式风险扫描:
python3 scripts/scan_objc_risks.py /path/to/YourProject
python3 scripts/scan_objc_risks.py /path/to/YourProject --category rendering
python3 scripts/scan_objc_risks.py /path/to/YourProject --category build
python3 scripts/scan_objc_risks.py /path/to/YourProject --category compliance
python3 scripts/scan_objc_risks.py /path/to/YourProject --category persistence
python3 scripts/scan_objc_risks.py /path/to/YourProject --category runtime
python3 scripts/scan_objc_risks.py /path/to/YourProject --category security
python3 scripts/scan_objc_risks.py /path/to/YourProject --category background
python3 scripts/scan_objc_risks.py /path/to/YourProject --category toolchain
python3 scripts/scan_objc_risks.py /path/to/YourProject --min-level warning
python3 scripts/scan_objc_risks.py /path/to/YourProject --format json --max-findings 50注意:脚本输出是 review 线索,不是确定缺陷。每条命中都需要结合调用路径、生命周期、线程和业务语义人工判断。runtime 分类会重点提示 +load、KVC/KVO、swizzling/hook、消息转发链和 NSClassFromString 字符串类名。
assets/snippets/UIView+OCMPerformance.*:显式调用的 UIView 渲染性能辅助分类。assets/snippets/OCMWeakProxy.*:用于 timer / display link target 循环引用场景。assets/snippets/OCMCrashSafety.*:用于集合边界、JSON 类型收敛和主线程 UI 回调的显式 helper。assets/snippets/webview/:WKWebView 合规模板,包含页面级OCMWebView、factory、cookie coordinator、安全白名单和 weak script message delegate。assets/templates/beginner-uikit/:新手安全层的 Objective-C + UIKit 列表页模板,包含 Model、Service、ViewModel、Cell、ViewController。
复制模板到业务项目后,建议把 OCM 前缀替换为项目自己的前缀,避免 category 或类名冲突。
这个 Skill 默认优先修真实问题,不鼓励用“全局防崩溃分类”掩盖业务缺陷。
运行时兜底、method swizzling、集合 swizzling、KVO swizzling 属于非默认方案,只适合历史包袱项目的线上止血。使用前应具备崩溃日志、白名单、日志限频、灰度、远端开关和回滚方案。
野指针、内存破坏、OOM、Jetsam、FOOM、watchdog、C/C++ 崩溃不能依靠 Objective-C runtime guard 可靠兜底。
- 增加更多真实旧项目审查案例。
- 扩展静态扫描脚本的规则和输出格式。
本项目使用 MIT License。