我想使“位置”出现在应用设置中,而无需像Tile应用一样请求位置授权。
复制步骤:
这在下面的视频中显示:
https://media.giphy.com/media/h5dPQPbBHzEhdLTrKz/giphy.gif
我该如何实现?
从iOS 13开始,无法直接向用户要求Always
位置授权。当开发人员请求Always
授权时,用户只能选择While in Use
选项,应用程序将获得Provisional Always
授权。在再次提示用户(iOS决定何时)之前,用户将在应用程序设置中看到While in Use
授权。
意思是:
Always
-> CLAuthorizationStatus.authorizedAlways
和Always
。
Provisional Always
->也是CLAuthorizationStatus.authorizedAlways
,但应用设置中的While in Use
。
这在this Stack Overflow answer中有很好的描述。
The problem is that the application cannot read the location in the background without Always
authorization(可以,但只能持续5到10秒),这极大地限制了某些应用程序(例如iBeacon跟踪器)的主要功能。
一种众所周知的做法是检查该应用程序是否具有Always
授权,如果没有,请提供信息,说明为什么这很重要以及用户如何更改(手动设置)。
但是我们无法区分我们是否具有Always
或Provisional Always
授权状态(at least directly),因此逻辑:
if (CLLocationManager.authorizationStatus() != .authorizedAlways) {
// Prompt the user to change Location access to Always manually in settings
}
不适用于Provisional Always
授权状态。
解决方案可能是要求用户在请求位置授权之前在设置中手动选择Always
,以防止发生Provisional Always
状态。我认为如果不先致电requestAlwaysAuthorization()
是不可能的,但正如上一段视频所述,Tile以某种方式做到了。
我已经有:
NSLocationAlwaysAndWhenInUseUsageDescription
NSLocationAlwaysUsageDescription
NSLocationWhenInUseUsageDescription
在Info.plist文件中设置的隐私密钥。
答案 0 :(得分:0)
您是否尝试过简单地将X_train_t.head()
键放在plist中,然后实例化一个NSLocationAlwaysAndWhenInUseUsageDescription
实例并使用它来尝试开始位置更新?我怀疑这将导致条目显示在设置中,即使在未授予权限的情况下位置更新也无法起作用。
答案 1 :(得分:0)
要在应用设置中显示“位置”而不先征得许可(Always
需要两步选择加入),您需要致电locationManager.requestLocation()
。
func scheduleLocationUpdates() {
if CLLocationManager.locationServicesEnabled() && CLLocationManager.authorizationStatus() == .authorizedAlways {
locationManager.startUpdatingLocation()
// hide full screen instruction (if shown)
} else {
if (UIDevice.current.systemVersion as NSString).floatValue >= 13.0 {
locationManager.requestLocation() // reveal "Location" in app settings (works on iOS 13 only)
// show full screen instruction how to provide "Always authorization"
} else {
if CLLocationManager.authorizationStatus() == .notDetermined {
locationManager.requestAlwaysAuthorization()
} else {
// show full screen instruction how to provide "Always authorization"
}
}
}
}
功能scheduleLocationUpdates()
应该在viewWillAppear
和UIApplication.willEnterForegroundNotification
事件之后(例如,当用户从“设置”返回时)调用。
在iOS 12上,如果不先征得许可,“位置”将不会出现在应用设置中。但是您可以直接征求Always
许可(无需两个步骤),因此没必要。