错误 Appstore 连接:Info.plist 文件中缺少目的字符串

Posted

技术标签:

【中文标题】错误 Appstore 连接:Info.plist 文件中缺少目的字符串【英文标题】:Error Appstore connect : Missing Purpose String in Info.plist File 【发布时间】:2019-01-30 19:36:24 【问题描述】:

我已将我的应用提交给 App Store Connect 以供审核。尽管该应用程序仍在审核中,但我收到了一封电子邮件,通知我必须修复错误。以下是留言内容:

尊敬的开发者,

我们发现您的应用最近交付的一个或多个问题 XXXXX。您的投递成功,但您可能希望更正 您下次交付时会遇到以下问题:

"Info.plist 文件中缺少目的字符串。您的应用程序代码 引用一个或多个访问敏感用户数据的 API。这 应用程序的 Info.plist 文件应该包含一个 具有面向用户目的的 NSLocationAlwaysUsageDescription 键 字符串清楚而完整地解释为什么您的应用需要数据。 从 2019 年春季开始,所有提交到 App Store 且访问 用户数据将需要包含目的字符串。如果您是 使用外部库或 SDK,它们可能会引用 API 需要一个目的字符串。虽然您的应用可能不使用这些 API,但 目的字符串仍然是必需的。您可以联系开发者 库或 SDK 并要求他们发布其代码的一个版本 不包含 API。

纠正问题后,您可以使用 Xcode 或 Application 加载程序将新的二进制文件上传到 iTunes Connect。

最好的问候,

App Store 团队

我的应用完全是用 Expo 构建的,我不知道如何访问和修改 Info.plist。

有什么想法吗?

【问题讨论】:

我在最新版本中遇到了同样的问题,因为我什至没有在我的应用程序中使用定位服务。苹果没有关于这一变化的官方文件。 +1 两天前发布了同一个应用程序,一切都很好。 2 天后,只是更改了几行代码来发布新版本(没有添加更多 Pod 或类似的东西),我收到了这条消息 我们也遇到过同样的问题。我怀疑这是审批过程中的一个错误(希望如此)。周末我会忽略,希望周一修好。 我刚才遇到了同样的问题,尽管我们的应用程序并不总是需要定位服务。它只需要我们已经有一个目的字符串的 NSLocationWhenInUseUsageDescription 。可能这只是 Apple 的一个小故障? 在 Apple 时尚中,他们在电子邮件中提供的用于修复它的链接已损坏。 【参考方案1】:

2019 年 4 月编辑:您现在必须添加这两个键,因为 2019 年春季已经开始。请注意,NSLocationAlwaysUsageDescription 现在已弃用(自 ios 11 起)并已替换为 NSLocationAlwaysAndWhenInUseUsageDescriptionNSLocationWhenInUseUsageDescription。如果要支持低于 iOS 11 的版本,则必须使用这三个值。

总而言之,您必须:

为 iOS 11 及更多版本添加 NSLocationAlwaysAndWhenInUseUsageDescriptionNSLocationWhenInUseUsageDescription 如果您想支持 iOS 10 及更低版本,请添加 NSLocationAlwaysUsageDescription 最后,如果您想支持 iOS 8 及更低版本,可以添加 NSLocationUsageDescription

即使收到此消息,您也可以提交您的应用!

我昨天也遇到了同样的问题,即使应用没有使用定位功能。它可能与项目中包含的具有此可选功能的某些框架有关。

我可以确认我的应用已获得批准,即使在 info.plist 中没有 NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription

确实,正如苹果在邮件中所说:

从 2019 年春季开始,所有应用都提交到 App Store 访问用户数据需要包含目的 字符串。

因此,唯一要做的就是在您的项目中添加此密钥(现在更好,这样您就不会忘记),以便将其包含在您的下一次更新中

只需在 info.plist 中添加两个新条目,以 NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription 作为键,并简要说明为什么将它们用作值(即使您并没有真正使用它们...) .

【讨论】:

