【问题标题】:didDetermineState, didEnterRegion, didExitRegion events not called未调用 didDetermineState、didEnterRegion、didExitRegion 事件
【发布时间】:2017-11-09 14:37:50
【问题描述】:

我有一个基于信标和地理围栏的应用程序可以正常工作一段时间。

但是在更新到 xCode 9 和 iOS 11 之后,当用户在位置授权请求警报中选择唯一正在使用的选项时,这些回调就再也没有触发过。

我不明白这是在后台或关闭应用程序时的加速性能,但在前台没有。

如果用户选择 always 选项,应用会按预期运行,并触发此回调。

知道为什么这些事件没有在前台发生吗?这是预期的表现吗?

【问题讨论】:

  • 您在将使用 XCode 9 构建的应用程序全新安装到 iOS 11 设备上时看到了这一点?
  • 是的,如果用户选择“仅使用中”选项,则此行为会在装有 iOS 11 的设备上发生。即使应用程序在前台,也不会触发回调。在ios 10中,不强制只在使用时提供选项,所以我们从来没有遇到过这个问题。
  • @KepaSantos 请你指导我地理围栏是否退出方法?
  • @Amanpreet 你能再具体一点吗?
  • @KepaSantos 我正在研究地理围栏。我已经设置了半径为 50 米的区域,但奇怪的是,当我距离该区域 100 米时,我进入弹出窗口,而退出弹出窗口需要 300 米或更多米才能显示。地理围栏不符合我 50 米的要求。

标签: ios geolocation location ibeacon


【解决方案1】:

区域监控现在仅支持“始终”共享位置权限。 Apple 概述了支持的内容和不支持的内容:

Location Services Available

【讨论】:

  • 那么地理围栏在此之后还有什么意义呢?有没有办法在授权警报中只为用户提供总是或从不的选项?信标和地理围栏仅在使用模式下无关。
  • 不,您必须从 iOS 11 开始向用户提供这两个选项。您可以做的是添加一个通知,如果用户没有给予“始终”权限,则会弹出警告用户,那么应用程序将无法正常工作。
  • 我们担心它是唯一的选择,即使它不是理想的选择。感谢您的帮助。
【解决方案2】:

现在,如果用户为定位服务选择“使用时”权限而不是“始终”,则在 iOS 11 上会阻止信标监控。为了在 iOS 11 上请求始终权限,必须在他们的 .plist 文件中使用新密钥,名为 NSLocationAlwaysAndWhenInUseUsageDescription

<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>This app needs to access your location so it can tell when you are near a beacon.</string>

以前,您使用此密钥始终获取位置访问权限(但另一个密钥仅在使用时用于请求访问):

<key>NSLocationAlwaysUsageDescription</key>
<string>This app needs to access your location so it can tell when you are near a beacon.</string>

如果您的目标是 iOS 11 及更早版本,则需要这两个键。

如果您未能更新 .plist 以使用新密钥,那么后果会因操作系统版本和用于构建应用程序的 XCode 版本而异:

  • 使用 XCode 8 构建,在 iOS 10 上运行:提示“始终”访问位置。
  • 使用 XCode 8 构建,在 iOS 11 上运行:提示用户选择“始终”或“使用时”位置访问。
  • 使用 XCode 9+ 构建,在 iOS 10 上运行:提示“始终”访问位置。
  • 使用 XCode 9+ 构建,在 iOS 11 上运行:应用根本不会提示位置权限。未授予权限。

在最后一种情况下,如果您尝试在手机上运行此应用程序,权限请求将静默失败,但如果您连接了 XCode,则会在日志中显示以下内容:

Nov 9 11:14:00 Davids-iPod-touch locationd[60] &lt;Notice&gt;: Authorization value kCLClientAuthorizationStatusAuthorizedAlways requested by ‘com.mycompany.MyAppName’ ignored because not in its allowable mask (1)

如果用户确实收到权限提示并授予“使用时”而不是“始终”访问权限,则您将能够使用信标测距 API,但您将无法使用信标监控 API。 (不会调用didEnter、didExit 和didDetermineState。)这在Apple 文档here 的表1 中有记录。

此更改背后的理论是,如果用户仅在使用时授予位置访问权限,Apple 正试图让应用程序开发人员允许有限功能。上面 iOS 11 的新密钥将允许用户选择用户想要授予的两种位置访问权限中的哪一种。如果您真的不想让用户接受“使用时”选项,则无法阻止他们选择它。但是您可以检测到这个选择,然后弹出一个对话框告诉他们该应用程序将无法运行,并指示他们转到设置以更改此选择。您甚至可以做到这一点,以便在他们做出更改之前不会关闭对话框。

【讨论】:

  • 首先,感谢您的完整回复。我们正确配置了 plist,我们还尝试仅在使用模式下请求并查看发生了什么,但回调仍未触发。另一方面,测距仅在使用模式下正常工作。
  • 似乎在您评论时,唯一的选择是仅在使用模式下检测并警告用户该应用程序将无法正确使用其所有功能。
  • 事实是,我们对 Apple 的这一变化并不十分了解,因为它是在“邀请”用户只在使用模式下进行选择,而不是总是提前。使开发人员难以向用户解释此选项的好处。
  • 请理解,为了在仅授予“正在使用”权限时触发回调,事件必须在您的应用打开并处于前台时发生。尝试在关闭所有信标的同时将其保持打开状态。保持打开状态 30 秒或更长时间,然后等待获得 didExit 回调。然后打开信标并等待 didEnter 回调。
  • 是的,我们试试这个,在前台打开应用程序时,没有进入区域或退出区域使用不同的信标触发,或者关闭然后打开或关闭。另一方面,测距事件正在正确地在前台应用程序触发。所以应用程序可以在前台进行测距,但只能在使用模式下进行前台监控。
猜你喜欢
  • 2015-10-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
相关资源
最近更新 更多