mufeng-ios-release-auditlisted
Install: claude install-skill ichangyou/mf-ai-skills
# iOS App Store 完整发布审计
对着代码库逐项核验,输出 pass/fail 表格。**全程只读,不改代码**——发现问题先报告根因和修复方案,等用户批准再动手。
## 来源
清单的每一项都来自真实事故或真实审查,不是通用最佳实践的罗列:
| 会话 | 项目 | 产出的教训 |
|---|---|---|
| 2026-07-09 | SpeechNote | **Guideline 3.1.2 反复拒审**:Terms 只是 App 内本地文本页,没有网址,导致商店页描述里没有可点 EULA 链接 |
| 2026-07-12 上午 | ShotZen | 上线前审查:版本号 1.1.1 与素材 1.2.0 不符;CoreData `fatalError` 启动崩溃隐患 |
| 2026-07-12 晚 | ShotZen | 商店文案四语;简中名称必须锁定备案名 |
| 2026-07-12 深夜 | ShotZen | 定价:`.lproj` 里 3 条硬编码旧价死字符串;静态截图印死价格风险 |
| — | Creem | 支付通道审核拒因:Terms 必须明确禁止 NSFW 内容——URL 可达不等于内容达标 |
## 前置
确认在 iOS repo 根目录(有 `*.xcodeproj`)。所有文件枚举**一律用 `git ls-files`**——`find` 会命中 `build/`、`.build/DerivedData/` 里的构建产物副本,导致同一语言重复统计、结果失真(已踩过)。
---
## 1. 权限说明文案
两种存放位置,**都要查**,查空了不等于 FAIL:
```bash
# (a) GENERATE_INFOPLIST_FILE = YES 的项目,文案在 pbxproj 里(ShotZen 是这种)
grep -oE "INFOPLIST_KEY_NS[A-Za-z]*UsageDescription = [^;]*;" *.xcodeproj/project.pbxproj | sort -u
# (b) 有独立 Info.plist 的项目(SpeechNote 是这种,(a) 会返回空)
grep -A1 "UsageDescription" $(git ls-files "*Info.plist" | head -1)
```
(a) 返回空只说明项目用的是 (b),别误判成"没有权限文案"。
**判定**:代码里实际请求的每种权限都要有对应文案;文案说清**为什么要**和**数据去哪**,不能只写 "需要相册权限"。
参考达标写法(ShotZen):"ShotZen reads your screenshots to organize them with on-device AI. Photos never leave your device."
顺带查出口合规声明,缺了每次提交都要手填加密问卷:
```bash
grep -o "ITSAppUsesNonExemptEncryption[^;]*;" *.xcodeproj/project.pbxproj | sort -u
```
## 2. 托管的条款/EULA URL
**这是唯一一次真实 App Store 拒审的位置,优先级最高。**
3.1.2 要求:有自动续订/内购的 App,**商店页描述(Description)字段**里必须有可点击的 Terms of Use (EULA)