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:
您需要包含
NSLocationWhenInUseUsageDescription
和NSLocationAlwaysAndWhenInUseUsageDescription
应用程序中的键 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 中的位置访问请求的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 ALAssetsLibrary 访问照片而不在 iOS5 中请求位置访问?
当 mapView 请求用户权限时,使用 iOS 访问他们的位置