ios - Xamarin Forms / Xamarin.Essentials - 如何确保已从 iOS 应用程序中授予“始终允许”位置权限
问题描述
我有一个在 iOS 上运行的 Xamarin Forms 应用程序,即使没有在前台运行,它也需要接收位置数据。
当应用程序首次运行时,系统会提示用户从以下选项中授予位置权限:
允许“我的应用”使用您的位置吗?
- 允许一次
- 使用应用时允许
- 不允许
没有“始终允许”选项。
如果用户选择“允许一次”或“使用应用程序时允许”,则应用程序能够在前台检索设备位置。到目前为止一切都很好。
如果我然后点击设备的主页按钮从应用程序中移除焦点,让它在后台运行,我会在 iOS 提示符后提示我一些(随机数量)时间:
即使您不使用应用程序,也允许“我的应用程序”使用您的位置?
- 仅在使用时保留
- 更改为始终允许
如果用户选择“更改为始终允许”,则应用程序中的所有内容都可以正常工作,包括后台。就像我需要它一样。
但是,在应用程序中,我想执行以下操作:
- 与其等待 iOS 等待不确定/未知的时间来提示用户“始终允许”权限,不如在应用程序启动时从应用程序内要求 iOS 提示用户“始终允许”权限。
- 检查用户是否已授予所需的“始终允许”权限。
提示用户“始终允许”权限
在应用程序中,我尝试了以下代码,但似乎没有任何区别:
var permission = new Permissions.LocationAlways();
permission.EnsureDeclared();
检查是否已授予“始终允许”权限
在应用程序中,我使用以下代码检查 LocationAlways 权限的状态。
但是,即使用户刚刚授予“使用应用程序时”,并且尚未提示“始终允许”,LocationAlways 权限的状态仍然显示“已授予”。
事实上,据我所知,以下两行代码总是返回相同的状态:
var locationAlwaysPermissionStatus = await Permissions.CheckStatusAsync<Permissions.LocationAlways>();
var locationWhenInUsePermissionStatus = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
信息列表
这些是 Info.plist 中的相关条目。
<array>
<string>fetch</string>
<string>processing</string>
<string>location</string>
</array>
<key>NSLocationAlwaysUsageDescription</key>
<string>(Always message)</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>(Always and in use message)</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>(When in use message)</string>
我不知道它是否相关,但我必须包含所有 3 种消息类型的条目,尽管就我而言,我只对 Always 用法感兴趣。
- NSLocationAlwaysUsageDescription
- NSLocationAlwaysAndWhenInUseUsageDescription
- NSLocationWhenInUseUsageDescription
当 iOS 最初提示选项“允许一次 / 使用应用程序时允许 / 不允许”时,它使用“NSLocationWhenInUseUsageDescription”消息。
...当 iOS 最终提示用户授予“始终允许”时,它使用“NSLocationAlwaysAndWhenInUseUsageDescription”消息。
但是,我还必须在 Plist.info 中包含“NSLocationAlwaysUsageDescription”,尽管该消息永远不会显示,因为没有它,当应用程序尝试调用“permission.EnsureDeclared()”方法时应用程序崩溃。
用户可以手动设置“始终允许”位置权限
我知道用户可以在应用程序权限中手动启用“始终允许”权限。但是,无论如何,应用程序需要知道“始终允许”位置权限确实已被授予,而不仅仅是“使用时”权限。
任何人都可以提供任何建议吗?
解决方案
推荐阅读
- azure - Swagger 在 azure API 管理服务中不起作用
- reactjs - 在地图函数中反应设置有状态变量
- ios - 如何配置 Azure Pipelines 以构建使用 OneSignal 的 iOS 项目?
- reactjs - Typescript 中的 React Data Grid Custom Row Renderer 函数
- python - 从 MS Access 数据库表中获取列时出现 Python 'utf-16-le' 错误
- python - Python Min() 跨数据框列,列 dtype 为 period['M']
- kotlin - Gradle 6.4、Kotlin 和 JPMS
- mongodb - “服务器选择错误:服务器选择超时” Mongodb Go Driver
- c++ - 如何更改 Cygwin 中的 C++ 编译器?
- python - Python:OverflowError long int 太大而无法转换为 int