我正在构建的应用需要始终访问位置以正常工作。该应用程序基本上会跟踪位置并在地图上标记等(细节不重要,哈哈)。
我的目标是:
1.提示用户启用“始终”位置访问权限 2.如果已请求始终位置访问权限但用户拒绝,则使应用程序无法使用-基本上只显示一个小按钮,将其重定向到设置页面,用户可以更改该设置。
我的AppDelegate.swift实现CLLocationManagerDelegate,并且代码如下:
我的目标是:
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 来跟踪我们是否已经进行了位置权限请求(因为该请求只能执行一次)。
break
和return
语句以及分号。 - Rob