Appstore Connect 错误:Info.plist 文件中缺少 Purpose String。

198
我已将我的应用程序提交到App Store Connect进行审核。虽然应用程序仍在审核中,但我收到了一封电子邮件告诉我必须修复一个错误。以下是该消息的内容:
亲爱的开发人员,
我们在您的XXXXX应用程序的最近交付中发现了一个或多个问题。您的交付成功了,但您可能希望在下一次交付中更正以下问题:
"Info.plist文件中缺少目的字符串。您的应用程序代码引用了一个或多个访问敏感用户数据的API。应用程序的Info.plist文件应包含一个NSLocationAlwaysUsageDescription键,其中包含一个向用户阐明清晰和完整的目的字符串,解释为什么您的应用程序需要数据。从2019年春季开始,所有访问用户数据的应用程序都需要包括目的字符串。如果您正在使用外部库或SDK,则它们可能引用需要目的字符串的API。即使您的应用程序可能不使用这些API,也仍需要目的字符串。您可以联系库或SDK的开发人员,并请求他们发布一个不包含这些API的版本。
修正问题后,您可以使用Xcode或Application Loader将新二进制文件上传到iTunes Connect。
此致
App Store团队

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

有任何想法吗?


4
我也遇到了同样的问题,尽管我的应用程序中甚至没有使用位置服务。而且苹果没有任何官方文件说明这个改变。 - huong
4
两天前我发布了同一个应用程序,一切正常。又过了两天,只是改变了几行代码来发布新版本(没有添加更多的Pods或类似的内容),但我收到了这个消息:+1。 - Tiago Ornelas
2
我们遇到了同样的问题。我怀疑这是批准流程中的一个错误(希望如此)。我打算在周末忽略它,希望星期一能够解决。 - AMB
3
我刚遇到了完全相同的问题,尽管我们的应用程序实际上不需要一直使用位置服务。它只需要NSLocationWhenInUseUsageDescription,而我们已经为此设置了目的字符串。这可能只是苹果端出现的小错误? - ilight
3
就像苹果公司一样,他们在电子邮件中提供的修复链接也是失效的。 - gwalshington
显示剩余4条评论
19个回答

83
现在需要添加以下两个键,因为已经到了2019年春季。请注意,NSLocationAlwaysUsageDescription自iOS 11以来已经被弃用,并被NSLocationAlwaysAndWhenInUseUsageDescription和NSLocationWhenInUseUsageDescription所替代。如果您想支持低于iOS 11的版本,则必须使用这三个值。
总之,您需要执行以下操作:
  • 对于iOS 11及更高版本,请添加NSLocationAlwaysAndWhenInUseUsageDescription和NSLocationWhenInUseUsageDescription
  • 如果要支持iOS 10及更低版本,请添加NSLocationAlwaysUsageDescription
  • 如果要支持iOS 8及更低版本,请添加NSLocationUsageDescription。
即使应用程序不使用位置功能,您仍然可以提交应用程序。也许与项目中包含此可选功能的某些框架有关。我可以确认,即使没有info.plist中的NSLocationAlwaysUsageDescription和NSLocationWhenInUseUsageDescription键,我的应用程序也已获批准。事实上,正如苹果在邮件中所述:从2019年春季开始,所有提交到App Store的应用程序都必须提供完整的隐私政策链接,以便于审核人员进行评估。任何访问用户数据的功能都需要包含一个目的字符串。

所以唯一要做的就是在项目中添加此键(最好现在就添加,以免忘记),这样它将会被包含在下一个更新中。

只需在info.plist中添加两个新条目,其中NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription作为键,并将您使用它们的原因简短描述为值(即使您实际上并不使用它们...)。 


2
在你2019年4月的编辑中,你确定你没有颠倒弃用吗?从我所看到的来看,NSLocationUsageDescription是被弃用的那个。在这里查看:https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CocoaKeys.html#//apple_ref/doc/uid/TP40009251-SW18 - apricity
我收到的来自苹果的电子邮件提到了NSLocationAlwaysUsageDescription,所以我认为他搞错了。 - Dror Bar
@apricity @DrorBar 对不起,我犯了一个错误。它并没有被颠倒过来,但仍然有一个错误,应该用 NSLocationAlwaysAndWhenInUseUsageDescriptionNSLocationWhenInUseUsageDescription 替换 NSLocationAlwaysUsageDescription,而不是像我之前写的那样替换为 NSLocationUsageDescription(对此我感到抱歉...)。 我更新了我的答案以总结这个过程。 - AnthoPak

61

如果您正在使用Expo,可以通过将infoPlist添加到app.json中来解决此问题,方法如下:

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

Expo文档


