【问题标题】:iOS location permission from whenInUse to AlwaysiOS 位置权限从 whenInUse 到 Always
【发布时间】:2023-12-24 01:50:01
【问题描述】:

我想将我的应用程序位置权限从 whenInUse 升级到 always。

根据文档,requestAlwaysAuthorization() API 可以完成这项工作。 这里的问题是 -

仅当使用从不拒绝总是许可时才询问提示。这也只能执行一次。

有什么办法,我可以确定 requestAlwaysAuthorization() 由于上述原因未能显示提示?

可能的解决方案: 当应用第一次请求许可时,我可以将用户决定存储到 UserDefaults 中,因此我会知道它第二次会如何表现。

有没有其他方法可以检查是否出现了提示。

注意:locationManager:didFailWithError: 不做这项工作。我已经试过了。

【问题讨论】:

    标签: ios swift cllocationmanager


    【解决方案1】:

    这可能就是你需要的:

        func isLocationServiceAvailable() -> Bool {
    
            if (CLLocationManager.authorizationStatus() == .authorizedWhenInUse || CLLocationManager.authorizationStatus() == .authorizedAlways) {
                return true;
            }
            return false;
        }
    

    【讨论】:

    • 如果状态是authorizedWhenInUse,我仍然可以在这里要求升级。问题是我只能询问用户是否没有拒绝authorizedAlways(并第二次选择authorizedWhenInUse)
    • 我想知道requestAlwaysAuthorization()这个API有没有提示或者没有提示对话。
    • 不幸的是 AFAIK,如果用户曾经拒绝位置权限,您以后无法确定请求的权限是 .whenInUse 还是 .always。
    • 是的,我们无法确定 Apple 是否显示了 Prompt(由于任何原因).. 有什么解决方法可以了解这一点吗?
    【解决方案2】:

    您需要检查两件事,一是操作系统级别,二是应用级别位置服务是否启用。

    对于使用以下变量的操作系统级别,您可以在 用户默认值

    var osLevellocationServicesEnabled: Bool {
            return CLLocationManager.locationServicesEnabled()
        }
    

    对于使用以下变量的 appLevel,您可以在 用户默认值。例如,如果用户拒绝总是那么 使用以下变量,您可以更新 userdefault yes/no 中的值 相应地,然后基于此您可以提示自定义警报 用户要求手动更新位置设置

    var appLevelLocationServicesEnabled: Bool {
           return CLLocationManager.authorizationStatus() == .authorizedAlways
        }
    

    【讨论】:

    • 它不能解决我的问题...我想知道 requestAlwaysAuthorization() 这个 API 没有提示或没有提示对话。如果它提示我想做一些任务,如果没有,我想做一些其他任务......
    • @user3647675,问题是如果您关闭操作系统位置设置。然后操作系统不会再次提示您对话。您需要手动处理。
    • 我所说的场景是假设操作系统位置设置为 ON
    • 这是iOS级别的弹出窗口,由操作系统控制。但是在关闭操作系统级别弹出窗口后,您可以检查操作系统位置服务是打开还是关闭。然后你就可以自定义你的代码了。