首页 > 解决方案 > Xamarin Forms / Xamarin.Essentials - 如何确保已从 iOS 应用程序中授予“始终允许”位置权限

问题描述

我有一个在 iOS 上运行的 Xamarin Forms 应用程序,即使没有在前台运行,它也需要接收位置数据。

当应用程序首次运行时,系统会提示用户从以下选项中授予位置权限:

允许“我的应用”使用您的位置吗?

没有“始终允许”选项。

如果用户选择“允许一次”或“使用应用程序时允许”,则应用程序能够在前台检索设备位置。到目前为止一切都很好。

如果我然后点击设备的主页按钮从应用程序中移除焦点,让它在后台运行,我会在 iOS 提示符后提示我一些(随机数量)时间:

即使您不使用应用程序,也允许“我的应用程序”使用您的位置?

如果用户选择“更改为始终允许”,则应用程序中的所有内容都可以正常工作,包括后台。就像我需要它一样。

但是,在应用程序中,我想执行以下操作:

  1. 与其等待 iOS 等待不确定/未知的时间来提示用户“始终允许”权限,不如在应用程序启动时从应用程序内要求 iOS 提示用户“始终允许”权限。
  2. 检查用户是否已授予所需的“始终允许”权限。

提示用户“始终允许”权限

在应用程序中,我尝试了以下代码,但似乎没有任何区别:

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 用法感兴趣。

当 iOS 最初提示选项“允许一次 / 使用应用程序时允许 / 不允许”时,它使用“NSLocationWhenInUseUsageDescription”消息。

...当 iOS 最终提示用户授予“始终允许”时,它使用“NSLocationAlwaysAndWhenInUseUsageDescription”消息。

但是,我还必须在 Plist.info 中包含“NSLocationAlwaysUsageDescription”,尽管该消息永远不会显示,因为没有它,当应用程序尝试调用“permission.EnsureDeclared()”方法时应用程序崩溃。

用户可以手动设置“始终允许”位置权限

我知道用户可以在应用程序权限中手动启用“始终允许”权限。但是,无论如何,应用程序需要知道“始终允许”位置权限确实已被授予,而不仅仅是“使用时”权限。

任何人都可以提供任何建议吗?

标签: iosxamarinxamarin.formsxamarin.essentials

解决方案


推荐阅读