iOS:在应用程序设置中显示“位置”而无需请求位置授权(以瓷砖应用为例)

长话短说:

我想使“位置”出现在应用设置中,而无需像Tile应用一样请求位置授权。

iOS:在应用程序设置中显示“位置”而无需请求位置授权(以瓷砖应用为例)

复制步骤:

  1. 安装Tile应用。
    • 应用设置中没有“位置”。
  2. 打开该应用程序,接受蓝牙访问请求(这有关系吗?)。
    • 应用程序设置中仍然没有“位置”,但是出现了蓝牙。
  3. 使用该应用程序约20秒钟(不能更短)。
    • “位置”出现在应用设置中-如何?

这在下面的视频中显示:

https://media.giphy.com/media/h5dPQPbBHzEhdLTrKz/giphy.gif

我该如何实现?


背景-为什么

从iOS 13开始,无法直接向用户要求Always位置授权。当开发人员请求Always授权时,用户只能选择While in Use选项,应用程序将获得Provisional Always授权。在再次提示用户(iOS决定何时)之前,用户将在应用程序设置中看到While in Use授权。

意思是:

    在应用程序设置中
  • Always-> CLAuthorizationStatus.authorizedAlwaysAlways

  • 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授权,如果没有,请提供信息,说明为什么这很重要以及用户如何更改(手动设置)。

但是我们无法区分我们是否具有AlwaysProvisional 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文件中设置的隐私密钥。

PIAOPIAOXUEYAOCHAOXI 回答:iOS:在应用程序设置中显示“位置”而无需请求位置授权(以瓷砖应用为例)

您是否尝试过简单地将X_train_t.head()键放在plist中,然后实例化一个NSLocationAlwaysAndWhenInUseUsageDescription实例并使用它来尝试开始位置更新?我怀疑这将导致条目显示在设置中,即使在未授予权限的情况下位置更新也无法起作用。

,

要在应用设置中显示“位置”而不先征得许可(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()应该在viewWillAppearUIApplication.willEnterForegroundNotification事件之后(例如,当用户从“设置”返回时)调用。

在iOS 12上,如果不先征得许可,“位置”将不会出现在应用设置中。但是您可以直接征求Always许可(无需两个步骤),因此没必要。

本文链接:https://www.f2er.com/2824921.html

大家都在问