繁体   English   中英

iOS:让“位置”出现在应用设置中而不请求位置授权(平铺应用示例)

[英]iOS: make "Location" appear in the app settings without requesting for location authorization (Tile app example)

长话短说:

我想让“位置”出现在应用程序设置中,而不像 Tile 应用程序那样请求位置授权。

图片:Tile 在应用设置中有位置,无需请求位置授权

重现步骤:

  1. 安装磁贴应用程序。
    • 应用程序设置中没有“位置”。
  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.authorizedAlwaysWhile 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()应该在viewWillAppearUIApplication.willEnterForegroundNotification事件之后调用(例如,当用户从设置返回时)。

在 iOS 12 上,如果没有事先征得许可,“位置”不会出现在应用程序设置中。 但是你可以直接请求Always权限(没有两个步骤),所以这不是必需的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM