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

App Store Connect 错误

ITMS-90683 "Missing purpose string":在 Info.plist 中添加正确的用途说明

ITMS-90683 会在上传后不久通过邮件发来:您的二进制文件引用了相机、位置或通讯录等受保护的资源,而 Info.plist 中没有一句话解释原因。添加邮件点名的键,写上一句如实的说明,然后上传新的构建版本。真正值得用心的是这句话本身,因为 App Review 也会读它。

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

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

邮件说了什么,以及 Web 应用为何会收到它

邮件会点名一个键,例如 NSCameraUsageDescription 或 NSLocationWhenInUseUsageDescription,以及缺少该键的 bundle。Apple 的措辞还指出,外部库和 SDK 可能会引用这些 API,即使您的应用可能并不使用它们,也必须提供用途说明。请把它当作阻断性问题:补上键,提高构建号,重新上传。

您的 Web 应用通过 <input type="file" capture> 请求相机,通过 navigator.geolocation 请求位置,通过 getUserMedia 请求麦克风。在 WebViewGold 应用中,这些请求都经由 WebKit 和原生外壳处理,iOS 会使用应用 Info.plist 中的用途说明来显示权限对话框。没有这句说明,iOS 就无法显示对话框,转而终止应用,而 Apple 的上传检查要防止的正是这种情况。

在 WebViewGold 项目中,最常见的触发原因是准则 2.5.1所鼓励的清理:您删除了未使用功能的用途说明,而其中一条属于仍被编译进二进制文件的代码。二进制文件引用了什么,以邮件为准,所以这个键要加回去,并配上一句准确的说明。

哪个键对应哪项 WebViewGold 功能

Xcode 在 Info.plist 编辑器中显示的是可读名称;邮件中使用的是原始键名。

