mcpField
A
app-store-review

app-store-review

github.com/safaiyeh测试与质量4061.6k 次安装2 周前更新
代码仓库

关于 app-store-review

app-store-review 是一项技能,用于依据 Apple App Store Review Guidelines 检查 Swift、Objective-C、React Native 和 Expo 应用。它按指南章节和风险整理说明,并提供清单与示例,支持提交前审查及功能审计。

主要功能

  1. 01覆盖 Apple 指南各章节
  2. 02按风险整理拒审模式
  3. 03提供 Swift 和 React Native 示例
  4. 04提交前合规检查清单
  5. 05隐私、支付与安全审查

适用场景

  1. 01提交 App Store 前审计应用
  2. 02审查支付或隐私相关改动
  3. 03评估用户生成内容的安全要求

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/safaiyeh/app-store-review-skill --skill app-store-review

安装后在 Claude Code 中输入/app-store-review确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

LICENSE
metadata.json
README.md
.gitignore
.agents/plugins/
marketplace.json
.claude-plugin/
marketplace.json
plugin.json
.codex-plugin/
plugin.json
.github/ISSUE_TEMPLATE/
skill-feedback.yml
agents/
openai.yaml
rules/
4-design.md
3-business.md
1-safety.md
5-legal.md
2-performance.md

详细介绍

App Store 审核指南检查器

全面介绍如何依据 Apple 的 App Store 审核指南评估 iOS、macOS、tvOS、watchOS 和 visionOS 应用代码。本技能涵盖每一条指南要点,以便在提交前识别可能导致拒审的问题。

支持: Swift、Objective-C、React Native 和 Expo 应用

指南更新至: Apple 于 2026 年 10 月 16 日更新的 App 审核指南,并已根据当前英文版指南核实。内容包括 AI 内容创作和防范未经同意的私密影像(1.2)、创意素材(2.3.14)、隐藏功能(2.5.19)、修订后的购买链接权限(3.1.1(a))以及替代分发执行规则(5)。还涵盖社交媒体年龄分级问题、韩国年龄分级变更,以及巴西/欧盟的替代支付和分发条款。

适用场景

在以下情况下使用本技能:

  • 为向 App Store 提交应用做准备
  • 检查代码是否存在合规问题
  • 实现可能引发审核关注的功能
  • 审查现有应用是否违反指南
  • 构建涉及支付、用户数据或敏感内容的功能

指南章节

请阅读各项规则文件,了解详细说明、检查清单和代码示例:

章节文件主要主题
1. 安全rules/1-safety.md不当内容、UGC 和 AI 内容安全措施、儿童类别、人身伤害、数据安全
2. 性能rules/2-performance.md应用完整性、元数据和创意素材、硬件兼容性、软件要求、隐藏功能
3. 商业rules/3-business.mdApp 内购买、订阅、加密货币、其他商业模式
4. 设计rules/4-design.md仿冒应用、最低功能要求、垃圾应用、扩展、Apple 服务、登录
5. 法律rules/5-legal.md隐私、数据收集、知识产权、赌博、VPN、MDM、开发者行为准则

各类别风险等级

风险等级类别章节常见拒审原因
严重隐私与数据5.1缺少隐私政策、未经授权收集数据
严重支付3.1规避 App 内购买、定价不明确
高安全1.x不当内容、UGC 审核不足
高性能2.x崩溃、功能不完整、已弃用的 API
中设计4.x仿冒应用、未达到最低功能要求
中法律5.x侵犯知识产权、未获许可的赌博活动

快速参考:高风险拒审模式

对于 ATT 检查结果,请核实 SDK 的配置和实际数据用途。对于账户删除,请核实目标位置和流程。对于日志记录,请检查暴露的数据及其是否经过脱敏。如果无法获得这些证据,应指出需要核实的事项,而不要仅凭一次 API 调用、SDK 导入或 URL 就判定会被拒审。

对于支付,请先确认商店门店、平台和适用的例外,再标记外部链接或结账行为(参见 3.1.1(a) 和 3.1.3)。

严重问题(立即拒审)

Swift:

// 🔴 Private API usage
let selector = NSSelectorFromString("_privateMethod")

// 🔴 Hardcoded secrets
let apiKey = "sk_live_xxxxx"

// 🔴 External payment for digital goods where IAP is required
func purchaseDigitalContent() {
    openStripeCheckout() // Use StoreKit instead
}

React Native / Expo:

// 🔴 Hardcoded secrets in JS bundle
const API_KEY = 'sk_live_xxxxx'; // REJECTION

// 🔴 External payment for digital goods where IAP is required
Linking.openURL('https://stripe.com/checkout'); // Use react-native-iap

// 🔴 Dynamic code execution
eval(downloadedCode); // REJECTION

// 🔴 Major feature changes via CodePush/expo-updates
// OTA updates for bug fixes only, not new features!
高风险问题

Swift:

