跳至内容
WebViewGold 从 Vibe Coding 到 App Store
中文
获取 WebViewGold

App Store Connect 错误

ITMS-91053 "Missing API declaration":为您的 Web 封装 iOS 应用添加隐私清单

ITMS-91053 不是 App Review 的裁决,而是 App Store Connect 在告诉您:构建版本中的原生代码使用了某个 API,Apple 希望您在隐私清单(PrivacyInfo.xcprivacy)中说明使用理由。修复方法是一个小小的属性列表,填上如实的原因代码,或者换用更新的 SDK 版本;您的 Web 应用完全不需要改动。

每个平台一次性 $109 起,或由我们的团队全程代劳,$698 起。

  • 审核通过保证 – 否则 14 天内退款
  • 无需编程
  • 一次性付费,免费更新
  • 7×24 小时人工支持
  • 2014 年起德国出品 · ISO 27001

这封邮件的含义

Apple 维护着一份“需声明原因的 API”(required reason API)清单:这些系统调用对正常的应用功能很有用,但也可能被滥用来识别设备指纹。它们分为五个类别:文件时间戳、系统启动时间、磁盘空间、活动键盘和用户默认设置(user defaults)。任何使用它们的应用或 SDK,都必须在隐私清单中从一组固定的已批准原因里选择,说明为什么使用。

邮件会写明两件事:其代码使用了该 API 的文件(您应用的主可执行文件,或 Frameworks 文件夹中的某个框架),以及 API 类别,写法类似 NSPrivacyAccessedAPICategoryUserDefaults。2024 年初,这类邮件还只是提醒;根据Apple 关于需声明原因 API 的文档,自 2024 年 5 月 1 日起,缺少这些声明的上传已不再被接受。这就是为什么旧论坛帖子说它“只是个警告”,而您收到的却不是。

Web 封装应用触发它的是原生外壳,绝不是您的 JavaScript。每个 iOS 应用都会在 user defaults 中存储设置、缓存文件并计时,推送、广告和分析 SDK 也一样。它通常在这些时候出现:您添加了一个 SDK,您让 Cursor 或 Claude Code 编写了自定义 Swift 代码,或者您用当前版本的 Xcode 重新构建了一个旧项目。

四个经常结伴出现的上传错误

代码App Store Connect 的意思(转述)修复方法
ITMS-91053 Missing API declaration所指文件中的代码使用了需声明原因的 API,而该 bundle 中没有任何隐私清单为它声明原因。在包含该代码的 bundle 的清单中添加该类别和一个已批准的原因。如果该文件是第三方框架,请改为更新 SDK。
ITMS-91061 Missing privacy manifest构建版本中包含 Apple 常用 SDK 列表里的某个 SDK,但它没有自带隐私清单。把该 SDK 更新到附带清单的版本。该列表包括 Firebase 组件、OneSignal 和 Facebook SDK 框架等众多 SDK。
ITMS-91065 Missing signature列表中的某个 SDK 以二进制依赖的形式被包含,但缺少供应商的代码签名。使用供应商发布的已签名版本。不要编辑框架内部的文件,那会破坏签名。
ITMS-91056 Invalid privacy manifest存在 PrivacyInfo.xcprivacy 文件,但其中的键、值或结构有误。在 Xcode 的属性列表编辑器中打开它,把其中的键与下方示例逐一对照,删除拼写错误或自行编造的原因代码。

五个类别,以及 WebView 应用如实的原因

只选择真正描述代码行为的原因。Apple 的原因列表为每个原因都附加了条件,例如数据绝不离开设备。

邮件中的类别已批准的原因(Apple)WebViewGold 应用的常见选择
NSPrivacyAccessedAPICategoryUserDefaultsCA92.1 仅本应用读写的数据;1C8F.1 在您的 App Group 内共享;C56D.1 SDK 封装(仅限 SDK);AC6B.1 通过 MDM 下发的托管配置CA92.1。只有当应用通过 App Group 与扩展共享设置时(推送服务扩展、小组件、共享扩展),才添加 1C8F.1。
NSPrivacyAccessedAPICategoryFileTimestampC617.1 应用或 App Group 容器内的文件;DDA9.1 向用户显示的时间戳;3B52.1 用户选择的文件;0A2A.1 SDK 封装(仅限 SDK)C617.1,用于应用容器内的缓存和下载文件。只有当代码读取用户所选文件的元数据时,才使用 3B52.1。
NSPrivacyAccessedAPICategorySystemBootTime35F9.1 应用内事件之间的经过时间和计时器;8FFB.1 应用内事件的绝对时间戳;3D61.1 可选的错误报告35F9.1,这是计时器、超时和加载耗时测量的常规情况。
NSPrivacyAccessedAPICategoryDiskSpaceE174.1 写入文件前检查空间,且有可见的行为;85F4.1 向用户显示空间;7D9E.1 可选的错误报告;B728.1 健康研究类应用仅当应用确实在保存下载内容前检查可用空间时,才使用 E174.1。如果您说不出原因,请先查清是哪段代码在使用它,再做任何声明。
NSPrivacyAccessedAPICategoryActiveKeyboards3EC4.1 自定义键盘应用;54BD.1 根据活动键盘调整界面在 WebView 应用中很少见。如果邮件点名的是您自己的 target,请查找 AI 代理添加的自定义 Swift 代码。

