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


151

我已将我的应用程序提交给App Store Connect进行审核。尽管该应用仍在审核中,但我已收到一封电子邮件,通知我必须纠正错误。这是消息的内容:

尊敬的开发商,

我们发现您的应用XXXXX最近交付时出现一个或多个问题。您的交付已成功,但是您可能希望在下一次交付中更正以下问题:

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

解决问题之后,可以使用Xcode或Application Loader将新的二进制文件上载到iTunes Connect。

最好的祝福,

App Store团队

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

任何想法?


3
由于我什至没有在我的应用程序中使用定位服务,因此我在最新版本中遇到了同样的问题。苹果也没有有关此更改的官方文件。
huong

3
+1两天前针对同一应用发布了一个版本,一切正常。2天后,只是更改了几行代码以进行新发行(没有添加更多Pod或类似的内容),我收到了此消息
Tiago Ornelas,

2
我们也遇到过同样的问题。我怀疑这是批准过程中的错误(希望如此)。我将在周末忽略,并希望在周一修复。
AMB

2
尽管我们的App并不需要始终提供定位服务,但我现在也遇到了同样的问题。它只需要NSLocationWhenInUseUsageDescription,我们已经有了一个目的字符串。也许这只是苹果公司的一个小故障?
ilight

3
并且在Apple-fashion中,他们在电子邮件中提供的用于修复它的链接已损坏。
gwalshington

Answers:


44

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

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

博览会文件


25
实际上,在这种情况下,这不是 “一些消息来抚慰Apple”,而是让用户知道您对用户生成的数据(位置)的处理方式。这是出于隐私考虑,我认为对您的应用程序用户公平是件好事。
Lookaji

4
知道了!我在想新手,可能会想离开它!我不想听起来脾气暴躁:)干杯!
Lookaji

@gwalshington我在app.json中没有任何expo对象
Heemanshu Bhalla

@HeemanshuBhalla嗯,我不确定为什么。在我的app.json中,它位于顶部,并且声明了第一个对象。您可以在其中声明版本号,捆绑包标识符等。如果您退出了该应用程序,也许看起来有些不同?
gwalshington

2
如果我们不收集位置数据,应该输入什么文字?我们需要弥补谎言:S
普里莫兹Kralj

61

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

总结一下,您必须:

  • NSLocationAlwaysAndWhenInUseUsageDescriptionANDNSLocationWhenInUseUsageDescription为iOS 11及更高版本
  • 并添加 NSLocationAlwaysUsageDescription是否要支持iOS 10及以下版本
  • 最后,NSLocationUsageDescription如果您想支持iOS 8及更低版本,则可以添加。


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

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

我可以确认我的应用程序已经获得批准,即使没有使用NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription键入info.plist

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

从2019年春季开始,将要求所有提交给App Store的访问用户数据的应用都包括用途字符串。

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

只需在和中添加两个新条目info.plistNSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription使用键和键,并简要说明为什么将它们用作值(即使您实际上并没有使用它们...)。


2
在2019年4月的编辑中,您确定不反对弃用折旧吗?从我所看到的,NSLocationUsageDescription是不推荐使用的一种。此处查看:developer.apple.com/library/archive/documentation/General/…–
4

我从苹果收到的电子邮件中提到NSLocationAlwaysUsageDescription,所以我认为他已将其撤消。
Dror Bar

@apricity @DrorBar抱歉,确实我犯了一个错误。它没有被撤销,但是仍然有一个错误,NSLocationAlwaysUsageDescription应该用NSLocationAlwaysAndWhenInUseUsageDescription和代替NSLocationWhenInUseUsageDescription ,而不是NSLocationUsageDescription(如我先前所写,对不起……)。我已经更新了答案,以总结整个过程。
AnthoPak

47

我的商店中有一些应用程序,我尝试分发质量检查版本,并且在两个不同的应用程序中发生了同样的事情。我认为这是接受将构建上传到Appstore Connect的新标准。

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

<key>NSLocationAlwaysUsageDescription</key>

<string>custom message</string>

<key>NSLocationWhenInUseUsageDescription</key>

<string>custom message</string>

PS:就我而言,没有使用任何位置功能,但是我添加了以下几行以符合Appstore连接准则。顺便说一句,在收到该电子邮件之后,即使他们说该应用存在一些问题,我也可以对其进行测试。

我希望这项工作对你们有用。


5
哇,我刚得到这个,意识到每个人也都得到了!
卡梅隆·埃利斯