// 🟡 Starting Apple-defined tracking without ATT authorization
// Illustrative helper: links user data across companies for ad targeting
enableCrossCompanyAdTracking() // Called before ATT authorization

// 🟡 Account creation without deletion
func createAccount() { } // But no way to initiate deletion in the app

React Native / Expo:

// 🟡 Starting Apple-defined tracking without ATT authorization
// Illustrative helper: SDK links user data across companies for ad targeting
initializeTrackingAdSDK(); // Called before ATT authorization

// ✅ First-party analytics alone does not require ATT
// Assumes no IDFA access, cross-company advertising use, or data broker sharing
import analytics from '@react-native-firebase/analytics';
analytics().logEvent('event');

// 🟡 Delete Account button opens instructions with no deletion flow
Linking.openURL('https://example.com/help'); // Verified instructions-only page
// ✅ An in-app button may link directly to a page that completes deletion
Linking.openURL('https://example.com/delete-account');

// 🟡 Sensitive data exposed in production logs (1.6 / 5.1)
console.log('Access token:', accessToken); // Remove the secret or redact it

// 🟡 Social login without a privacy-preserving alternative (4.8)
<GoogleSigninButton /> // Also offer a login meeting 4.8 criteria
                       // (Sign in with Apple is the simplest option)

// 🟡 Pre-permission button that asks for the grant (5.1.1(iv))
<Button title="Enable Location" onPress={requestLocation} /> // Use "Continue" or "Next"

// 🟡 UGC terms checkbox pre-checked, or no terms before sign-up/login (1.2)
const [agreed, setAgreed] = useState(true); // Start unchecked; gate sign-up on it

// 🟡 "Free" in screenshots, including text in the captured app screen (2.3.7)
<Text>Get Started (Free)</Text> // Pricing information when shown in a screenshot

// 🟡 Custom review prompts (5.6.1)
showCustomAlert('Rate us 5 stars!'); // Use StoreReview.requestReview()
中风险问题
// 🟠 Vague purpose strings in Info.plist
"This app needs camera access" // Be specific!

// 🟠 WebView-only app (insufficient native functionality)
const App = () => <WebView source={{ uri: 'https://site.com' }} />;

// 🟠 References to Android in iOS app
const text = "Also available on Android"; // REJECTION

提交前检查清单

隐私(第 5.1 节)
  • 在 App Store Connect 中提供隐私政策链接
  • 在 App 内提供可访问的隐私政策链接
  • 所有用途说明均具体且准确
  • 在 App Store Connect 中填写 App 隐私详情
  • 在进行 Apple 定义的跟踪或访问 IDFA 之前获取 ATT 授权(参见 5.1.2);仅使用第一方分析时无需 ATT
  • 如果 App 支持创建账户,用户可以在 App 内发起删除;也可以提供直接链接,以便用户在网站上完成删除
  • 数据最小化——仅请求必要的权限
  • 权限提示前的自定义屏幕只能有一个按钮,使用中性标签(例如“继续”或“下一步”),点击后打开系统提示;不得使用“允许”或“启用”等措辞,也不得提供“取消”或“关闭”操作(参见 5.1.1(iv))
  • 在收集数据前获得用户同意
付款(第 3.1 节)
  • 数字商品购买使用 StoreKit,除非适用的店面、授权资格或 3.1.3 例外允许使用其他方式
  • 实现恢复购买功能
  • 清晰显示订阅条款
  • 如适用,披露战利品箱的概率
  • 购买链接指向适用地区条款(3.1.1(a))允许的目的地;美国店面链接无需授权资格
  • 积分/货币不会过期
安全(第 1.x 节)
  • 不包含令人反感的内容
  • UGC 和 AI 内容创作类 App 实施审核机制(过滤、举报、屏蔽、联系),包括创作/生成流程(参见 1.2)
  • 主动采取保护措施,防止并移除未经同意的私密影像,包括 AI 生成的影像
  • 能够快速移除违反规定的 UGC,并制定补救计划
  • UGC:用户在注册/登录前同意条款(EULA),其中声明对令人反感的内容和滥用行为的用户采取零容忍政策;同意方式须为未勾选的复选框或明确按钮,且应出现在新用户全新安装后看到的流程中(参见 1.2)
  • UGC:在 24 小时内处理举报,移除相关内容并移除违规用户
  • UGC:屏蔽操作会通知开发者,并立即从信息流中移除被屏蔽用户的内容
  • UGC:如 App Review 要求,提供实体设备的屏幕录制,展示用户在注册/登录前同意条款、标记内容和屏蔽用户的操作;如被要求,请在今后的提交备注中附上
  • 为儿童和青少年提供符合其年龄的 App 内体验
  • 儿童类别 App 设有家长验证机制
  • 不包含虚假信息或恶作剧功能
  • 如适用,提供医疗免责声明
  • 不宣扬物质滥用
