iOS隐私合规扫描工具 ios‑privacy‑scanner 使用指南,解决App Store隐私清单审核拒审
简介
自从 Xcode15 开始,Apple 强化隐私合规审核,PrivacyInfo.xcprivacy 隐私清单成为iOS提审绕不开的环节。如果业务代码或者第三方SDK调用了需要原因说明的API,但没有在隐私清单中进行声明,提交App Store之后就会收到隐私相关拒审邮件,耽误版本上线进度。
ios‑privacy‑scanner 是一款开源的iOS隐私合规自查工具,可以支持源码工程扫描以及IPA二进制包扫描,用来检测隐私敏感API调用、缺失隐私清单、Info.plist权限描述缺失等各类合规风险。开发者可以在版本提审之前提前自查,降低App Store 5.1.1以及隐私清单相关的拒审概率。
工具核心能力:
- 扫描iOS源码工程,识别源码中隐私敏感API调用;
- IPA二进制扫描,检测静态库、闭源第三方SDK内部隐藏的隐私API调用;
- 检测项目缺失
PrivacyInfo.xcprivacy隐私清单文件; - 识别 Info.plist 权限描述缺失,例如相机、定位、相册权限说明遗漏;
- 输出结构化扫描报告,给出修复建议;
- CI流水线集成,打包阶段自动化隐私合规检查。
和Xcode自带隐私报告对比:Xcode隐私报告依赖Archive归档产物,而该工具既可以扫描源码,也可以直接扫描IPA包;针对闭源SDK,IPA二进制扫描才可以发现SDK内部隐藏的API调用风险。
环境准备
- 运行系统:macOS(依赖Xcode命令行工具otool、nm,Windows无法运行)
- 基础依赖:git、python3
- 安装Xcode命令行工具
bash
xcode-select --install
获取代码与安装依赖
# 克隆仓库到本地
git clone https://github.com/confuse-ios/ios-privacy-scanner.git
cd ios-privacy-scanner
# 安装python依赖包
pip3 install -r requirements.txt
工具使用方法
1、扫描iOS源码工程
扫描项目源码,检测业务代码里面的隐私API、权限描述缺失。
python3 scanner.py --project /Users/xxx/MyiOSApp
常用可选参数
--exclude Pods # 排除Pods目录,不扫描CocoaPods第三方库
--exclude Carthage # 排除Carthage目录
--output report.json # 将扫描结果输出为json文件
示例:扫描项目并且跳过Pods目录,输出json报告
python3 scanner.py --project /Users/xxx/MyiOSApp --exclude Pods --output source_scan_result.json
2、扫描IPA安装包(二进制扫描【非常重要】)
很多闭源静态SDK内部会调用隐私敏感API,业务层源码看不到调用,源码扫描无法捕获这类风险,必须使用IPA二进制扫描,这是大部分开发者隐私清单漏声明踩坑的根源。
先导出正式的IPA包,然后执行扫描命令:
python3 scanner.py --ipa ./output/MyApp.ipa --output ipa_scan_result.json
工具内部会自动解压IPA文件,读取Mach‑O可执行文件,解析符号表识别隐私相关API调用。
扫描结果解读
返回字段说明
字段 说明
api_name 识别出来的隐私敏感API名称
source 风险来源:source = 业务源码;binary = IPA二进制/第三方SDK库
file_path 文件路径,用于定位风险位置
risk_level 风险等级 high / mid / low;high级别的API必须在PrivacyInfo.xcprivacy进行声明
suggest 对应的修复建议
常见风险以及修复方案
1. High风险:检测到需要原因API,缺少隐私清单声明
修复方案:在项目的 PrivacyInfo.xcprivacy 文件中,补充对应的 NSPrivacyAccessedAPITypes 配置。哪怕该API来自第三方SDK,主App隐私清单同样必须填写。
2. Mid风险:Info.plist权限描述缺失
比如代码调用相机、定位,但是没有填写对应的NS开头权限说明字符串,上架审核会直接拒绝。
修复方案:在Info.plist中补全权限使用描述文案。
3. source为binary的风险记录
代表该隐私API调用来自闭源SDK,自己业务代码没有调用也必须声明,不能忽略该类告警。
PrivacyInfo.xcprivacy配置示例
扫描得到API类型之后,可以参考下面示例配置隐私清单:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>C617.1</string>
</array>
</dict>
</array>
</dict>
</plist>
CI持续集成接入
可以把ios‑privacy‑scanner集成进GitHub Actions / GitLab‑CI流水线,每次打包构建完成之后自动扫描IPA包。一旦扫描出high等级风险,流水线可以阻断打包,避免有隐私合规风险的版本直接提交App Store。
简单GitLab‑CI伪代码示例:
privacy_scan_job:
stage: scan
script:
- python3 scanner.py --ipa ./build/output.ipa --output ci_scan.json
artifacts:
reports:
json: ci_scan.json
常见踩坑总结
1. 只扫描源码,不扫描IPA二进制包:闭源SDK内部API调用无法被发现,仍然会隐私清单拒审;
2. 第三方SDK调用的隐私API,很多开发者误以为SDK内部自己的隐私清单就可以搞定。Apple规则:主App隐私清单才是审核重点,SDK隐私清单不能替代主App声明;
3. 每次更新第三方SDK版本之后建议重新跑一次扫描,SDK升级之后经常新增隐私API调用;
4. 该工具仅作为自查工具,不能保证100%规避App Store隐私审核问题,扫描结果仅供开发者自查参考,最终审核结果以苹果官方为准。
结束语
隐私清单相关拒审已经成为iOS开发者提审阶段非常高频的一类审核问题。借助 ios‑privacy‑scanner 在开发、打包阶段自动化自查,可以尽早发现闭源SDK带来的隐私API风险,减少上线之后反复被苹果退回的情况,提高iOS版本的提审效率。