什么条件使 iOS 13 要求用户授予“始终”位置访问权限?

Posted

技术标签:

【中文标题】什么条件使 iOS 13 要求用户授予“始终”位置访问权限?【英文标题】:What conditions make iOS 13 to ask user to grant 'Always' location access? 【发布时间】:2019-10-01 12:33:00 【问题描述】:

我的应用的核心功能是在后台模式下更新位置数据。在 ios 13 中,当我们调用locationManager.requestAlwaysAuthorization() 时,系统会要求用户在变体'Never''Permit Once''When in use' 中进行选择。

如果用户授予'When in use' 访问权限,我们的应用将只能在前台运行。

我无法理解的是: 有时当应用程序进入后台并在一段时间后变得活跃并再次进入后台时,iOS 13 要求用户将位置访问权限更改为 'Always'

我的应用应该怎么做才能让 iOS 13 向用户显示这个对话框? (我想做,当我的应用第一次进入后台时)

附:我知道,我可以使用一些带有文本的自定义警报,例如“请转到系统设置并将此应用的位置访问权限调整为‘始终’模式”。但我需要知道,有什么办法可以使用上述“本机系统流程”吗?

谢谢!

【问题讨论】:

截图在哪里? 当你问的时候我只是在解决这个问题)) 【参考方案1】:

我相信这是 iOS 13 的新行为,here 据说

如果您的应用请求并接收使用时授权,您可以 稍后单独请求始终授权。然而,应用程序 只能提出一次始终授权请求。

也可以参考thread

【讨论】:

谢谢!您的链接非常有用,它可以帮助我解决我的问题【参考方案2】:

@Claudio 的回答帮助我解决了我的问题。我发现它可以在后台访问具有'When in use' 权限的位置。为此,您必须设置locationManager.showsBackgroundLocationIndicator = true

这是我的 locationManager 调整:

        let locationManager = CLLocationManager()
        if #available(iOS 9, *)
            locationManager.allowsBackgroundLocationUpdates = true
        
        locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters
        locationManager.distanceFilter = kCLDistanceFilterNone
        locationManager.headingFilter = kCLHeadingFilterNone
        locationManager.pausesLocationUpdatesAutomatically = true
        locationManager.activityType = .otherNavigation
        if #available(iOS 11.0, *) 
            locationManager.showsBackgroundLocationIndicator = true;
        
        locationManager.delegate = self
        locationManager.startMonitoringSignificantLocationChanges()

【讨论】:

【参考方案3】:

这是 iOS 13 的新行为。苹果已经实施了这一点,以给用户更多的透明度。详细了解这个变化可以参考这个link

【讨论】:

以上是关于什么条件使 iOS 13 要求用户授予“始终”位置访问权限?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 13 中“始终允许”位置的问题

iOS 13 - 请求“使用时”位置权限会阻止我稍后请求“始终”

在 iOS 中切换位置权限

如何在 iOS 应用程序中强制“始终”访问位置

Swift - 如果未授予核心位置请求权限

iOS 13 位置权限 - 从 iOS 12 升级后的行为是啥