错误 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 起)并已替换为 NSLocationAlwaysAndWhenInUseUsageDescription
和 NSLocationWhenInUseUsageDescription
。如果要支持低于 iOS 11 的版本,则必须使用这三个值。
总而言之,您必须:
为 iOS 11 及更多版本添加NSLocationAlwaysAndWhenInUseUsageDescription
和 NSLocationWhenInUseUsageDescription
如果您想支持 iOS 10 及更低版本,请添加 NSLocationAlwaysUsageDescription
最后,如果您想支持 iOS 8 及更低版本,可以添加 NSLocationUsageDescription
。
即使收到此消息,您也可以提交您的应用!
我昨天也遇到了同样的问题,即使应用没有使用定位功能。它可能与项目中包含的具有此可选功能的某些框架有关。
我可以确认我的应用已获得批准,即使在 info.plist
中没有 NSLocationAlwaysUsageDescription
和 NSLocationWhenInUseUsageDescription
键
确实,正如苹果在邮件中所说:
从 2019 年春季开始,所有应用都提交到 App Store 访问用户数据需要包含目的 字符串。
因此,唯一要做的就是在您的项目中添加此密钥(现在更好,这样您就不会忘记),以便将其包含在您的下一次更新中。
只需在 info.plist
中添加两个新条目,以 NSLocationAlwaysUsageDescription
和 NSLocationWhenInUseUsageDescription
作为键,并简要说明为什么将它们用作值(即使您并没有真正使用它们...) .
【讨论】:
在 2019 年 4 月的编辑中,您确定没有撤销弃用吗?从我看到的 NSLocationUsageDescription 是不推荐使用的。看这里:developer.apple.com/library/archive/documentation/General/… 我从苹果收到的电子邮件中提到了 NSLocationAlwaysUsageDescription 所以我认为他把它颠倒了。 @apricity @DrorBar 对不起,伙计们,我确实犯了一个错误。它没有反转,但仍然有一个错误,NSLocationAlwaysUsageDescription
应该替换为 NSLocationAlwaysAndWhenInUseUsageDescription
和 NSLocationWhenInUseUsageDescription
,而不是 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 连接指南。顺便说一句,在收到那封电子邮件后,即使他们说构建它有一些问题,我也可以测试应用程序。
我希望这对你们有用。
【讨论】:
哇,我刚得到这个,意识到每个人也得到这个! 第一个键现在已更改为<key>NSLocationUsageDescription</key>
更新 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>
【讨论】:
我必须删除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(或者可能只是一直使用),则需要在其下方添加此行和一个字符串。<key>NSLocationAlwaysUsageDescription</key> <string>Always And In Use Permission</string>
【参考方案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】:我有
<key>NSLocationWhenInUseUsageDescription </key>
代替
<key>NSLocationWhenInUseUsageDescription</key>
一定要删除尾随空格
【讨论】:
【参考方案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