只要有一个优化良好的Web应用版本,几分钟内您就能拥有一个出色的移动应用。除此之外,客户服务非常友好且乐于助人!我只能说:推荐WebViewGold :-)

朱利安·科赫(Julian Koch) · 联合创始人 Dueldonkey · CodeCanyon

在 WebViewGold 项目中修复 ITMS-91053

在 Xcode 里花二十分钟,然后换一个新的构建号。

  1. 看清邮件点名的是哪个文件

    如果是您应用的可执行文件(即您的 .app 的名称),声明应放在应用 target 的清单中。如果是类似 Frameworks/SomeSDK.framework 的路径,就必须由该 SDK 在它自己的清单中声明,您的文件无法修复这一点。

  2. 从当前的 WebViewGold 版本开始

    更新是免费的。如果您的项目较旧,请下载当前版本,把您的 Config.swift 值、Info.plist 文本、图标和启动画面迁移过去,在手动编辑任何内容之前,先检查错误是否依然存在。较新的版本可能包含较新的 SDK 版本;如果拿不准,请向WebViewGold 技术支持询问您需要哪个版本。

  3. 找到或创建 PrivacyInfo.xcprivacy

    在项目导航器中搜索 PrivacyInfo.xcprivacy。如果应用 target 已经有一个,就在它的基础上扩展;绝不要给同一个 target 添加第二个清单。如果没有,选择 File、New、File from Template,选取 App Privacy,保留名称 PrivacyInfo,并勾选主应用 target。

  4. 每个类别添加一个字典

    在 NSPrivacyAccessedAPITypes 下添加一个条目,将 NSPrivacyAccessedAPIType 设为邮件中的类别,并在 NSPrivacyAccessedAPITypeReasons 中填入对您的应用属实的原因代码。下方示例展示了具体结构。

  5. 检查邮件点名的每个扩展

    Apple 要求:凡是可执行文件使用了该 API 的 bundle,都要有自己的清单。如果邮件点名的是某个扩展(通知服务扩展、小组件、共享扩展或 App Clip),请为该 target 单独添加一份带有对应原因的清单。

  6. 验证、提高构建号、上传

    归档后,在 Organizer 中按住 Control 点按该归档,选择 Generate Privacy Report:Xcode 会把所有清单合并成一个 PDF,您可以在其中看到自己列出的类别。提高构建号,上传,等收到处理完成的邮件后再提交审核。

应用 target 的最简 PrivacyInfo.xcprivacy

以两个常见类别为例。只使用邮件中列出的类别和与您的应用相符的原因;文件中已有的其他键请保留。

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>
    <!-- NSPrivacyTracking 或 NSPrivacyCollectedDataTypes 等已有的键保持不变 -->
    <key>NSPrivacyAccessedAPITypes</key>
    <array>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>CA92.1</string>
            </array>
        </dict>
        <dict>
            <key>NSPrivacyAccessedAPIType</key>
            <string>NSPrivacyAccessedAPICategoryFileTimestamp</string>
            <key>NSPrivacyAccessedAPITypeReasons</key>
            <array>
                <string>C617.1</string>
            </array>
        </dict>
    </array>
</dict>
</plist>

让清单与您隐私说明的其他部分保持一致

  • 声明与应用实际行为相符的原因。无论是审核人员,还是把这些原因与您的功能进行比对的自动检查,都会期望两者一致。
  • NSPrivacyTracking 与 App Tracking Transparency 属于同一套隐私说明。如果您展示个性化的 AdMob 广告,请在设置它之前阅读带广告 Web 应用的 ATT。
  • 清单并不能替代 App Store Connect 中的 App Privacy 回答。请另行填写;隐私标签指南介绍了 Web 封装应用会收集哪些数据。
  • Info.plist 中的用途说明是另一项检查,有它自己的错误 ITMS-90683;参见缺少用途说明的修复方法。
  • 您的 Web 应用的 Cookie、localStorage 和 IndexedDB 运行在 Apple 自己的框架 WebKit 中。您要声明的是原生二进制文件做了什么,而不是您的 JavaScript 做了什么。

