App Store Connect 应用程序拒绝缺少目的字符串,但字符串存在于 InfoPlist.strings 中

Pin*_*ier 6 internationalization info.plist ios app-store-connect

我正在开发一个 Flutter 应用程序并将其提交到 App Store Connect,并立即收到一封电子邮件,表明该应用程序因以下原因被拒绝

ITMS-90683:Info.plist 中缺少用途字符串 您的应用程序代码引用了一个或多个访问敏感用户数据的 API。应用程序的 Info.plist 文件应包含一个 NSContactsUsageDescription 键,其中包含面向用户的目的字符串,清楚、完整地解释应用程序需要数据的原因。从 2019 年春季开始,提交到 App Store 的所有访问用户数据的应用程序都必须包含目的字符串。如果您使用外部库或 SDK,它们可能会引用需要用途字符串的 API。虽然您的应用程序可能不使用这些 API,但仍然需要目的字符串。您可以联系库或 SDK 的开发人员,请求他们发布不包含 API 的代码版本。了解更多信息(https://developer.apple.com/documentation/uikit/core_app/protecting_the_user_s_privacy)。

据说缺少 5 个目的字符串。

没错,我的应用程序正在使用电子邮件中列出的 API,但我的 Info.plist 文件中有密钥,并且在我的 iPhone 上运行该应用程序时,当应用程序向用户请求相应的权限时,会显示目的字符串。我什至使用 en.lproj 等文件夹中的 InfoPlist.strings 文件翻译了字符串。在 Info.plist 中,我像这样引用了翻译后的字符串

<key>NSContactsUsageDescription</key>
<string>$(NSContactsUsageDescription)</string>
Run Code Online (Sandbox Code Playgroud)

我已经尝试解压 .xcarchive(在 Mac Finder 中右键单击 -> 显示包内容)和 .ipa 文件。在其中我找到了 Runner.app(我认为 Runner 是 Fl​​utter 特定的“名称”),并且还显示了包内容。我找到了 Info.plist,当我在 TextEditor 或 XCode 中打开它时,字符串消失了,但 InfoPlist.strings 文件仍然存在。

Xcode 显示目的字符串在归档后在 Info.plist 中丢失

我认为导出时出现问题,导致值被清除?

Pin*_*ier 12

实际上我自己问这个问题是为了回答它,希望它可以帮助别人,因为尽管解决方案很简单,但我花了很多时间来解决这个问题:

\n

我不知道来自哪个教程/Stackoverflow 答案或其他任何地方我有将翻译引用为问题中所示的变量的技巧。

\n
<key>NSContactsUsageDescription</key>\n<string>$(NSContactsUsageDescription)</string>\n
Run Code Online (Sandbox Code Playgroud)\n

只需将变量替换为真正目的的字符串(也许是您应用程序的主要语言?我只是从英语字符串文件中复制粘贴了值。)

\n
<key>NSContactsUsageDescription</key>\n<string>The reason for access to contacts is\xe2\x80\xa6</string>\n
Run Code Online (Sandbox Code Playgroud)\n

似乎这些变量是在构建时评估的,而不是(也)运行时评估的。由于它们不存在,Xcode 会在 Info.plist 文件中放置一个空字符串。在运行时,InfoPlist.strings 文件会搜索覆盖 Info.plist 中的值,因此国际化确实有效,即使它实际上实现不正确。似乎要提交到 AppStore,仅在 .strings 文件中包含值是不够的,但 Info.plist 中必须有一个备用目的字符串\n可以在此处找到 Apple 关于本地化 Info.plist 的参考找到 Apple 关于本地化 Info.plist 的参考。

\n