gpt4 book ai didi

Swift:CoreLocation 如何知道用户允许什么

转载 作者:行者123 更新时间:2023-11-28 11:24:13 26 4
gpt4 key购买 nike

在我的应用程序中,我通过始终允许选项询问用户位置权限。从 iOS 13 开始,选项始终允许从弹出窗口中删除。所以我必须创建一个流程并检查是否已启用 always 选项。

我以为 CLLocationManager.authorizationStatus() 返回用户选择的选项,但没有。

如果我点击 While using the App 选项,它将返回 .authorizedAlways,如果我转到应用程序的参数位置,我会看到它是 同时使用已启用的 App 选项。我需要知道是否启用了 always 选项

如何做到这一点?

最佳答案

如果您在 iOS 13 上使用 CLLocationManager.requestAlwaysAuthorization() 请求“始终”授权,并且用户在第一个弹出窗口中选择了“允许使用”,那么您的应用会输入所谓的“临时始终授权”模式/状态。在此期间,您的应用看到的权限和您的用户看到的权限是不同的。位置事件不会在后台传递。

Provisional Always 授权在Apple's WWDC 2019 "What's New in Core Location" 中有详细描述。 .

快速总结

  1. 您的应用使用 CLLocationManager.requestAlwaysAuthorization() 请求“始终”授权
  2. 向用户显示此弹出窗口:

First permissions popup

  1. 用户选择“使用时允许”。您应用的 LocationManager 的委托(delegate)方法 locationManager(_,didChangeAuthorization:) 将使用 .authorizedAlways 调用。
  2. 用户在 Settings.app 中看到“While in Use”,但您的应用可以使用任何需要“始终”权限的方法。

Provisional Always Authorization perspectives

  1. 您的应用使用了需要“始终”权限的方法,例如在后台跟踪位置、监控地理围栏事件等。一旦生成这些事件,系统就会保留它们,不会将它们传送到您的应用。<
  2. 当用户不忙时(在手机主屏幕上停留一段时间),他们会看到另一个弹出窗口,他们可以在其中真正授予“始终”授权,从“临时始终”升级或将应用降级为“使用时”授权:

Second permissions popup

  1. 如果用户选择“更改为始终允许”,则事件才会传送到应用程序。 LocationManager 的委托(delegate)方法 locationManager(_,didChangeAuthorization:) 将再次通过 .authorizedAlways 调用,或者如果用户有,将通过 .authorizedWhenInUse 调用选择“仅在使用时保留”。

Provisional Always Authorization agreement

可能的解决方案

此模式旨在向后兼容使用以前的 iOS SDK 版本编写的应用程序。这些应用程序将看到他们期望看到的内容,他们将不会使用“临时始终”授权接收任何事件。

但这带来了挑战,因为没有 API 可以区分真正的“始终”授权和“临时始终”授权。一些可以提供帮助的启发式方法:

  1. 当您第一次在 iOS 13 上请求“Always”授权并收到“Always”作为返回时,这绝对是一个“Provisional Always”授权。
  2. 第二个 locationManager(_,didChangeAuthorization:) 调用具有 .authorizedAlways 状态可以指示用户已将应用提升为“始终”。但这是不可靠的,因为这个方法可以在相同的权限状态下被多次调用。例如,每次启动 LocationManager 时。
  3. 当您最终收到您的事件时。例如,在“临时始终”授权期间,后台不会有定位事件,但如果您开始收到,则表示您真正拥有“始终”权限。这就是我想要的。

关于Swift:CoreLocation 如何知道用户允许什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58816518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com