在 2019 年 4 月的编辑中,您确定没有撤销弃用吗?从我看到的 NSLocationUsageDescription 是不推荐使用的。看这里:developer.apple.com/library/archive/documentation/General/… 我从苹果收到的电子邮件中提到了 NSLocationAlwaysUsageDescription 所以我认为他把它颠倒了。 @apricity @DrorBar 对不起,伙计们,我确实犯了一个错误。它没有反转,但仍然有一个错误,NSLocationAlwaysUsageDescription 应该替换为 NSLocationAlwaysAndWhenInUseUsageDescriptionNSLocationWhenInUseUsageDescription ,而不是 NSLocationUsageDescription(正如我之前写的,对不起......)。我已经更新了我的答案以添加对该过程的总结。【参考方案2】:

如果您使用的是 Expo,您可以通过将 infoPlist 添加到 app.json 来添加解决方案,如下所示:

  "expo": 
     "ios": 
       "bundleIdentifier": "com.app.myapp",
       "infoPlist": 
         "NSLocationAlwaysUsageDescription": "Some message to appease Apple.",
       ,
     ,
   

Expo Docs

【讨论】:

其实不是“一些安抚苹果的信息”,而是让用户知道在这种情况下你对用户生成的数据(位置)做了什么。这是一个隐私问题,我认为对您的应用用户公平是件好事。 明白了!我在想可能会想离开它的新手!我不想听起来脾气暴躁:) 干杯! @gwalshington 我在 app.json 中没有任何 expo 对象 @HeemanshuBhalla 嗯,我不确定为什么。在我的 app.json 中,它位于顶部并且是第一个声明的对象。这是您声明版本号、捆绑标识符等的地方。如果您已退出应用程序,它可能看起来略有不同? 如果我们不收集位置数据,应该输入什么文本?我们需要编造一个谎言:S【参考方案3】:

我在商店中有一些应用程序,我尝试为 QA 分发一个版本,但同样的事情发生在两个不同的应用程序中。 我认为这是接受构建上传到 Appstore 连接的新标准。

解决方法很简单,在.plist文件中添加以下几行。

<key>NSLocationAlwaysUsageDescription</key>
 <string>custom message</string>
 <key>NSLocationWhenInUseUsageDescription</key>
 <string>custom message</string>

PS:就我而言,没有使用任何位置功能,但我添加了这些行以符合 Appstore 连接指南。顺便说一句,在收到那封电子邮件后,即使他们说构建它有一些问题,我也可以测试应用程序。

我希望这对你们有用。

【讨论】:

哇,我刚得到这个,意识到每个人也得到这个! 第一个键现在已更改为&lt;key&gt;NSLocationUsageDescription&lt;/key&gt; 更新 info.plist 后是否需要重新归档? 是否必须增加捆绑版本或版本号才能上传新的二进制文件? @BishoyHanna 是的! Dror 酒吧是的!【参考方案4】:

这是苹果的新要求,即使你不使用位置。如果要在 Xcode 中添加权限,请查找“Privacy - Location Usage Description”和“Privacy - Location When In Use Usage Description”,并为每一个输入自定义字符串。

【讨论】:

在其他应用更新中,Apple 也请求了此权限:“Privacy - Location Always Usage Description” 所以如果我不使用这些功能,我必须在那里写什么,一个谎言,比如“收集位置以备将来使用,也许”? 是的,如果他们有问题,苹果会联系你 我无法在我的 xcode 10.1 中找到 Information Property List,您应该已经提到在哪里可以找到它,我已经为 Targets 和 Project 查找了构建设置 好的,所以 Targets->Info->Custom ios Target Properties 是确切的位置【参考方案5】:

为了更加简化,您可以在 info.plist 中添加这些行。出现这些错误是因为从 2019 年春季开始,所有提交到 App Store 并访问用户数据的应用都需要包含目的字符串。

    打开 info.plist 作为源代码。

    在您的 plist 中添加以下这些行

    <key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
    <string>$(PRODUCT_NAME) needs Location access for "some reason"!</string>
    <key>NSLocationWhenInUseUsageDescription</key>
    <string>$(PRODUCT_NAME) needs Location access for "some reason"!</string>
    <key>NSLocationAlwaysUsageDescription</key>
    <string>$(PRODUCT_NAME) needs Location access for "some reason"!</string>
    

