跳到正文

← 全部工具

给 iOS 和 Mac 开发者的免费工具

需声明理由 API 扫描

选择 Xcode 项目文件夹或粘贴代码,本页会按类别找出用到苹果“需声明理由 API”的代码行,附文件名和行号。然后读取你的 PrivacyInfo.xcprivacy,指出哪些类别用到了却没声明,并按你勾选的理由代码写出缺少的 NSPrivacyAccessedAPITypes 条目。代码只在本页读取,不会上传。

把 Xcode 项目文件夹拖到这里

也可以选择文件夹或部分文件。Swift、Objective-C 和 C 文件(.swift .m .mm .c .h)以及 PrivacyInfo.xcprivacy 只在本页读取,不会上传。

第三方 SDK(来自 CocoaPods、Swift Package Manager 或 Carthage)必须自带隐私清单,你的 App 的清单不涵盖它们的代码。

这是文本搜索。它可能漏掉某些使用(运行时拼出的调用、库里的包装函数),也可能标出其实不是使用的行。请逐条看过再决定。

API 名称和理由代码摘自苹果官方文档,核对日期 2026-11-01。

它能做什么

  • •读取你所选文件夹或文件里的 .swift、.m、.mm、.c 和 .h 文件,或你粘贴的代码。跳过 Pods、.build、DerivedData 和 Carthage 文件夹,以及超过 1 MB 的源文件。
  • •按 Swift 和 Objective-C 两种写法查找苹果列表里的每个 API:UserDefaults 和 NSUserDefaults、.creationDate 和 NSFileCreationDate、systemUptime、mach_absolute_time()、stat()、statfs()、volumeAvailableCapacityKey、activeInputModes 等。列表和理由代码摘自苹果官方文档,核对日期 2026 年 11 月 1 日。
  • •忽略注释和字符串字面量里的内容,注释掉的调用或日志文字不算。Swift 字符串插值里的代码算。
  • •每处结果都显示文件、行号和该行代码,按苹果的五个类别分组。getattrlist、fgetattrlist 和 getattrlistat 和苹果页面一样,同时归入文件时间戳和磁盘空间。
  • •读取找到的每个 PrivacyInfo.xcprivacy(或你粘贴的那份),把每个类别分为:用到且已声明、用到但未声明、声明了但没看到。
  • •对每个缺少的类别,列出苹果认可的理由代码和苹果原文说明。你勾选属实的那些,本页写出 XML 条目供你复制。

它做不到的事

  • •它不替你选理由代码。只有你知道代码为什么读取时钟或磁盘,每个代码允许什么以苹果原文为准。
  • •它不检查第三方 SDK。每个 SDK 必须在自己的 bundle 里自带隐私清单。
  • •它不读取编译后的代码。文本搜索可能漏掉某些使用(经由库调用或运行时拼出的调用),也可能标出不是使用的行,比如照片框架的 PHAsset.creationDate。
  • •它看不到藏在其他接口后面的使用。比如 SwiftUI 的 @AppStorage 实际把值存进 UserDefaults(在苹果的列表里),但扫描不会标出它。如果你用了它,请声明 User defaults 的理由。
  • •它不修改你的文件。条目需要你自己复制进清单,或在隐私清单生成器里生成完整文件。
  • •它不读取二进制格式的属性列表,请先用 plutil -convert xml1 转换。

常见问题

什么是需声明理由的 API?
苹果认为可能被滥用来识别设备指纹的一批 API:文件时间戳、系统启动时间、磁盘空间、已启用的键盘和 UserDefaults。苹果说明自 2024 年 5 月 1 日起,用了这些 API 却没在隐私清单里说明理由的 App,App Store Connect 不再接受。
我收到了 ITMS-91053“Missing API declaration”,这个工具能找到原因吗?
它能找到你自己源代码里的使用,以及要声明的类别名称。邮件里写的是苹果在二进制里发现的类别;如果扫描没看到它,多半是用在第三方 SDK 里,需要升级到自带隐私清单的版本。
UserDefaults 该选哪个理由?
只有你的 App 自己读写自己的设置,用 CA92.1。与扩展或同一 App Group 里的 App 共享,用 1C8F.1。C56D.1 只给包装 UserDefaults 的第三方 SDK 用;AC6B.1 用于 MDM 托管配置和反馈键。
为什么注释里的调用没有被列出来?
注释和引号里的文字不是会运行的代码,所以不算。Swift 字符串插值里的代码,比如 \(UserDefaults.standard.bool(forKey: "x")),是真正的代码,会被列出来。
我的代码会被上传吗?
不会。浏览器读取你选择的文件,搜索在本页进行,不会发送到任何服务器,关闭标签页即丢弃。
清单里声明了某个类别,但扫描没看到,要删掉吗?
确定不用了再删。它可能用在你没选的文件、别的 target,或文本搜索看不到的代码里。ITMS-91053 邮件针对的是用到了却没写进清单的类别。

用到这个工具的指南

相关