CLLocationManager.authorizationStatus() 返回 alwaysInUse 即使在设备设置中选择了 authorizedWhenInUse

标签 cllocationmanager ios13 swift4.2

复制步骤如下:

  • 从设备中完全删除应用程序
  • 从 XCode
  • 安装它
  • 提示时选择“使用时”
  • 在应用中开启区域监控

  • 在第 4 步我检查了这个

    CLLocationManager.authorizationStatus()

    基本上如果没有选择“总是” - 不要打开区域监控。它在 iOS 12 中运行良好。但是现在 iOS 13 中存在一个问题,即使设置清楚地表明选择了“使用时”,它也会“始终”返回我。我很困惑在这里做什么。我是否需要重写整个业务逻辑以以某种方式支持这种奇怪的行为,或者这是苹果的错误?

    根据这里的主题

    https://forums.developer.apple.com/thread/117256

    这是一个已知的错误,但它基本上是 11 月,仍然没有关于修复的信息。关于解决方法的任何建议/想法?

    最佳答案

    为了补充@greenOrange 在他的更新中所写的内容,您在这里遇到的情况与 iOS 13 的“临时性始终”位置权限“功能”有关。

    一些背景:在 iOS 12 及更低版本上,App Store 中的许多应用程序都在请求 authorizedAlways位置访问,但实际上并不需要它。因此,Apple 删除了请求 authorizedAlways 的选项。马上。这有几个含义:

  • 如果您调用requestAlwaysAuthorization()在 iOS 13.0+ 上,弹出的面向用户的对话框永远不会提供实际选择 authorizedAlways 的选项。 .用户将看到的最普遍的选项是 authorizedWhenInUse .
  • 最重要的是:当用户选择 authorizedWhenInUse 时在对话中,应用程序将进入所谓的“始终临时”状态。这意味着(以编程方式)询问当前位置权限设置将返回 authorizedAlways ,即使设置应用程序会显示 authorizedWhenInUse .是的,这非常令人困惑。这里有更多关于此的信息(快进到 4:23 以获得有用的图形):https://developer.apple.com/videos/play/wwdc2019/705
  • 您的应用程序将保持“临时始终”状态,直到操作系统向您的用户显示一个对话,要求他/她保持权限设置为 authorizedWhenInUse或将其更改为 authorizedAlways .这个对话框看起来像一个普通的警报 Controller ,但顶部有一张 map ,显示了应用程序在过去 72 小时内访问用户位置数据的所有地点。注意:此对话框通常出现在手机的主屏幕上,而不是在您的应用程序本身中。
  • “临时总是”状态的最大问题是没有可靠的方法来知道您的应用程序是否在其中。当然,您可以检查用户是否最近安装了该应用程序(例如在过去 72 小时内),但由于没有为此记录的 API,这种方法充其量似乎是有根据的猜测。

  • 然而,在 iOS 13.4 中,Apple 听到了开发社区的痛苦,并为这个问题提供了新的解决方案。因此,从 iOS 13.4 开始,我们可以先调用 requestWhenInUseAuthorization() ,并且假设它是由用户授予的,立即调用 requestAlwaysAuthorization()获得另一个系统对话,提示用户授予 authorizedAlways (并绕过“临时总是”状态)。这显然会对您的 UI/UX 产生影响,但总体而言,对于开发人员而言,这比 iOS 13.0-13.3 的体验更好。它可能不是一个完美的解决方案,但至少它可以帮助我们避免令人困惑的“始终临时”状态。

    有关此 iOS 13.4 更改的更多信息,请参阅此处的 Apple 发行说明(在“定位服务”部分下):https://developer.apple.com/documentation/ios_ipados_release_notes/ios_ipados_13_4_release_notes

    关于CLLocationManager.authorizationStatus() 返回 alwaysInUse 即使在设备设置中选择了 authorizedWhenInUse,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58167889/

    相关文章:

    ios - 如何在 iOS 模拟器中禁用系统位置警报

    swift - 在 Testflight beta 测试中进行测试时应用程序崩溃了

    ios - 如果应用程序在区域内启动,startMonitoringForRegion 不会调用 didEnterRegion

    ios - 在 iOS 13 上的 UIScrollView 中设置 UIRefreshControl

    ios - iOS 13 中出现蓝牙权限请求警报,但应用程序不使用蓝牙

    ios - 收到 iOS 推送通知时如何打开通知 View Controller ?

    swift - CodingKeys 一致性会产生编译器错误

    iphone - iPhone 5 上的 CLLocationManager 标题问题

    ios - 在 iOS 13 上读取 Mifare Ultralight NFC 标签时出现 "Tag connection lost"错误

    ios - 此处使用 '!' 已弃用,将在未来版本中删除 - swift 4.2