未调用 didDetermineState、didEnterRegion、didExitRegion 事件
didDetermineState, didEnterRegion, didExitRegion events not called
我有一个基于信标和地理围栏的应用程序正常工作了一段时间。
但更新到xCode 9和iOS 11后,当用户在位置授权请求警报中选择仅在使用选项时,这些回调再也不会触发。
我不明白这是在后台或应用程序关闭时的加速性能,但在前台没有。
如果用户 select always 选项,应用会按预期工作,触发此回调。
知道为什么这些事件没有在前台发生吗?这是预期的表现吗?
区域监控现在仅支持 'Always' 共享位置权限。 Apple 在此处概述了受支持的内容和不支持的内容:
如果用户选择 "when in use" 位置服务权限而不是 "always",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>
如果您的目标是 iOS11 以及更早的版本,则需要这两个密钥。
如果您未能更新 .plist 以使用新密钥,则后果会因操作系统版本和用于构建应用程序的 XCode 版本而异:
- 内置 XCode 8,运行 on iOS 10:提示 "always" 位置访问。
- 内置 XCode 8,运行 on iOS 11:提示用户选择 "always" 或 "when in use" 位置访问。
- 内置 XCode 9+,运行 on iOS 10:提示 "always" 位置访问。
- 使用 XCode 9+,运行 在 iOS 11 上构建:应用程序根本不会提示位置权限。未授予权限。
在最后一种情况下,如果您尝试在您的 phone 上 运行 此应用程序,权限请求将无提示地失败,但如果您有 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)
如果用户确实收到权限提示并授予 "When in use" 而不是 "Always" 访问权限,您将能够使用信标测距 API,但无法使用信标监控 API . (不会调用 didEnter、didExit 和 didDetermineState。)这在 Apple 文档 Table 1 here.
中有记录
此更改背后的理论是,如果用户仅在使用时授予位置访问权限,Apple 正试图让应用程序开发人员允许 有限 功能。上面 iOS 11 的新密钥将允许用户选择用户想要授予的两种位置访问权限中的哪一种。如果你真的不想让用户接受 "when in use" 选项,你不能阻止他们选择它。但是你可以检测到这个选择,然后弹出一个对话框告诉他们应用程序将无法运行,并指示他们去设置来更改这个选择。您甚至可以这样做,以便在他们进行更改之前无法关闭对话框。
我有一个基于信标和地理围栏的应用程序正常工作了一段时间。
但更新到xCode 9和iOS 11后,当用户在位置授权请求警报中选择仅在使用选项时,这些回调再也不会触发。
我不明白这是在后台或应用程序关闭时的加速性能,但在前台没有。
如果用户 select always 选项,应用会按预期工作,触发此回调。
知道为什么这些事件没有在前台发生吗?这是预期的表现吗?
区域监控现在仅支持 'Always' 共享位置权限。 Apple 在此处概述了受支持的内容和不支持的内容:
如果用户选择 "when in use" 位置服务权限而不是 "always",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>
如果您的目标是 iOS11 以及更早的版本,则需要这两个密钥。
如果您未能更新 .plist 以使用新密钥,则后果会因操作系统版本和用于构建应用程序的 XCode 版本而异:
- 内置 XCode 8,运行 on iOS 10:提示 "always" 位置访问。
- 内置 XCode 8,运行 on iOS 11:提示用户选择 "always" 或 "when in use" 位置访问。
- 内置 XCode 9+,运行 on iOS 10:提示 "always" 位置访问。
- 使用 XCode 9+,运行 在 iOS 11 上构建:应用程序根本不会提示位置权限。未授予权限。
在最后一种情况下,如果您尝试在您的 phone 上 运行 此应用程序,权限请求将无提示地失败,但如果您有 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)
如果用户确实收到权限提示并授予 "When in use" 而不是 "Always" 访问权限,您将能够使用信标测距 API,但无法使用信标监控 API . (不会调用 didEnter、didExit 和 didDetermineState。)这在 Apple 文档 Table 1 here.
中有记录此更改背后的理论是,如果用户仅在使用时授予位置访问权限,Apple 正试图让应用程序开发人员允许 有限 功能。上面 iOS 11 的新密钥将允许用户选择用户想要授予的两种位置访问权限中的哪一种。如果你真的不想让用户接受 "when in use" 选项,你不能阻止他们选择它。但是你可以检测到这个选择,然后弹出一个对话框告诉他们应用程序将无法运行,并指示他们去设置来更改这个选择。您甚至可以这样做,以便在他们进行更改之前无法关闭对话框。