Greenlight codescan深度解析:24条App Store拒绝风险规则如何检测Swift与React Native代码 Greenlight codescan深度解析24条App Store拒绝风险规则如何检测Swift与React Native代码【免费下载链接】greenlightPre-submission compliance scanner for the Apple App Store and Google Play. Scans code, privacy manifests, Android manifests, and IPA/APK/AAB binaries against the review guidelines. Offline, no account.项目地址: https://gitcode.com/gh_mirrors/greenlight2/greenlightGreenlight codescan是一个面向 App Store 与 Google Play 的提审前合规扫描工具它用 24 条规则扫描你的 Swift、Objective-C、React Native 与 Expo 源码提前找出最常见的 App Store 拒绝风险私钥硬编码、缺少 Sign in with Apple、占位文案等。全程离线运行无需 App Store Connect 账号中型项目扫描仅需数毫秒。本文带你完整拆解这套拒绝风险检测规则引擎的工作方式。一键扫描codescan 是什么、怎么跑codescan是 Greenlight 最核心的静态扫描层它遍历项目目录按扩展名识别 Swift / ObjC / TS / JS / plist / JSON 等文件类型scanner.go#L204-L235自动跳过node_modules、Pods、DerivedData、build等目录然后并行跑完全部规则。安装后一条命令即可brew install revylai/tap/greenlight # macOS greenlight codescan /path/to/your/project greenlight codescan . --format json # JSON 输出方便接入 CI扫描结果按四个等级输出types.go#L8-L13等级含义对 CI 的影响 CRITICAL几乎必然被拒拦截 HIGH大概率被拒拦截 WARN易引起审核员关注提示⚪ INFO最佳实践建议提示结论只有三种GREENLIT通过、NEEDS REVIEW需复核、NOT READY有 CRITICAL别提审。24 条拒绝风险规则全清单20 条通用规则定义在 rules.go#L10-L3104 条加密合规规则定义在 rules_crypto.go。每条规则都对应具体的 App 审核指南条款§ 编号报告里会逐条引用。 CRITICAL —— 6 条「必拒」规则规则 ID指南检测什么private-api§2.5.1私有 API 调用NSSelectorFromString(_...)、dlopen/dlsym等uiwebview-removed§2.5.1已弃用的UIWebView——苹果硬性拒绝项hardcoded-secrets§1.6硬编码密钥Stripesk_live_、AWSAKIA...、GitHubghp_...等格式external-payment-digital§3.1.1数字商品走 Stripe/PayPal 等外部支付应走 IAPdynamic-code-exec§2.5.2动态代码执行JSContext evaluateScript、运行时加载二进制crypto-mining§3.1.5设备端加密货币挖矿hash rate、mining pool、stratumtcp HIGH —— 5 条「高危」规则规则 ID指南检测什么account-no-delete§5.1.1有注册signUp/createUser却没有账号删除入口social-login-no-apple§4.8有 Google/Facebook 登录却没提供 Sign in with Appleiap-no-restore§3.1.1有 StoreKit/RevenueCat 内购却没有「恢复购买」missing-att§5.1.2集成了 Firebase/Amplitude/Adjust 等追踪 SDK 却没做 ATT 授权crypto-exchange-sdk§3.1.5(b)依赖 MoonPay/Transak/Ramp 等交易所/法币通道 SDK通常需许可证 WARN —— 11 条「建议修复」规则规则 ID指南检测什么platform-reference§2.3用户可见字符串中提及 Android / Google Play 等竞争平台placeholder-content§2.1占位文案lorem ipsum、coming soon、TODOhardcoded-ipv4§2.5硬编码 IPv4 地址IPv6-only 网络会失效http-not-https§1.6明文 HTTP 请求违反 App Transport Securitywebview-only§4.2纯 WebView 套壳应用vague-purpose-string§5.1.1Info.plist 权限说明含糊如 Camera access neededmissing-privacy-keys§5.1.1Info.plist 隐私 key 存在但值为空expo-config-check§2.1/2.3Expo 配置缺 bundleIdentifier、图标或应用名还是 My Appcrypto-wallet-org-account§3.1.5(b)加密钱包需组织账号发布ethers/viem/WalletCore 等 SDKcrypto-exchange-signals§3.1.5(b)文案出现「buy crypto」「on-ramp」等交易所信号词crypto-exchange-brand§3.1.5(b)引用 Coinbase/Binance 等已知交易所品牌域名或 SDK⚪ INFO —— 2 条「最佳实践」规则规则 ID指南检测什么console-log§2.1单文件超过 5 条console.log等调试日志export-compliance—未声明加密出口合规ITSAppUsesNonExemptEncryption每次上传都会被追问核心机制正则模式 全局反模式如何精准「抓漏网之鱼」24 条规则里最聪明的设计是处理「有 A 就该有 B」这类项目级事实如「能注册就必须能注销」。引擎用三步走scanner.go#L46-L113第一步全局反模式预扫描。像account-no-delete这类规则带有antiPatternsrules.go#L322-L323。扫描器先遍历整个项目只要任何文件里出现deleteAccount、closeAccount等删除入口代码该规则全局静默——因为「项目里有删除功能」是整体事实不该按文件逐个误报。第二步并行逐行匹配。每行代码跳过注释后依次匹配规则的patterns正则命中ignorePatterns的行则忽略。第三步项目级去重。标记firstMatchOnly的规则如缺 Sign in with Apple整项目只报一次避免同一问题在每个文件刷屏。React Native 项目的防误报设计React Native 项目尤其容易被误伤规则做了针对性收敛值得细看平台词检测只看字符串字面量。platform-reference只匹配引号/反引号包裹的Android ...文本rules.go#L169-L176并对Platform.OS分支、require(...)导入、react-native包路径等合法代码结构加了豁免ignorePatterns。否则每个 RN 应用的Platform.OS android判断都会误报。UIWebView 规则启用codeOnly模式。匹配前先剥掉字符串和注释rules.go#L378-L383代码注释里提一句 UIWebView 不会触发 CRITICAL。追踪 SDK 规则识别 RN 生态。missing-att的模式里专门覆盖analytics-react-native、segment/、expo-tracking-transparency等 RN 包名rules.go#L97-L104而iap-no-restore则同时认react-native-iap、RevenueCat、expo-in-app-purchases。加密规则锚定包标识符。钱包/交易所规则只匹配package.json中带引号的完整依赖名如wagmi/core、transak-react-native-sdk单词 sardine 或 web3modal 不会误触发rules_crypto.go#L44-L54。误报了怎么压两级豁免机制行内指令在误报行或其上一行注释// greenlight:ignore hardcoded-ipv4只豁免指定规则裸写// greenlight:ignore则豁免该行所有规则。解析逻辑见 rules.go#L464-L525并有严格的单测保证「注释里提到指令文本 ≠ 指令」rules_test.go#L26-L68。配置文件在项目根放.greenlight.yml可按规则 ID 关闭规则、调整严重级别、忽略路径config.gorules: hardcoded-ipv4: severity: info # 降级为 info platform-reference: enabled: false # 整条关闭 ignore: - vendor # 跳过目录 - *.generated.ts # 按文件名跳过Swift 原生项目这几条规则最扎心对 Swift / ObjC 工程CRITICAL 层基本覆盖「秒拒」场景私有 APINSSelectorFromString(_privateMethod)、performSelector加下划线方法名、dlopen全部会被点名硬编码密钥连 AWSAKIA前缀 16 位大写字母数字这类云厂商密钥格式都认识Info.plist 质量检查vague-purpose-string会抓 Camera access needed 这种一句话权限说明missing-privacy-keys会抓 key 写了但string/string为空的相机/麦克风/定位/蓝牙等 9 类隐私 keyrules.go#L543-L573出口合规Info.plist 或 Expo 配置里没有ITSAppUsesNonExemptEncryption声明每次上传都会被 App Store Connect 追问一轮。输出与 CI 门禁把拒绝风险挡在构建阶段codescan支持terminal/json/sarif三种输出internal/cli/codescan.go#L56-L59。SARIF 格式可直接上传到代码扫描平台让发现项出现在 Pull Request 的行内评论里。在 CI 里加一道门禁CRITICAL/HIGH 出现即失败不完整扫描同样会失败不会误报通过- name: App Store compliance gate run: greenlight preflight . --exit-code静态扫描的边界与下一步要诚实地说codescan 只能证明「功能代码存在」无法证明它能跑通——一个连了空实现的「Delete Account」按钮同样能通过扫描。这正是greenlight verify用云真机实际点击、验证账号删除 / 恢复购买 / Sign in with Apple 三条流程存在的意义特性声明检测逻辑见 claims.go。完整的提审前检查可一条命令跑完greenlight preflight . # 元数据 codescan 隐私清单 Play 策略 greenlight preflight . --exit-code # CI 门禁小结Greenlight codescan 用 24 条规则 约 60 个正则模式把 App 审核指南中最常见的拒绝理由变成了一次离线扫描全局反模式、行内豁免与.greenlight.yml三层机制把误报压到最低对 Swift 与 React Native 都有专门的收敛设计。下次提审前先让它跑一遍吧。【免费下载链接】greenlightPre-submission compliance scanner for the Apple App Store and Google Play. Scans code, privacy manifests, Android manifests, and IPA/APK/AAB binaries against the review guidelines. Offline, no account.项目地址: https://gitcode.com/gh_mirrors/greenlight2/greenlight创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考