gpt4 book ai didi

ios - 如何在 iOS 应用程序中强制访问 'always' 位置

转载 作者:行者123 更新时间:2023-12-01 21:25:46 25 4
gpt4 key购买 nike

我正在构建的应用程序始终需要位置访问权限才能正常工作。该应用程序基本上可以跟踪位置并将其放在 map 和其他东西上(细节不重要,哈哈)。

我的目标是:

  1. 提示用户启用“始终”位置访问权限
  2. 如果总是请求位置访问但用户拒绝,则让该应用无法使用 - 基本上只显示一个小按钮,将他们重定向到可以更改该设置的设置。

我的AppDelegate.swift实现的是CLLocationManagerDelegate,代码如下:

alreadyRequestedLocationWhenInUse = UserDefaults.standard.bool(forKey: "alreadyRequestedLocationWhenInUse")
alreadyRequestedLocationAlways = UserDefaults.standard.bool(forKey: "alreadyRequestedLocationAlways")

func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {

switch CLLocationManager.authorizationStatus() {
case .notDetermined:
if (!alreadyRequestedLocationWhenInUse) {
print("Requesting location access 'while in use'.")
self.locationManager.requestWhenInUseAuthorization();
UserDefaults.standard.set(true, forKey: "alreadyRequestedLocationWhenInUse")
alreadyRequestedLocationWhenInUse = true
} else {
promptToChangeLocationSettings()
}
case .restricted, .denied:
print("No Location access")
promptToChangeLocationSettings()
break;
case .authorizedWhenInUse:
if (!alreadyRequestedLocationAlways) {
print("Requesting location access 'Always'.")
self.locationManager.requestAlwaysAuthorization()
UserDefaults.standard.set(true, forKey: "alreadyRequestedLocationAlways")
alreadyRequestedLocationAlways = true
} else {
promptToChangeLocationSettings()
}
break;
case .authorizedAlways:
self.startLocationMonitoring();
break;
default:
self.locationManager.requestAlwaysAuthorization();
return
}
}

其中 promptToChangeLocationSettings() 是一个正常工作的函数,它将用户带到我的应用程序的设置页面。

问题是在用户退出应用程序并返回之前,不会提示用户启用“始终位置跟踪”。他们被要求获得“使用中”的权限(我知道它的工作方式是他们必须首先同意),但我希望始终提示立即发生!理论上,locationManagerDidChangeAuthorization 函数应该在授予“使用时”授权后再次调用,但这并没有发生!为什么这不会发生?相反,promptUserToChangeLocationSettings() 会运行并使应用程序无法使用,然后用户会收到询问他们是否要启用“始终”位置访问的小弹出窗口。

有人可以帮我解决这个问题吗?顺便说一句,我正在使用 UserDefaults 来跟踪我们是否完成了位置权限请求(因为该请求只能完成一次)。

最佳答案

关于此流程的一些观察,我们首先请求“使用时”,当获得批准后,才请求“始终”(如 WWDC 2020 What's New in Location 中所讨论):

  1. 确保您在设备而非模拟器上运行它。使用模拟器时,您可能看不到随后的“将‘使用时’升级为‘始终’”权限警告。

  2. 此功能是在 iOS 13.4 中引入的。确保您没有在较早的 iOS 13 版本上尝试此操作。在那些较早的版本中,您不会看到升级到“始终”的第二个警告。

  3. 确保您的代码库中的其他地方没有挥之不去的 requestAlwaysAuthorization,这可能会使应用程序处于“临时始终”状态。一旦进入临时状态,您将被锁定在 13.0 的临时流程中。


我知道这不是您想要的,但为了 future 的读者,上述的替代方案是 iOS 13.0 中引入的更简单的“临时始终”流程(在 WWDC 2019 的 What's New in Core Location 中概述) .您只需调用 requestAlwaysAuthorization(永远不要调用 requestWhenInUseAuthorization)。 Apple 的目的是让用户更好地了解正在发生的事情,在应用程序正在使用时显示“使用时”警报,并在应用程序未运行时使用定位服务时自动显示“始终”升级警报.

关于ios - 如何在 iOS 应用程序中强制访问 'always' 位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63531310/

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