让 AI 代理准备改动

在指定位置粘贴完整的 ITMS 邮件。构建之前请先审查 diff;代理绝不能编造原因代码。更多代理设置:用 Claude Code 配置 WebViewGold 项目。

给在 WebViewGold Xcode 项目文件夹中打开的 Claude Code 或 Cursor 的提示词
App Store Connect 用下面这封邮件拒绝了我的上传。请在这个 WebViewGold iOS 项目中修复它。

1. 对每一条 ITMS-91053,告诉我它点名的是哪个文件,以及该文件是我的应用 target、我的某个扩展,还是第三方框架。
2. 对我自己的 target:找到现有的 PrivacyInfo.xcprivacy(每个 target 不要再创建第二个)。如果没有,就创建一个,并且只加入该 target。
3. 为邮件中点名的每个类别添加一个 NSPrivacyAccessedAPITypes 字典。只能从以下列表中选择原因,并用一句话解释每个选择:UserDefaults CA92.1、1C8F.1(仅在使用 App Group 时);FileTimestamp C617.1、DDA9.1、3B52.1;SystemBootTime 35F9.1、8FFB.1、3D61.1;DiskSpace E174.1、85F4.1、7D9E.1;ActiveKeyboards 3EC4.1、54BD.1。如果找不到能证明某个原因成立的代码,请停下来问我。
4. 对第三方框架:不要动它们。列出该 SDK 及其在本项目中的版本,并告诉我哪次更新会包含它自己的隐私清单。
5. 不要修改 Config.swift、Info.plist 中的用途说明或任何其他文件。

邮件:
[在此粘贴完整的 ITMS 邮件]

常见问题

ITMS-91053 是 App Review 的拒审吗?

不是。它是构建版本处理阶段的自动检查,发生在任何人查看应用之前。该构建版本不会被接受,所以 App Review 根本看不到它;修复后的构建版本顺利上传后,您照常提交即可。

为了保险,我能把所有原因代码都加上吗?

不能。每个原因都是对您的代码如何使用该 API 及相关数据的陈述,而且有些原因仅限 SDK 或健康研究等特定类型的应用使用。只声明属实的内容,不多不少。

我的 Web 应用使用的 localStorage 或 Cookie 需要声明吗?

不需要。您的 Web 应用运行在 Apple 的系统框架 WebKit 中。清单涵盖的是您二进制文件中的原生代码,以及随之一起发布的 SDK。

我用 Cloud Builder 构建。收到这封邮件该怎么办?

在这种方式下,您不需要编辑 Xcode 项目。请把邮件全文发给 WebViewGold 技术支持,以便检查构建配置,不要改动您的 Web 应用;清单是原生构建的一部分。

添加清单后需要新的构建号吗?

需要。清单位于应用 bundle 内部,所以只有通过新的上传才能送达 Apple。提高构建号,重新归档并上传。

让您的应用上架商店的三种方式

结果相同,只是您需要投入的工作量不同。三种方式都附带审核通过保证和 7×24 小时人工支持。

自己动手

$109 每个平台,一次性付费

WebViewGold 许可证:一个现成的 Xcode 或 Android Studio 项目。粘贴您的 URL,设置名称和图标,开启所需功能,构建并提交。永久免费更新。

在主页查看方案

Cloud Builder

$349 每个许可证,一次性附加购买

无需 Mac、Xcode 或 Android Studio:在浏览器中完成配置,我们在云端构建两个应用,并将其交付到 App Store Connect 和 Play Console。

Cloud Builder 如何运作 试用免费演示

Full Service

$698 每个平台 $798

把您的 URL 和图标发给我们。我们的团队在 72 小时内完成配置、构建并交付您的应用,白标,附源码项目。两个平台共 $1,158。

Full Service 详情 服务提供方: WeSetupYourWebViewApp

冬季特惠价格有效期至 2026年12月31日。

准备好发布您的应用了吗?

App Store & Google Play 审核通过保证 – 否则 14 天内退款

想直接交给我们?Full Service:我们在 72 小时内完成配置、构建并交付,每个平台 $698 起。有疑问?通过 7×24 小时在线聊天联系我们。

退款依据我们 FAQ 中列出的条件:应用因非内容原因被 Apple 和/或 Google 拒审,并在购买后 14 天内提出申请。