【发布时间】:2020-12-11 08:08:09
【问题描述】:
我正在构建的应用始终需要位置访问权限才能正常工作。该应用程序基本上会跟踪位置并将其放在地图和其他东西上(细节不重要,哈哈)。
我的目标是这样的:
- 提示用户启用“始终”位置访问
- 如果始终请求位置访问但用户拒绝,则使应用无法使用 - 基本上只需显示一个小按钮,将他们重定向到可以更改该设置的设置。
我的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 函数应该在“while use”授权被授予后再次调用,但这不会发生!为什么这不会发生?取而代之的是,promptUserToChangeLocationSettings() 在用户收到询问他们是否要启用“始终”位置访问的小弹出窗口之前运行并使应用程序无法使用。
有人可以帮我解决这个问题吗? 顺便说一句,我正在使用 UserDefaults 来跟踪我们是否完成了位置许可请求(因为请求只能完成一次)。
【问题讨论】:
-
我会采用不同的方法。询问“使用时”,然后显示解释为什么需要“始终”的信息,然后当他们关闭该屏幕时,询问始终。您还应该仔细考虑“使用时”与背景位置是否足够,您还需要考虑 iOS 14 中位置不精确的影响。
-
两个选项: 1.你可以在使用时请求,在他们授予它之后,然后总是在授权状态更改委托方法中请求。这将立即触发第二个提示(但仅在 iOS 13.4 及更高版本中;例如,在 13.0 中,您不会看到第二个提示)。 2. 总是请求,总是得到临时(使用时看到使用时,授权状态如应用程序看到的授权状态)。然后,当应用程序实际运行它的“始终功能”时,用户将在操作系统选择的那个时间看到第二个提示,要求升级到始终。这是 iOS 13.4 及更高版本中的两个选项。
-
@Rob,选项 1 不是他们已经在做的吗?也许他们没有在 iOS 13.4 或更高版本上进行测试。
-
我只是想概述选项(并明确说明 iOS 版本要求)。
-
顺便说一下,kuinsiho、
break和return语句和分号在 Swift 中不是必需的/不建议使用。
标签: ios swift location cllocationmanager