iOS 13 位置授权流程中的错误?

Posted

技术标签:

【中文标题】iOS 13 位置授权流程中的错误?【英文标题】:Bug in iOS 13 Location Authorization Flow? 【发布时间】:2020-08-06 16:35:38 【问题描述】:

我在 ios 位置授权过程中遇到意外行为。这是我的步骤,包括屏幕抓取

我在 iOS 13 上请求“始终”授权。 我只授予应用“允许一次”授权,该授权授予用户临时“使用时”授权。 我再次请求“始终”授权。 这一次,没有显示授权提示,didChangeAuthorization 委托方法给出了.authorizedAlways 但是,当我在“设置”应用中查看授权状态时,它显示“下次询问”,这对应于.notDetermined 的授权状态。

我的问题

    为什么我第二次请求“始终”授权时没有第二次提示? 为什么委托方法在我没有实际授权的情况下提供.authorizedAlways 状态? 为什么设置应用显示授权状态为.notDetermined,而委托方法说是.authorizedAlways

我觉得这是 iOS 中的一个错误,但我也可能只是误解了授权流程的工作方式。你怎么看?

我没能在iOS13的真机上测试这个,不知道是不是模拟器的问题?

【问题讨论】:

这个WWDC video解释得很好。 @Don 我看过视频,知道 iOS 13 的变化有临时和临时授权。我看不到视频如何解释我提出的三个问题中的任何一个? 该视频似乎非常具体地解决了这些问题。例如。 “因此,您的应用程序始终要求授权,然后用户在使用时授予它。现在,如果用户进入设置,他们将看到您的应用程序具有使用授权。但是,Core Location 已经给你的代表回了电话,说它总是得到授权。”这不是非常具体地回答了问题 2 和 3 吗?并且它谈到第二个“总是”提示不会出现,直到需要始终权限的“事件”发生(例如地理围栏或其他),回答问题 1。 仅供参考,您可能想具体说明您正在谈论的 iOS 13 版本,因为他们在 13.4 中调整了状态更改逻辑。 【参考方案1】:
    用户已被要求在此会话中获得位置权限;他们选择了“允许一次”。如果 iOS 再次提示他们,那会很烦人且令人困惑。 您的应用在第二次请求后升级为“始终临时”状态;允许认为它始终如此,因此您可能构建的任何权限检查逻辑都不会一直要求用户转到设置或其他任何内容。由于该应用并非真的总是对用户隐私没有影响,因此报告“总是”并没有什么坏处 设置应用反映了用户的实际选择,即“下次再问我”。

@Don 在 cmets 中建议的 WWDC video 解释了临时始终权限及其满足应用权限逻辑的目的。

【讨论】:

有趣。我一定是误解了临时Always的目的。我认为它只有在请求 Always 并收到 When in Use 之后才被授予,以便以后可以升级为永久 Always 或保持永久 When in Use。我不知道在让用户选择“允许一次”后再次调用 requestAlwaysAuthorization() 时也会授予它【参考方案2】:
    为什么我第二次请求“始终”授权时没有第二次提示?

在 iOS 13.0 中,仅第二次请求“始终”权限并不能作为触发用户提示的“事件”。您实际上必须执行需要“始终”的操作。

例如,我总是请求,并得到“使用时”提示。我打开了重大更改服务,但始终没有收到提示。只有当我跳上我的车并开始开车离开时,显着的变化才真正触发了“总是”提示。


在 WWDC 2020 视频 What's new in location 中,他们描述了 iOS 13.4 中引入的更改。您可以询问“使用时”并假设用户授予它,您可以询问“始终”并获得第二个警报(这次询问用户是否要升级到“始终”)。您只需要“Privacy - Location When In Use Usage Description”和“Privacy - Location Always and When In Use Usage Description”使用字符串。

【讨论】:

根据@Paulw11 的回答,在用户选择“允许一次”后第二次调用requestAlwaysAuthorization() 后,我收到了临时的始终授权。据我了解,临时 Always 只会在用户请求 Always 并在用户使用应用程序时给予之后才会被授予。我想我希望 CoreLocation 忽略第二个 requestAlwaysAuthorization() 调用,而不是将其升级到临时 Always 有趣的是,我发现在短时间内请求“使用时”后跟“始终”也会触发“始终”权限请求对话框(只要最初授予“使用时” ) @Rob。我了解延迟的 Always 提示仅在生成实际上需要 Always 授权的事件后才会出现。我真正感到困惑的是在第二次调用requestAlwaysAuthorization() 时升级到临时Always。我想我确实理解为什么 CoreLocation 不会再次显示相同的“使用时”提示,因为用户已经看过它,我不明白什么(而且也不认为我在视频或文档中的任何地方都看过)是升级到临时总是调用requestAlwaysAuthorization 两次 上面讨论的视频明确指出,人们应该做任何需要始终获得许可的事情,并且会在适当的时候触发警报。这也适用于我。这种“请求‘总是’两次”不是他们在该视频中推荐的,因此,我不会依赖这种模式。 是的,我知道。当我在应用程序中四处点击时,我只是偶然发现了这一点,并想知道它为什么会这样。我无法根据我从视频中学到的东西来解释这种行为,我想我会在这里问。我确实明白,当我真正想要永久始终授权时,路径是始终请求 -> 用户选择使用时 -> 应用程序执行需要始终权限的操作 -> CoreLocation 在事件进入时显示第二个提示。

以上是关于iOS 13 位置授权流程中的错误?的主要内容,如果未能解决你的问题,请参考以下文章

xcode11 - 在 ios 13 中请求位置服务的授权

Unity Google Play 游戏插件:错误未授权代码 13

我正在使用 integrator.io 创建将 Shopify 交易发送到 NetSuite 中的银行存款的集成流程?但我收到以下错误消息?

iOS 9 中屏幕导航的设备位置路径错误

Mapkit 的位置授权不断抛出此错误:(0x14)“无法插入 COPY_SEND”

命令失败,错误 13(未授权):'未授权