Skip to content

解决ITMS-91053缺失API声明错误

问题说明

当向App Store Connect提交应用时,您可能收到如下警告信息:

ITMS-91053:缺失API声明
您的应用在"Test"文件中引用了需要声明原因的API,涉及以下API类别:NSPrivacyAccessedAPICategoryFileTimestamp
......
(其他类似警告)

虽然当前提交成功,但从2024年5月1日起,所有新应用或更新必须解决此问题才能通过审核。此错误表明您的应用使用了苹果的敏感API但未在隐私清单文件中声明使用原因。

注意

此问题源于苹果新隐私政策,要求开发者对特定API的使用进行透明化声明,防止设备指纹识别

完整解决方案

步骤1:创建隐私清单文件

  1. 在Xcode中打开项目
  2. 选择 File > New > File...
  3. 在资源(Resource)部分选择 App Privacy 文件类型
  4. 命名文件为 PrivacyInfo.xcprivacy(必须使用此名称)
  5. 确保勾选应用的主目标Target
  6. 点击 Create

验证

创建后确认文件已在项目导航器中显示,位置建议与Info.plist同级以便管理

步骤2:配置API声明

打开PrivacyInfo.xcprivacy文件,添加以下结构化内容(根据实际使用的API类别调整):

<code-group> <code-block title="XML格式"> ```xml <?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> <dict> <key>NSPrivacyAccessedAPIType</key> <string>NSPrivacyAccessedAPICategorySystemBootTime</string> <key>NSPrivacyAccessedAPITypeReasons</key> <array> <string>35F9.1</string> </array> </dict> <dict> <key>NSPrivacyAccessedAPIType</key> <string>NSPrivacyAccessedAPICategoryDiskSpace</string> <key>NSPrivacyAccessedAPITypeReasons</key> <array> <string>E174.1</string> </array> </dict> <dict> <key>NSPrivacyAccessedAPIType</key> <string>NSPrivacyAccessedAPICategoryUserDefaults</string> <key>NSPrivacyAccessedAPITypeReasons</key> <array> <string>CA92.1</string> </array> </dict> </array> </dict> </plist> ``` </code-block> <code-block title="属性列表视图"> ```properties NSPrivacyAccessedAPITypes = 数组 → 项目1: 字典 → NSPrivacyAccessedAPIType = "NSPrivacyAccessedAPICategoryFileTimestamp" NSPrivacyAccessedAPITypeReasons = 数组 → "C617.1" 项目2: 字典 → NSPrivacyAccessedAPIType = "NSPrivacyAccessedAPICategorySystemBootTime" NSPrivacyAccessedAPITypeReasons = 数组 → "35F9.1" 项目3: 字典 → NSPrivacyAccessedAPIType = "NSPrivacyAccessedAPICategoryDiskSpace" NSPrivacyAccessedAPITypeReasons = 数组 → "E174.1" 项目4: 字典 → NSPrivacyAccessedAPIType = "NSPrivacyAccessedAPICategoryUserDefaults" NSPrivacyAccessedAPITypeReasons = 数组 → "CA92.1" ``` </code-block> </code-group>

步骤3:设置正确的目标成员资格

关键步骤

文件创建后必须设置正确的Target Membership:

  1. Xcode中选中PrivacyInfo.xcprivacy文件
  2. 在右侧Inspector面板中
  3. 勾选应用主目标(如果需要扩展,为每个扩展单独添加此文件)
  4. 确保文件在构建阶段被包含

跨平台框架特别指南

Flutter项目

  1. 创建路径:/ios/Runner/PrivacyInfo.xcprivacy
  2. 内容与上述XML示例相同
  3. 无需额外配置,Xcode会自动识别

Xamarin/MAUI项目

  1. 创建PrivacyInfo.xcprivacy文件
  2. 在.csproj文件中添加声明:
xml
<ItemGroup>
    <BundleResource Include="PrivacyInfo.xcprivacy" />
</ItemGroup>

React Native/Expo

  1. 在app.json中添加配置:
json
"ios": {
  "privacyManifests”: {
    "NSPrivacyAccessedAPITypes": [
      {
        "NSPrivacyAccessedAPIType": "NSPrivacyAccessedAPICategoryUserDefaults",
        "NSPrivacyAccessedAPITypeReasons": [ "CA92.1" ]
      }
    ]
  }
}
  1. 更新所有依赖:
bash
npx expo install --fix

疑难排解指南

第三方库导致的错误

即使您已添加隐私声明,第三方库缺失声明仍会导致错误:

  1. 更新所有依赖到最新版本(支持隐私清单的版本)
  2. 对于不再维护的库:
    • 从库的GitHub获取其PrivacyInfo.xcprivacy
    • 手动添加到项目
    • 设置Target为库名而非应用目标

原因代码选择指南

重要

切勿直接复制他人原因代码!必须根据实际用途选择官方批准的代码:

  1. 访问 苹果官方API原因文档
  2. 根据API功能类别查找匹配原因
  3. 常见原因代码对应表:
API类别合法用途原因代码
UserDefaults存储用户设置CA92.1
FileTimestamp文件修改时间检查C617.1
DiskSpace检查存储空间E174.1
SystemBootTime性能监控35F9.1

验证配置

  1. 生成归档文件(Product > Archive)
  2. 打开Xcode Organizer
  3. 右键选择生成的archive文件
  4. 选择 Generate Privacy Report
  5. 验证所有API已正确声明

扩展注意事项

  1. 应用扩展(App Extensions):每个扩展都需要独立的PrivacyInfo.xcprivacy文件
  2. 多平台项目:为iOS、iPadOS、macOS等目标分别添加
  3. API使用审核:定期使用Xcode的API扫描工具(位于项目设置的Build Phases)

最佳实践

  • 在开发早期添加隐私清单文件
  • 使用依赖管理工具检查第三方隐私声明(如CocoaPods)
  • 每次添加新API后更新声明
  • 使用脚本自动验证合规性

官方参考资源