我已将我的应用程序提交给 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。
任何想法?
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
作为键,并简要说明您使用它们作为值的原因(即使您并没有真正使用它们......)。
如果您使用的是 Expo,您可以通过将 infoPlist 添加到 app.json 来添加解决方案,如下所示:
"expo": {
"ios": {
"bundleIdentifier": "com.app.myapp",
"infoPlist": {
"NSLocationAlwaysUsageDescription": "Some message to appease Apple.",
},
},
}
我在商店里有一些应用程序,我试图分发一个用于 QA 的版本,同样的事情发生在两个不同的应用程序中。我认为这是接受构建上传到 Appstore 连接的新标准。
解决方案很简单,在 .plist 文件中添加以下行。
<key>NSLocationAlwaysUsageDescription</key>
<string>custom message</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>custom message</string>
PS:就我而言,没有使用任何位置功能,但我添加了这些行以符合 Appstore 连接指南。顺便说一句,在收到那封电子邮件后,即使他们说构建它有一些问题,我也可以测试该应用程序。
我希望这对你们有用。
<key>NSLocationUsageDescription</key>
即使您不使用位置,这是苹果的新要求。如果要在 Xcode 中添加权限,请查找“Privacy - Location Usage Description”和“Privacy - Location When In Use Usage Description”,并为每个输入自定义字符串。
https://i.stack.imgur.com/PjRhM.png
为了更加简化,您可以在 info.plist 中添加这些行。出现这些错误是因为从 2019 年春季开始,所有提交到 App Store 并访问用户数据的应用都需要包含目的字符串。
打开 info.plist 作为源代码。在您的 plist 中添加以下这些行
NSLocationAlwaysUsageDescription 您的 xyz 福利需要您的位置 NSLocationWhenInUseUsageDescription 您的 xyz 福利需要您的位置
我们确实收到了相同的电子邮件,但我们根本没有使用 CoreLocation。经过快速搜索,我们发现 Parse SDK 可以使用 CoreLocation。在 Apple 的电子邮件中,他们明确表示:
如果您使用的是外部库或 SDK,它们可能会引用需要目的字符串的 API。
这意味着您的代码或任何其他库或 SDK 可以使用 CoreLocation 的那一刻,即使您不使用它,您也需要为“使用时”和“始终使用”提供隐私说明。
这也是 Apple 的一项新功能,目前这只是一个警告,但从 2019 年春季开始,新提交将需要它。
CLLocationManager.requestWhenInUseAuthorization()
,否则不会显示要求您使用本地化的警报。苹果分析了每个应用程序代码,看看是否可以调用这样的函数。如果它从未被调用,则不会显示警报。
“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>
出现此问题是因为您尚未包含
<NSLocationAlwaysUsageDescription>
为您的应用程序。当我尝试在 AppStore 上提交我的应用程序时,我遇到了同样的问题。应用程序处理完毕后,我收到了相同的邮件。我刚刚添加了描述,现在它已解决。
希望这可以帮助。
<key>NSLocationAlwaysUsageDescription</key> <string>Always And In Use Permission</string>
有以下几种情况:
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 个。
这些答案都告诉您如何遵守 App Store 规则以避免警告,但真正的解决方法是让 Expo 允许您禁用他们对定位服务的 SDK 要求,除非您实际使用它们 - 我不确定这是否是可能的。
2 月 19 日的同一问题,收到一封电子邮件,其中包含我没有使用的一堆权限,我假设它们来自插件。 Apple 在 3 月 19 日表示这是一项要求,因此我将这些添加到 info.plst 并再次上传。
这确实很愚蠢。
我有 <key>NSLocationWhenInUseUsageDescription </key>
而不是 <key>NSLocationWhenInUseUsageDescription</key>
确保删除尾随空格
我也面临同样的问题,但 27 小时后,我收到了关于批准的电子邮件,即使我什么也没做。因此,请等待大约 24 小时,而不是再次执行所有这些过程。
请查看您从 **App Store Connect ** 收到的电子邮件
https://i.stack.imgur.com/TSW3Z.png
指示
打开 info.plist 文件。添加并从提供的选项中搜索缺少的密钥(例如联系人 = 隐私 - 联系人使用说明) 添加使用说明:
$(PRODUCT_NAME) 需要“在此处提供原因”的联系人访问权限。
https://i.stack.imgur.com/6neIT.png
使用 Xcode 11 复制密钥 NSLocationAlwaysUsageDescription
并将其添加到 Info
-> Custom iOS Target Properties
->单击此选项卡左下角的 +
,然后插入类似 This app requires location access to function properly.
的某种描述作为值。
我的应用也有这个,我什么也没做,但它可以运行良好,下次我认为应该在plist中添加这样的键,只是做一些描述
对上述问题的简短回答——
NSLocationAlwaysUsageDescription
必须使用 Info.plist 文件中的以下描述进行更新
{Your App Name} 需要访问该位置才能建议登革热爆发区。
在我们的例子中,我们在应用程序中使用了 NSLocationWhenInUseUsageDescription
,但没有使用 NSLocationAlwaysUsageDescription
。
阅读评论 here(感谢 matt-oakes),我们使用的依赖框架之一似乎正在使用 NSLocationAlwaysUsageDescription
。
运行我们的应用程序,它不会显示实际的 NSLocationAlwaysUsageDescription 权限模式,所以它看起来只是在后台处理这个。
所以总而言之,将 NSLocationAlwaysUsageDescription
添加到 Info.plist 修复了警告电子邮件,并没有改变应用程序中的任何行为👍🏻
不定期副业成功案例分享
NSLocationAlwaysUsageDescription
应该替换为NSLocationAlwaysAndWhenInUseUsageDescription
和NSLocationWhenInUseUsageDescription
,而不是替换为NSLocationUsageDescription
(正如我之前写的,对不起......)。我已经更新了我的答案以添加对该过程的总结。