邮件中的原始键名Xcode 中显示为您的应用在以下情况需要它……
NSCameraUsageDescriptionPrivacy - Camera Usage Description为上传而拍照或录像,使用 qrcode:// 或 barcodescanner://、文档扫描(kVisionKitEnable)、手电筒 API,或在 Web 应用中使用摄像头视频流。参见二维码扫描器文档。
NSPhotoLibraryAddUsageDescriptionPrivacy - Photo Library Additions Usage Description使用 savethisimage://?url= 保存图片,或使用 takescreenshot:// 保存截图(文件下载器文档)。
NSPhotoLibraryUsageDescriptionPrivacy - Photo Library Usage Description从照片图库读取内容,例如用于图片上传,或者邮件要求提供它时。
NSMicrophoneUsageDescriptionPrivacy - Microphone Usage Description录制音频:语音笔记、AI 聊天中的语音输入,或带声音的视频。
NSLocationWhenInUseUsageDescriptionPrivacy - Location When In Use Usage Description调用 HTML5 地理定位 API(仅限 HTTPS,参见地理定位文档)。
NSLocationAlwaysAndWhenInUseUsageDescriptionPrivacy - Location Always and When In Use Usage Description将 backgroundlocation 设为 true,以便在后台获取位置。
NSContactsUsageDescriptionPrivacy - Contacts Usage Description使用 requestcontactpermission:// 和 readcontacts://。
NSFaceIDUsageDescriptionPrivacy - Face ID Usage Description使用 enableBioMetricAuth 或 bioauth://(生物识别文档)。
NFCReaderUsageDescriptionPrivacy - NFC Scan Usage Description使用 NFC 插件(readnfc://、writenfc://)。
NSHealthShareUsageDescription 和 NSHealthUpdateUsageDescriptionPrivacy - Health Share / Health Update Usage Description使用 HealthKit 插件(readhealthkit://、writehealthkit://)。根据HealthKit 文档,这两个键都是必需的。
NSUserTrackingUsageDescriptionPrivacy - Tracking Usage Description始终需要。WebViewGold 文档指出此键为必需项,删除它会导致应用崩溃。

较弱的用途说明与有力的用途说明

Apple 的用途说明指南要求用一个主动语态的完整句子,写明功能以及数据会被如何使用。不要营销话术,也不要只是复述资源名称。

资源会被质疑能通过
相机此应用需要访问相机。扫描会员卡上的二维码,在前台办理签到。
位置用于使用位置。显示离您最近的攀岩馆,以及步行到每一家所需的时间。
照片添加保存照片。将您的活动门票保存到“照片”,这样在入口处没有网络也能出示。
麦克风应用需要麦克风。录制您的语音笔记,并将其转换为日记条目中的文字。
Face ID使用 Face ID。用 Face ID 代替密码解锁您的预算。
通讯录访问您的通讯录以获得更好的体验。让您从通讯录中挑选好友,邀请他们加入共享清单。只有您选择的联系人会被发送到我们的服务器。(第二句只有在属实时才写。)

出色的工作!无需任何编码就能轻松完成。简单快捷!创作者也提供了大力帮助!

卢卡斯·杜波依斯(Lucas Dubois) · CodeCanyon

在项目中修复

  1. 在邮件中找到键和 bundle

    bundle 可能是您的主应用,也可能是某个扩展 target(推送服务扩展、小组件、共享扩展、App Clip)。每个 target 都有自己的 Info.plist,键必须放在邮件点名的那一个里。

  2. 在 Xcode 中添加键

    打开该 Info.plist,将鼠标悬停在某一行上,点击加号,从列表中选择对应的 “Privacy - ...” 条目,然后粘贴您的句子。也可以右键点击该文件,选择 Open As、Source Code,添加下方所示的键和字符串。

  3. 确定这句话要描述什么

    如果该功能是您应用的一部分,就描述它。如果不是,有两个如实的选项:添加该键,并用一句准确的话描述那段代码的作用(ITMS 邮件本身就说,即使您的应用可能不使用该 API,也必须提供说明);或者删除引用该 API 的代码,在没有正当理由时,Apple 的用途说明指南推荐这样做。在 WebViewGold 项目中,不要自行删除 Swift 文件或 SDK(文档警告,删除 AdMob SDK 会引发大量依赖错误);如需移除某个模块,请咨询技术支持。用途说明本身永远不会弹出对话框;只有当代码真正请求访问时,iOS 才会显示它。

  4. 如果应用做了本地化,说明也要本地化

    在 InfoPlist.strings 中为应用支持的每种语言添加相同的键,并把 Info.plist 中的字符串(通常是英文)保留为后备。在设备上逐一测试每种语言。

  5. 提高构建号并上传

    归档、上传,然后等待处理完成的邮件。如果处理完成后没有收到 ITMS 邮件,该构建版本就会出现在 TestFlight 中。

  6. 在设备上把每个对话框都触发一次

    安装 TestFlight 版本,使用每个会请求权限的功能,检查对话框是否在使用的那一刻弹出,并显示您写的句子。首次启动时毫无来由地弹出对话框,正是审核人员会依据 5.1.1 标记的问题。

Info.plist 条目的源代码视图

以下为示例值;请替换成描述您自己功能的句子。

xml
<key>NSCameraUsageDescription</key>
<string>扫描会员卡上的二维码,在前台办理签到。</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>将您的活动门票保存到“照片”,这样在入口处没有网络也能出示。</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>显示离您最近的攀岩馆,以及步行到每一家所需的时间。</string>
<key>NSFaceIDUsageDescription</key>
<string>用 Face ID 代替密码解锁您的预算。</string>

提示词:让代理添加键并撰写说明

给在 WebViewGold Xcode 项目文件夹中打开的 Claude Code 或 Cursor 的提示词
我的上传因 ITMS-90683 被拒(邮件见下方)。请在这个 WebViewGold iOS 项目中:

1. 告诉我每个缺失的键属于哪个 target、哪个 Info.plist。
2. 阅读 Config.swift,列出已启用的原生功能(扫描器、文档扫描、地理定位、后台定位、生物识别、通讯录、NFC、HealthKit、文件和图片保存)。
3. 把每个缺失的键添加到正确的 Info.plist 中。值写成一个主动语态的完整句子,写明我的应用中的具体功能,以及数据会被如何使用。不要营销用语,不要写“为了提供更好的体验”这类话。我的应用:[用一段话说明应用做什么、面向谁]。
4. 如果某个键属于未启用的功能,仍然添加它,为那段代码的作用写一句准确的话,并单独列出来,以便我做决定。
5. 如果存在 InfoPlist.strings 文件,为每个键添加这些语言的翻译。
6. 绝不要删除 NSUserTrackingUsageDescription。不要修改任何其他文件。

邮件:
[在此粘贴 ITMS-90683 邮件]

常见问题

我从不使用相机。Apple 为什么要求 NSCameraUsageDescription?

因为您二进制文件中的代码(通常是某个 SDK 或模板模块)引用了相机 API。Apple 的检查看的是二进制文件,而不是您开启了哪些功能。请添加该键并写一句准确的说明,或者把相关代码移除。

添加用途说明会向我的用户弹出权限对话框吗?

不会。只有当代码真正请求访问时,对话框才会出现,例如用户点击您的扫描按钮时。未使用功能的说明永远不会显示。

说明可以只用我自己的语言写吗?

用应用的主要语言填写 Info.plist 中的值,并为应用支持的其他语言添加 InfoPlist.strings 文件。对于您没有翻译的每种语言,Info.plist 中的值都是后备。

App Review 会拒绝笼统的用途说明吗?

有可能。“此应用需要您的位置”这样的句子,是典型的准则 5.1.1 问题。请用一个具体的句子写明功能和它带来的好处。

我需要新的构建版本,还是可以直接在 App Store Connect 中修复?

需要新的构建版本。Info.plist 是应用 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 天内提出申请。