【讨论】:

我必须删除 标签中的多余空格,然后它才起作用。 @innich 谢谢你指出,我已经改变了我的答案。【参考方案6】: ##在 info.plist 文件中使用这个键

NSLocationAlwaysUsageDescription NSLocationWhenInUseUsageDescription 需要您的位置才能获得 xyz 福利 需要您的位置才能获得 xyz 福利

【讨论】:

【参考方案7】:

我们确实收到了相同的电子邮件,但我们根本没有使用 CoreLocation。经过快速搜索,我们发现 Parse SDK 可以使用 CoreLocation。在 Apple 的电子邮件中,他们明确表示:

如果您使用的是外部库或 SDK,它们可能会引用需要目的字符串的 API。

这意味着您的代码或任何其他库或 SDK 可以使用 CoreLocation 的那一刻,即使您不使用它,您也需要提供“使用时”和“始终使用”的隐私说明。

这也是 Apple 的一项新功能,目前只是一个警告,但从 2019 年春季开始,新提交将需要它。

【讨论】:

这只是愚蠢的......如果我不使用它,它可能会让人们不下载我的应用程序。 -_- 并非如此。除非在代码中的某处调用了 CLLocationManager.requestWhenInUseAuthorization(),否则不会显示要求您使用本地化的警报。苹果分析了每个应用程序代码,看看是否可以调用这样的函数。如果从未调用过,则不会显示警报。【参考方案8】:

“Info.plist 文件中缺少目的字符串。您的应用程序代码引用了一个或多个访问敏感用户数据的 API。应用程序的 Info.plist 文件应包含一个 NSLocationAlwaysUsageDescription 键和一个面向用户的目的字符串,清楚完整地解释原因您的应用需要数据。从 2019 年春季开始,所有提交到 App Store 并访问用户数据的应用都需要包含目的字符串。如果您使用外部库或 SDK,它们可能会引用需要目的字符串的 API。虽然您的应用可能不使用这些 API,但目的字符串仍然是必需的。您可以联系库或 SDK 的开发人员,要求他们发布不包含 API 的代码版本。

打开Info.plist作为源代码。 在您的 plist 中添加以下这些行

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>$(PRODUCT_NAME) needs Location access for "some reason"!</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>$(PRODUCT_NAME) needs Location access for "some reason"!</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>$(PRODUCT_NAME) needs Location access for "some reason"!</string>

【讨论】:

【参考方案9】:

出现这个问题是因为你没有包含

 <NSLocationAlwaysUsageDescription>

为您的应用程序。当我尝试在 AppStore 上提交我的应用程序时,我遇到了同样的问题。应用程序处理完毕后,我收到了相同的邮件。我刚刚添加了描述,现在解决了。

希望这会有所帮助。

【讨论】:

这对我有帮助。如果您在应用程序中使用 Location(或者可能只是一直使用),则需要在其下方添加此行和一个字符串。 &lt;key&gt;NSLocationAlwaysUsageDescription&lt;/key&gt; &lt;string&gt;Always And In Use Permission&lt;/string&gt;【参考方案10】:

有以下几种情况:

NSLocationAlwaysAndWhenInUseUsageDescription (iOS>11)
NSLocationWhenInUseUsageDescription          (iOS>11)
NSLocationAlwaysUsageDescription             (iOS<=10)
NSLocationUsageDescription                   (seems very old, iOS8?)

Apple 声明:

NSLocationWhenInUseUsageDescription 键和NSLocationAlwaysAndWhenInUseUsageDescription 键添加到您的Info.plist 文件中。

和:

如果您的应用支持 iOS 10 及更早版本,请添加 NSLocationAlwaysUsage

