iOS 13 检查 CLLocationManager 的临时授权状态

Posted

技术标签:

【中文标题】iOS 13 检查 CLLocationManager 的临时授权状态【英文标题】:iOS 13 check for provisional authorization status of CLLocationManager 【发布时间】:2019-08-28 09:36:38 【问题描述】:

根据 WWDC 视频https://developer.apple.com/videos/play/wwdc2019/705/,当您请求“AlwaysAuthorization”权限时,您只会看到“When In Use, Once and Don't allow"”。即使您点击“When In Use”,代表回电也会回来如kCLAuthorizationStatusAuthorizedAlways。这是按预期工作的。但是有没有办法找出请求仍然是临时的或实际上总是允许的?

没有与此权限关联的枚举。唯一允许的枚举是:

kCLAuthorizationStatusNotDetermined, kCLAuthorizationStatusDenied, kCLAuthorizationStatusAuthorizedAlways, kCLAuthorizationStatusAuthorizedWhenInUse

因为我想在用户授予“While In Use”权限后立即显示警报,告诉他们该应用只有在您通过系统偏好设置提供“Always Allow”时才能运行,我可以将它们导航到通过点击我的应用程序的系统设置页面,就像 Zenly 的做法一样:https://www.macrumors.com/2019/08/16/app-developers-tracking-restrictions-ios-13/

【问题讨论】:

不,这就是改变的重点。 Apple 将确定何时是提示用户授予更多位置权限的适当时间。 那么唯一的方法是向首次登录并首次启动应用的 iOS 13+ 用户显示此警报? 另外,那篇文章有点误导;并不是没有“总是”选项,你只是没有马上得到它。一段时间后提示用户。您可以尝试一个对话框,但我怀疑 Apple 会拒绝这样做的应用程序,如果他们希望应用程序始终立即拥有,他们为什么会费心做出这种改变。 我理解总是对话框,一旦激活地理围栏等后台活动,它就会立即出现。但是对于刚刚将位置授予使用时的新用户,一旦您将应用程序置于后台,更新就会停止。想象一个位置跟踪应用程序,用户将下载该应用程序并允许使用期间的权限,并开始使用 bg 中的应用程序行走。当记录和可能的步行已经开始时,除非出现临时警报,否则位置更新将停止。让应用在这段时间内没有数据。 在这种情况下,适当的响应是将allowsBackgroundLocationUpdates 设置为true。这样,您的应用将在后台接收位置更新,并且用户将通过蓝色条知道您的应用正在使用他们的位置。步行期间需要定位的应用没有理由需要用户的位置总是 【参考方案1】:

您可以在应用程序进入后台后检查您是否在后台获取位置更新超过 10 秒。如果是,那么您拥有永久的Allow Always。如果没有,那么您拥有临时的Allow Always(或您可以明确检查的任何其他授权)。

【讨论】:

是的,我确实想到了这一点,但是一旦您进入后台,您唯一能做的就是向用户发送本地通知。我想在应用程序的一开始就吸引用户,就像 zenly 应用程序是如何做到的(我在问题中分享的链接) 我喜欢这个建议,但在While In Use 模式和Provisional Always 模式下,位置更新会持续大约 5 秒。所以,Provisional Always不能用这个方法确定。 请执行相同的操作,但等待 10 秒以上(例如 15 秒)。这工作正常。

以上是关于iOS 13 检查 CLLocationManager 的临时授权状态的主要内容,如果未能解决你的问题,请参考以下文章

iOS 13 - 崩溃的 avPlayer.currentTime().seconds 检查

辅助功能检查器无法在 MacOS Catalina 和 Mojave 上的 Xcode 11.x、iOS 13.x 上运行

位置管理器不更新位置ios7

iOS 13.4 应用程序崩溃,消息模糊:前置条件失败:类型检查失败:101,预期文本,得到 _HiddenModifier

如何静态获取用户位置并在其他 iOS 类中使用?

在 iOS 13 中关闭 UIScrollView 指示器清理