到目前为止,第一把钥匙已更改为<key>NSLocationUsageDescription</key>
Hudi Ilfeld '19

1
更新info.plist之后是否需要重新存档?
Bishoy Hanna

我是否必须增加捆绑软件版本或版本号才能上传新的二进制文件?
Dror Bar

19

这是Apple的一项新要求,即使您不使用位置信息也是如此。如果要在Xcode中添加权限,请查找“隐私-位置使用情况说明”和“隐私-使用中的位置使用情况说明”,然后分别为它们键入自定义字符串。

在此处输入图片说明


1
在其他应用程序更新中,Apple也请求了此权限:“隐私-位置始终使用说明”
JuanJoséRamírez18年

2
因此,如果我不使用这些功能,那我该在那写些谎言,例如“收集位置以备将来使用”之类的东西?
Ruslan Shashkov

是的,如果有问题,苹果将与您联系
JuanJoséRamírez'19

我无法在xcode 10.1中找到信息属性列表,您应该提到在哪里可以找到它,我一直在寻找目标和项目的构建设置
Awais Nasir

1
好的,所以Targets-> Info-> Custom ios Target Properties是确切的位置
Awais Nasir

15

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

  1. 打开info.plist作为源代码。
  2. 在您的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>

2
我必须删除<key>标记中的多余空格,然后它才能工作。
innich

@innich谢谢您指出,我已经更改了答案。
Sachin Nautiyal

8
##在info.plist文件中使用此密钥

NSLocationAlwaysUsageDescription您的位置对于您的xyz权益是必需的NSLocationWhenInUseUsageDescription您的位置对于您的xyz权益是必需的


8

我们确实收到了相同的电子邮件,并且根本没有使用CoreLocation。快速搜索后,我们发现Parse SDK可以使用CoreLocation。在Apple的电子邮件中,他们明确指出:

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

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

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


真是愚蠢。。。如果我不使用它,可能会导致人们不仅仅因为此而下载我的应用程序。-_-
Mayoul

3
并不是的。除非CLLocationManager.requestWhenInUseAuthorization()调用了代码中的某处,否则不会显示要求您使用本地化的警报。Apple分析了每个应用程序代码,以查看是否可以调用该功能。如果从未调用过,则不会显示警报。
sebleclerc

6

发生此问题是因为您尚未包括

 <NSLocationAlwaysUsageDescription>

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

希望这可以帮助。


这对我有帮助。如果您在应用程序中(或者可能一直使用)使用位置,则需要在此行下方添加一个字符串。 <key>NSLocationAlwaysUsageDescription</key> <string>Always And In Use Permission</string>
MaylorTaylor

6

有以下几种情况:

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

苹果声明:

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

和:

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

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

因此请确定先使用3。


3

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


3

2月19日发生同样的问题,收到了一封我没有使用的权限电子邮件,我认为它们来自插件。苹果在3月19日表示这是一项要求,因此我将其添加到info.plst中并再次上传。

确实是很愚蠢的。


2
真的还有更多评论吗?
史蒂夫,

3

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


1
是的,这是一个错误!
Danh Huynh,

2

我有 <key>NSLocationWhenInUseUsageDescription </key> 代替 <key>NSLocationWhenInUseUsageDescription</key>

确保删除尾随空格


2

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

识别丢失的钥匙 在此处输入图片说明

使用说明

  1. 打开info.plist文件。

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

  3. 添加用法说明:

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

例:


1
先生,我遇到了同样的错误,但是为什么要添加到info.plist中却实际上在我的应用中未使用联系人功能,所以为什么我们需要添加它?
卡皮尔·索尼

@Kapilsoni请确保您不会访问一个或多个有权访问敏感用户数据的API
Zeus

1
:sir我仅在我的应用中使用了相机和位置?
卡皮尔·索尼

2

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


2

“ 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>

1

我的应用程序也知道了这一点,对此我什么也不做,但是它可以很好地运行,下一次我认为应该在plist中添加这样的键,只做一些说明


1

上述问题的简短答案-

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

{您的应用程序名称}需要访问该位置以建议登革热暴发区。


0

就我们而言,我们NSLocationWhenInUseUsageDescription在应用程序中使用,但没有NSLocationAlwaysUsageDescription

这里的评论中阅读(感谢matt-oakes),看起来像NSLocationAlwaysUsageDescription我们所使用的一种依赖框架正在使用。

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

因此,总而言之,添加NSLocationAlwaysUsageDescription到Info.plist可以修复警告电子邮件,并且没有更改应用程序中的任何行为👍🏻

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.