Greenlight ipa命令全解析:直接解析IPA压缩包,深度检查Info.plist、隐私清单与200MB下载限制
【免费下载链接】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
Greenlight 是一款面向苹果 App Store 和谷歌 Play 的免费开源提审前合规扫描工具,其中的greenlight ipa命令可以直接解析 IPA 压缩包,深度检查 Info.plist 完整性、隐私清单(PrivacyInfo.xcprivacy)以及 200MB 蜂窝下载限制。整个过程完全离线、无需任何开发者账号、不上传任何文件——把 IPA 丢给它几秒钟就能拿到一份附苹果审核指南条款编号的"体检报告"。
为什么需要 IPA 二进制检查?
静态扫描源代码只能证明"功能存在",而 IPA 是最终提交给苹果审查的产物。很多被拒原因只会在打包后才暴露:
- 🔍 二进制 plist 与 XML plist 解析不一致导致的"假缺失"
- 📦 第三方 framework 忘记附带自己的隐私清单
- 📱 包体过大影响用户蜂窝下载转化
greenlight ipa就是专门盯住这一层的命令,核心实现位于 internal/ipa/inspect.go,CLI 层在 internal/cli/ipa.go。
快速上手:一条命令开始扫描
greenlight ipa /path/to/build.ipa命令会输出应用名称、包体大小,然后按严重级别分组展示发现项:
| 级别 | 含义 | 终端颜色 |
|---|---|---|
| 🔴 CRITICAL | 几乎必然被拒,提交前必须修复 | 红色加粗 |
| 🟡 WARN | 有较高被拒风险,建议修复 | 黄色 |
| ⚪ INFO | 最佳实践提示 | 灰色 |
结尾会给出明确的结论:GREENLIT(无 CRITICAL 问题)或NOT READY(仍有 N 个 CRITICAL 待修复),并附上耗时统计。
greenlight ipa build.ipa --format json # 输出 JSON,方便接入 CI 流水线深度解析 Info.plist:版本、名称与用途字符串
这是被拒的"重灾区",greenlight ipa对 Info.plist 做了真实解析(二进制格式和 XML 格式都支持,见 parsePlist 实现),而不是简单的字符串匹配:
- CFBundleVersion / CFBundleShortVersionString 缺失→ WARN(§2.1),构建号和版本号是硬性要求
- CFBundleDisplayName / CFBundleName 均未设置→ WARN(§2.3),应用没有显示名称
- ATS 全局关闭(
NSAllowsArbitraryLoads = true)→ WARN(§1.6),允许不安全 HTTP 连接,苹果可能要求书面说明 - 用途字符串(Purpose String)质量检查:命令会逐一检查 14 类用途描述键,包括相机、麦克风、相册、定位、蓝牙、Face ID、ATT 追踪、HealthKit 等(完整清单见 purposeStrings):
- 声明了但内容为空→ CRITICAL(§5.1.1),硬性拒绝
- 描述少于 15 个字符→ WARN(§5.1.1),苹果会拒绝含糊其辞的用途说明
💡 提示:"写具体的描述"比"写一句描述"重要,例如"拍照用于附加到客服工单"远好于"需要相机权限"。
隐私清单检查:2024 年 5 月后的硬门槛
自 2024 年 5 月起,App Store 要求所有应用提供PrivacyInfo.xcprivacy隐私清单,缺失会直接收到ITMS-91061拒绝。
① 清单是否存在
缺失 → CRITICAL(§5.1.1)。这是当前最常见的"低级"被拒原因之一。
② 清单内容是否完整(checkPrivacyManifest)
- 文件存在但内容为空→ WARN(§5.1.1)
- 缺少NSPrivacyTracking(是否追踪用户声明)→ WARN(§5.1.2)
- 缺少NSPrivacyAccessedAPITypes(Required Reason API 声明)→ WARN(§5.1.1)
- 未声明NSPrivacyCollectedDataTypes(收集的数据类型)→ INFO,建议与 App Store 隐私营养标签保持一致
③ 第三方 framework 逐一检查
命令会扫描 IPA 内所有*.framework,任何没自带隐私清单的框架都会被点名标记为 WARN,并提示你升级框架版本或联系供应商。
200MB 蜂窝下载限制:影响转化的隐形杀手
苹果规定:超过200MB的应用无法直接通过蜂窝网络下载,用户必须确认才能继续,转化率会明显下降。greenlight ipa内置了两档阈值(检查逻辑):
| 包体大小 | 级别 | 说明 |
|---|---|---|
| > 200MB | 🟡 WARN(§2.4) | 超出蜂窝下载限制,建议使用 On Demand Resources、应用瘦身或压缩资源 |
| 150~200MB | ⚪ INFO | 正在接近蜂窝限制,值得提前规划 |
需要注意:这里衡量的是压缩后的 IPA 整体大小,实际按设备"瘦身(thinning)"后的分片通常更小,所以把它当作上限参考即可。
图标与启动画面的检查细节
- 图标:既检查散装的
AppIcon*.png,也识别编译进Assets.car的现代图标(§2.3);完全找不到图标 → CRITICAL;图标只有一种尺寸 → WARN - 启动故事板:找不到
LaunchScreen/LaunchStoryboard→ WARN(§4.2),苹果要求使用启动故事板而非静态图 - IPA 结构:找不到
.appbundle → CRITICAL,说明这不是一个有效的分发构建
常见问题 FAQ
Q1:需要登录 App Store Connect 吗?不需要。greenlight ipa完全离线工作,不需要任何账号、不上传任何内容。
Q2:为什么它没有报"缺少某键"?因为它对二进制 plist 做了真正的解析(支持 bplist00 与 XML 双格式),早期字符串匹配方案在二进制 plist 上会静默失败、产生误报,这个问题已在 inspect_test.go 中有专门的回归测试。
Q3:能在 CI 中作为卡点吗?可以。用--format json输出结构化结果供流水线消费;若想在提交前把整个项目(源码 + 二进制)一起卡住,推荐组合使用:
greenlight preflight . --ipa build.ipa --exit-code总结:提交前多跑一次,少等一轮审核
greenlight ipa的价值在于在提交之前就把二进制层面的被拒风险暴露出来:Info.plist 缺键、用途字符串含糊、隐私清单缺失、framework 隐私清单遗漏、包体超限……每一项发现都附带对应的苹果审核指南条款和具体修复建议。作为开源项目(MIT 协议),你可以直接安装使用,也可以从 cmd/greenlight/main.go 编译自己的二进制,并参考 Makefile 的build目标完成构建。
一句话记住:Know before you submit——先扫描,再提交。
【免费下载链接】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),仅供参考