didDetermineState,didEnterRegion,didExitRegion事件未调用

时间:2017-11-09 14:37:50

标签: ios geolocation location ibeacon

我有一个基于灯塔和地理围栏的应用程序正常工作了一段时间。

但是在更新到xCode 9和iOS 11之后,当用户选择位置授权请求警报中的唯一使用选项时,这些回调永远不会再次触发。

我发现这是在后台或应用程序关闭时已经完成的性能,但在前台没有。

如果用户选择“始终”选项,则应用程序将按预期工作,并触发此回调。

知道为什么这些事件不会发生在前景中吗?这是预期的表现吗?

2 个答案:

答案 0 :(得分:3)

区域监控现在仅支持'始终'分享位置许可。 Apple概述了支持的内容以及不支持的内容:

Location Services Available

答案 1 :(得分:3)

如果用户选择"正在使用"对位置服务的许可,而不是"始终"。为了始终请求 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上运行:提示&#34;始终&#34;位置访问。
  • 使用XCode 8构建,在iOS 11上运行:提示&#34;始终&#34;或者&#34;在使用时&#34;用户选择的位置访问。
  • 使用XCode 9+构建,在iOS 10上运行:提示&#34;始终&#34;位置访问。
  • 使用XCode 9+构建,在iOS 11上运行:应用程序根本不会提示位置权限。许可不被授予。

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

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

如果用户确实获得了权限提示并授予&#34;何时使用&#34;而不是&#34;始终&#34;访问,您将能够使用信标测距API,但您将无法使用信标监控API。 (didEnter,didExit和didDetermineState将不会被调用。)这在Apple的文档here的表1中有记录。

enter image description here

这一变化背后的理论是,如果用户仅在使用时授予位置访问权限,Apple正试图让应用开发者允许有限的功能。上面的iOS 11的新密钥将允许用户选择用户想要授予的两种类型的位置访问中的哪一种。如果您真的不想让用户接受&#34;何时使用&#34;选项,你不能阻止他们挑选它。但是你可以检测到这个选择,然后弹出一个对话框,告诉他们应用程序不会工作,并指示他们去设置以更改此选择。你甚至可以这样做,这样对话就不会被解雇,直到他们做出改变。