长话短说:
我想使“位置”出现在应用设置中,而无需像Tile应用一样请求位置授权。
复制步骤:
- 安装Tile应用。
- 应用设置中没有“位置”。
- 打开该应用程序,接受蓝牙访问请求(这有关系吗?)。
- 应用程序设置中仍然没有“位置”,但是出现了蓝牙。
- 使用该应用程序约20秒钟(不能更短)。
- “位置”出现在应用设置中-如何?
这在下面的视频中显示:
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文件中设置的隐私密钥。