[英]iOS: make "Location" appear in the app settings without requesting for location authorization (Tile app example)
我想让“位置”出现在应用程序设置中,而不像 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
应用程序设置While in Use
时。
这在Stack Overflow answer 中有很好的描述。
问题是应用程序在没有Always
授权的情况下无法在后台读取位置(它可以,但只能持续 5-10 秒),这极大地限制了某些应用程序(例如 iBeacon 跟踪器)的主要功能。
一个众所周知的做法是检查应用程序是否具有Always
授权,如果没有,则提供描述为什么这很重要以及用户如何更改它的信息(在设置中手动)。
但是我们无法区分我们是Always
还是Provisional Always
授权状态( 至少直接),所以逻辑:
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 文件中设置的隐私密钥。
您是否尝试过简单地将NSLocationAlwaysAndWhenInUseUsageDescription
键放在您的 plist 中,然后实例化一个CLLocationServices
实例并使用它来尝试启动位置更新? 我怀疑这会导致条目出现在设置中,即使位置更新在获得许可之前不会起作用。
要在不事先征得许可的情况下在应用设置中显示“位置”( 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
权限(没有两个步骤),所以这不是必需的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.