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

iOS 13位置授权流中的错误?,ios,swift,core-location,ios13,Ios,Swift,Core Location,Ios13,我在iOS位置授权过程中遇到意外行为。以下是我的步骤,包括屏幕抓取 我在iOS 13上请求“始终”授权 我只授予应用程序“允许一次”授权,即授予用户临时“使用时”授权 我再次请求“始终”授权 这一次,不显示授权提示,didChangeAuthorizationdelegate方法给出.authorizationdalways 但是,当我在设置应用程序中查看授权状态时,它会显示“询问下一次”,这对应于授权状态.notDetermined 我的问题: 为什么在我第二次请求“始终”授权时没有第二次

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

  • 我在iOS 13上请求“始终”授权
  • 我只授予应用程序“允许一次”授权,即授予用户临时“使用时”授权
  • 我再次请求“始终”授权
  • 这一次,不显示授权提示,
    didChangeAuthorization
    delegate方法给出
    .authorizationdalways
  • 但是,当我在设置应用程序中查看授权状态时,它会显示“询问下一次”,这对应于授权状态
    .notDetermined
我的问题

  • 为什么在我第二次请求“始终”授权时没有第二次提示
  • 为什么委托方法在我没有实际给予授权的情况下给出
    .authorizedAllways
    状态
  • 为什么当委托方法说授权状态是
    .authorizedAllways
    时,设置应用程序指示授权状态是
    .notDetermined
  • 我觉得这是iOS中的一个bug,但我可能只是误解了授权流的工作方式。你觉得怎么样

    我还没有能够用iOS13在真实的设备上测试这个,所以我不知道这是否只是模拟器中的一个问题

  • 此会话中已向用户请求位置权限;他们选择了“允许一次”。如果iOS再次提示他们,那将是令人恼火和困惑的
  • 您的应用程序在第二次请求后升级到“临时始终”状态;它可以认为它总是这样,因此您可能构建的任何权限检查逻辑都不会一直要求用户转到设置或其他任何地方。由于该应用程序实际上并不总是对用户隐私没有影响,因此报告“总是”没有害处
  • 设置应用程序反映了用户的实际选择,即“下次再问我”
  • @Don在评论中建议的方法解释了临时的always权限及其用于满足应用程序权限逻辑的目的

  • 为什么在我第二次请求“始终”授权时没有第二次提示
  • 在iOS 13.0中,仅第二次请求“始终”权限不符合触发用户提示的“事件”。实际上,您必须执行需要“始终”的操作

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



    在WWDC 2020视频中,他们描述了iOS 13.4中引入的变化。您可以请求“使用时”,并假设用户已授予,您可以请求“始终”并获得第二个警报(这次询问用户是否要升级到“始终”)。您只需要“隐私-使用时的位置使用说明”和“隐私-位置始终和使用时的位置使用说明”使用字符串。

    这很好地解释了这一点。@Don我看过视频,知道iOS 13在临时和临时授权下的变化。我看不出这段视频如何解释我提出的三个问题中的任何一个?这段视频似乎非常具体地解决了这些问题。例如,“因此,你的应用程序请求始终授权,然后用户在使用时授予它。现在,如果用户转到“设置”,他们会看到你的应用程序在使用时具有授权。但是,Core Location已经给你的代表回了电话,告诉他它收到了始终授权。”这不是非常明确地回答了问题2和3吗?第二个“始终”提示在需要始终权限的“事件”发生之前不会显示(如geofence或其他),回答问题1。仅供参考,您可能需要明确说明您所谈论的iOS 13版本,因为他们在13.4.1中调整了状态更改逻辑。我当时一定是误解了这个计划的目的。我认为只有在请求“始终”并在使用时接收后才能授予它,以便以后可以升级为“永久始终”或在使用时保持“永久”。我不知道再次调用requestAlwaysAuthorization()时也会授予此权限,在用户根据@Paulw11的回答选择“允许一次”后,在用户选择允许一次后第二次调用
    requestAlwaysAuthorization()
    后,我收到了一个临时始终授权。据我所知,临时始终只有在用户请求始终并在使用应用程序时给予之后才能授予。我想我希望CoreLocation忽略第二个
    requestAlwaysAuthorization()
    调用,而不是将其升级为临时always。我发现,短时间后请求“使用中”并后跟“始终”也会触发“始终”权限请求对话框(只要“使用中”最初被授予)@Rob。我理解,只有在生成实际需要始终授权的事件后,才会出现“延迟始终”提示。实际上,我感到困惑的是,第二次调用
    requestAlwaysAuthorization()
    时,总是升级到临时版本。我想我确实理解为什么CoreLocation在再次使用时不会显示相同的提示,因为用户已经看到了它,我不明白的是(而且我也不认为我在视频或文档中看到过任何地方)是否通过调用
    requestAlwaysAuthorization
    两次升级到“临时”始终?上面讨论的视频明确指出,用户只需执行任何需要“始终”权限的操作,这将触发