NSLocationUsageDescription 似乎已经死了,ADC 站点中唯一的参考是: https://developer.apple.com/ibeacon/Getting-Started-with-iBeacon.pdf

所以可以肯定的是,使用前 3 个。

【讨论】:

【参考方案11】:

这些答案都告诉您如何遵守 App Store 规则以避免警告,但真正的解决方法是让 Expo 允许您禁用他们对定位服务的 SDK 要求,除非您实际使用它们 - 我不确定如果可能的话。

【讨论】:

【参考方案12】:

2 月 19 日的同一问题,收到一封电子邮件,其中包含我没有使用的一堆权限,我假设它们来自插件。 Apple 在 3 月 19 日表示这是一项要求,因此我将这些添加到 info.plst 并再次上传。

确实很傻。

【讨论】:

更多评论真的...?【参考方案13】:

我有 &lt;key&gt;NSLocationWhenInUseUsageDescription &lt;/key&gt; 代替 &lt;key&gt;NSLocationWhenInUseUsageDescription&lt;/key&gt;

一定要删除尾随空格

【讨论】:

【参考方案14】:

我也面临同样的问题,但 27 小时后,我收到了关于批准的电子邮件,即使我什么也没做。 因此请等待大约 24 小时,而不是再次执行所有这些过程。

【讨论】:

是的,这是一个错误!【参考方案15】:

请查看您从 **App Store Connect ** 收到的电子邮件

找出丢失的钥匙

说明

    打开 info.plist 文件。

    从提供的选项中添加并搜索缺少的密钥(例如 联系人 = 隐私 - 联系人使用说明)

    添加使用说明:

$(PRODUCT_NAME) 需要“在此处提供原因”的联系人访问权限。

示例:

【讨论】:

先生,我遇到了同样的错误,但为什么添加到 info.plist 实际上我没有在我的应用程序中使用联系人功能,所以为什么我们需要添加它? @Kapilsoni 请确保您没有访问一个或多个可以访问敏感用户数据的 API :先生,我在我的应用中只使用了相机和位置信息吗?【参考方案16】:

使用 Xcode 11 复制密钥 NSLocationAlwaysUsageDescription 并将其添加到 Info -> Custom iOS Target Properties -> 单击此选项卡左下角的 + 并作为值插入某种描述,例如 This app requires location access to function properly. .

【讨论】:

【参考方案17】:

我的应用也有这个,我什么也没做,但它可以运行良好,下次我认为应该在plist中添加这样的键,只是做一些描述

【讨论】:

【参考方案18】:

对上述问题的简短回答-

NSLocationAlwaysUsageDescription 必须在 Info.plist 文件中使用以下描述进行更新

Your App Name 需要访问该位置才能建议登革热 爆发区。

【讨论】:

【参考方案19】:

在我们的例子中,我们在应用中使用了NSLocationWhenInUseUsageDescription,但没有使用NSLocationAlwaysUsageDescription

从 cmets here 读取(感谢 matt-oakes),我们使用的依赖框架之一似乎正在使用 NSLocationAlwaysUsageDescription

运行我们的应用程序,它不会显示实际的 NSLocationAlwaysUsageDescription 权限模式,因此它看起来只是在后台处理这个。

总而言之,将NSLocationAlwaysUsageDescription 添加到 Info.plist 修复了警告电子邮件,并没有改变应用程序中的任何行为??

【讨论】:

以上是关于错误 Appstore 连接:Info.plist 文件中缺少目的字符串的主要内容,如果未能解决你的问题,请参考以下文章

将 Flutter 应用上传到 AppStore 导致 App.framework 不支持 Info.plist 中指定的最低 OS 版本

将 Flutter 应用上传到 AppStore 导致 App.framework 不支持 Info.plist 中指定的最低 OS 版本

Info.plist的CFBundleIdentifierCFBundleNameBundleDisplayName

Info.plist 表示 Mac 应用程序,但提交 IPA

帮助填写“info.plist”文件

info.plist 上的本地化列表不完整