iOS 11 中的位置访问请求

Posted

技术标签:

【中文标题】iOS 11 中的位置访问请求【英文标题】:Location Access Request in iOS 11 【发布时间】:2018-03-14 16:45:22 【问题描述】:

我在我的应用中请求用户位置。

locationManager.requestAlwaysAuthorization()

这行代码应该返回这个警告信息:

但是,我希望用户仅在“不允许”和“始终允许”之间进行选择。如何删除“仅在使用应用程序时”选项?

知道这是我包含在 info.plist 中的内容,并从 info.plist 的这 3 行中删除任何行会导致应用根本不显示此警报。

【问题讨论】:

【参考方案1】:

它不再是可选的了。

自从 ios 11 发布以来,如果您的应用程序请求始终打开位置 (locationManager.requestAlwaysAuthorization()),用户将自动获得所有三个选项。

与以前的 iOS 版本不同,所有选项必须显示给用户。这导致:您必须为这两个选项添加一个键。

改编自Apple's Article - Requesting Always Authorization:

您需要包含NSLocationWhenInUseUsageDescriptionNSLocationAlwaysAndWhenInUseUsageDescription 应用程序中的键 Info.plist 文件。 (如果您的应用支持 iOS 10 及更早版本,则 NSLocationAlwaysUsageDescription 密钥也是必需的。)如果这些密钥 不存在,授权请求立即失败。

参考:What's New in Location Technologies视频会话。

【讨论】:

您的答案是正确的,但是,我无法将 2 个答案标记为正确答案。【参考方案2】:

根据WWDC 2017 Session 713关于位置技术更新的说法,如果您想请求始终授权,则在链接到 iOS 11 及更高版本时,您应该始终包含“使用时”描述。 iOS 将另外显示一个选项,以在使用时模式下使用位置。

引用会话记录。

因此,对于 iOS 11,我们要求所有使用“始终请求应用”的开发者额外支持 WhenInUse 授权模式。此更改具有追溯性和前瞻性,因此当用户更新到 iOS 11 时,他们将能够授权任何请求始终授权的应用程序,而不是使用 WhenInUse 授权模式。如果您链接到 iOS 11 SDK,则必须提供 WhenInUseUsageDescription。否则,您的应用将无法请求 Always 授权。此外,当您的应用请求 Always 授权时,我们将另外显示一个选项来授予您的应用 WhenInUse 授权。有了这三个新的选项提示,我们也有了一个新的 UsageDescription 字符串。您的应用需要提供 AlwaysAndWhenInUse UsageDescription。由于这是一个不同的密钥,当您链接到新的 iOS 11 SDK 时,您的应用程序必须提供它。对于链接到 iOS 11 及更高版本的应用,Core Location 将不会使用旧的 NSLocationAlways UsageDescription 键。

【讨论】:

【参考方案3】:

如果未设置,您将在调试控制台中看到如下消息:

应用的 Info.plist 必须同时包含 NSLocationAlwaysAndWhenInUseUsageDescription 和 NSLocationWhenInUseUsageDescription 键,以及向用户解释应用如何使用这些数据的字符串值

    打开 Info.plist 作为源代码

    并添加以下xml块:

<key>NSLocationAlwaysUsageDescription</key>
<string>Location always usage description</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>Location always and when in usage description</string>
<key>NSLocationUsageDescription</key>
<string>Location usage desription</string>

【讨论】:

以上是关于iOS 11 中的位置访问请求的主要内容,如果未能解决你的问题,请参考以下文章

xcode11 - 在 ios 13 中请求位置服务的授权

如何使用 ALAssetsLibrary 访问照片而不在 iOS5 中请求位置访问?

当 mapView 请求用户权限时,使用 iOS 访问他们的位置

iOS 8 Mapkit 和位置 - 每天的请求数量是不是有任何限制?

iOS 12:相机访问请求对话框显示默认权限

iOS 13 - 请求“使用时”位置权限会阻止我稍后请求“始终”