性能(第 2.x 节)
  • 已回答年龄评级问卷中的社交媒体功能问题(自 2026 年 9 月起,提交时必须回答;带有社交动态的 App 会获得“社交媒体”描述符和“时间限额”类别)
  • 没有崩溃或错误
  • 已在 iPhone 和 iPad 上测试——截至 2026 年 8 月,App Review 目前使用 iPad Air 11-inch(M3)和 iPhone 17 Pro Max 进行审核
  • 所有功能均已完成且可正常使用
  • 没有占位内容
  • 在“审核备注”中具体描述新功能、功能特性和产品变更,并确保审核人员可以使用(2.3.1)
  • 没有隐藏、休眠或未记录的功能,包括在审核期间隐藏、获批后启用的功能(参见 2.5.19)
  • 产品页面页眉和搜索结果中的创意素材符合 2.3.14
  • App 名称、副标题、关键词、屏幕截图或预览中没有“免费”等价格相关词语,包括截取的 App 屏幕内的文字(参见 2.3.7)
  • 已测试 IPv6,且功能正常
  • 如有需要,已提供演示账号
  • 仅使用公共 API
  • 没有使用已弃用的 API
  • 正确使用后台模式
设计(第 4.x 节)
  • 具有足够的原生功能(不只是网页封装)
  • 不存在抄袭问题
  • App 名称和品牌具有原创性
  • 没有重复 Bundle ID 垃圾 App,也没有低质量的热门类别克隆 App
  • 不将实时活动、推送通知和 Game Center 用于垃圾信息、网络钓鱼或未经请求的消息
  • 扩展符合指南
  • 使用社交登录时提供其他登录方式
  • 不将内置功能用于盈利
法律(第 5.x 节)
  • 没有助长人口贩运或剥削儿童的内容或功能;第 5 节要求从 App Store 下架,并禁止通过替代方式分发
  • 没有未经授权的第三方内容
  • 正确使用 Apple 商标
  • 如适用,持有赌博许可证(并实施真实的基于位置的地理限制)
  • VPN 使用 NEVPNManager API
  • 符合 COPPA/GDPR 对儿童的要求
  • 仅使用系统 API 请求评价(不使用自定义提示)
  • 不操纵评价、排行榜、搜索结果或推荐(5.6)

报告技能问题(反馈)

这项技能会通过用户报告不断改进。如果你在会话中发现这项技能未能帮助用户,每个会话只需一次,询问用户是否愿意向维护者报告。

发现以下任一情况时,请提供反馈。 使用对应的类别名称——它会出现在问题标题中,格式为 [Feedback] <category>: <short description>。

准确性

  • 误报 — 技能将实际合规的代码标记为违规(指导过于激进)
  • 漏报 — 技能审查过用户的应用,但没有指出问题,而应用因此被拒绝
  • 引用错误 — 问题确实存在,但归到了错误的指南章节,或风险等级标错
  • 过时 — 此处规则与 Apple 当前发布的指南相矛盾

实用性

  • 噪声过多 — 大量低价值或重复的发现淹没了真正重要的问题
  • 无法采取行动 — 发现中缺少必要的细节、代码引用或具体修复方案
  • 修复方案不当 — 建议的修复有误、已弃用、无法奏效,或本身也会被拒绝(包括 Swift 与 React Native/Expo 的具体差异)

覆盖范围

  • 规则缺失 — 技能未涵盖某种审查情境、API 或特定应用商店的要求(欧盟、巴西、韩国、美国等)
  • 自相矛盾 — 技能的两个部分相互矛盾

较轻微的信号也算。 如果用户反复忽略同一类发现、否决技能的建议且事后证明用户是对的,或明显绕过某项检查清单内容,这些都值得询问是否要提交反馈——细微的不便与错误规则同样有价值。

同意规则——全部为强制要求,不得例外:

  1. 先询问。 可以这样说:“这看起来像是 app-store-review 技能本身存在疏漏。要我起草一个 GitHub 问题,让维护者修复吗?”如果用户拒绝,本次会话中不要再提。
  2. 展示完整草稿(准确的标题和正文),然后才能发送。
  3. 绝不包含用户的代码、应用名称、Bundle ID、文件路径、凭据或专有细节。 报告针对的是这项技能的规则,而非用户的应用。只有用户明确将此类细节写入草稿时,才可包含。
  4. 只有在用户批准确切文本后才能发送,使用 gh issue create --repo safaiyeh/app-store-review-skill --title "..." --body "..."。如果 gh 不可用或未通过身份验证,请提供此链接,供用户自行提交:https://github.com/safaiyeh/app-store-review-skill/issues/new?template=skill-feedback.yml
  5. 绝不静默、自动或作为其他任务的副作用发送反馈。 用户拒绝授权即表示不同意——不要重试,也不要改用其他方式。

问题内容: 技能版本(来自上方的 frontmatter)、反馈类别、涉及的规则章节(例如“3.1.1”)、技能说了什么或做了什么、原本应当如何处理,以及今天的日期。除非用户自行补充,否则不得包含其他内容。

参考资料

评论

支持 Markdown