42
实际上这不是“为了讨好苹果发送的某些信息”,而是让用户知道你在处理用户生成的数据(位置数据)时在做什么。这是涉及隐私问题的事情,我认为公平对待应用程序用户是很好的。 - Lookaji
4
知道了!我想对那些可能会被诱惑离开的新手说这个话!我并不想听起来很暴躁 :) 干杯! - Lookaji
@gwalshington 我的 app.json 中没有任何 expo 对象。 - Heemanshu Bhalla
3
如果我们不收集位置数据,应该输入什么文本?我们需要编造一个谎言:S - c0dehunter
1
@Lookaji,由于谷歌并没有要求这样做,作为一个Flutter开发者,我只是为了取悦苹果而这样做。因此,我甚至不知道<string>是否会被翻译,我得弄清楚一下。 - MwBakker
显示剩余2条评论

56

我在应用商店中有一些应用程序,并尝试为QA分发版本,但在两个不同的应用程序中遇到了相同的问题。我认为这是Appstore Connect接受构建上传的新标准。

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

<key>NSLocationAlwaysUsageDescription</key>

<string>自定义信息</string>

<key>NSLocationWhenInUseUsageDescription</key>

<string>自定义信息</string>

附注:在我的情况下,没有使用任何位置功能,但我添加了这些行以遵守Appstore Connect的指南。顺便说一下,在收到那封电子邮件后,即使他们说该构建存在一些问题,我也可以测试应用程序。

希望这对你们有用。


5
哇,我刚刚收到了这个消息,意识到每个人都在收到它! - Cameron A. Ellis
第一个键现在已更改为<key>NSLocationUsageDescription</key> - Hudi Ilfeld
1
更新 info.plist 后,我们需要重新归档吗? - Bishoy Hanna
1
我需要增加捆绑版本或版本号才能上传新的二进制文件吗? - Dror Bar
@BishoyHanna 是的!Dror Bar 是的! - Fotios Tsakiris

23

这是苹果的新要求,即使您不使用位置信息。如果想在Xcode中添加权限,请查找“隐私 - 使用位置说明”和“隐私 - 在使用时使用位置说明”,并为它们各自输入自定义字符串。

输入图片描述


1
在其他应用更新中,苹果也要求此权限:“隐私 - 位置始终使用说明”。 - Juan José Ramírez
2
那么如果我不使用这些功能,我需要在那里写什么呢?撒谎吗?比如“收集位置以备将来使用”? - Ruslan Shashkov
是的,如果苹果有问题,他们会联系您。 - Juan José Ramírez
1
我在我的Xcode 10.1中找不到信息属性列表,你应该说明在哪里找到它,我已经在目标和项目的构建设置中查找过了。 - Muhammad Awais
2
好的,Targets->Info->Custom ios Target Properties 是确切的位置。 - Muhammad Awais

21

为了更简化操作,您可以在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>

3
我必须去掉<key>标签中的额外空格,然后它才能正常工作。 - innich
@innich 谢谢你指出来,我已经修改了我的答案。 - Sachin Nautiyal

10
"Info.plist文件中缺少目的字符串。您的应用程序代码引用了一个或多个访问敏感用户数据的API。应用程序的Info.plist文件应该包含一个NSLocationAlwaysUsageDescription键,其中包含一个用户面向的目的字符串,清楚完整地解释为什么您的应用程序需要这些数据。从2019年春季开始,所有访问用户数据的应用程序都需要包括一个目的字符串。如果您使用外部库或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 您的位置信息将用于为您提供xyz等服务。 NSLocationWhenInUseUsageDescription 您的位置信息将用于为您提供xyz等服务。


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

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

这意味着,即使您不使用CoreLocation,但你的代码或任何其他库或SDK可能会使用它,您也需要提供“仅在使用时”和“一直使用”隐私描述。
这也是苹果公司的新规定,目前仅是一个警告,但从2019年春季起,新的提交将需要满足这个要求。

这太愚蠢了...如果我不使用它,可能会因此让人们不下载我的应用程序。-_- - Mayoul
4
不完全正确。要求您使用位置信息的提示不会显示,除非在代码中调用了 CLLocationManager.requestWhenInUseAuthorization() 函数。苹果会分析每个应用程序的代码,以查看是否可以调用此函数。如果从未调用该函数,则不会显示提示。 - sebleclerc

7
有以下几种情况:
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

所以为了确保,先使用前三个。


6
这个问题的出现是因为您没有包含。
 <NSLocationAlwaysUsageDescription>

针对你的应用程序。当我尝试在AppStore上提交我的应用程序时,我遇到了同样的问题。经过处理后,我收到了相同的邮件。我只是添加了描述,现在问题已经解决。

希望这能帮到你。


这对我很有帮助。如果你的应用程序中使用了位置信息(或者总是需要),你需要添加以下代码行和字符串。<key>NSLocationAlwaysUsageDescription</key> <string>始终和正在使用权限</string> - MaylorTaylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接