您如何请求iOS权限?

时间:2019-04-12 18:23:51

标签: xamarin xamarin.ios

我知道对这个问题的回答是“在info.plist中设置它”,但是如果我理解它的工作方式,那么如果用户拒绝了您所请求的权限,他们将不会再次得到提示,从而有效地使您的应用程序变砖了除非您...编写代码以检查权限。那正确吗?因此,我不知道为什么每个人都像在iOS上那样自动运行。您仍然需要检查权限,对吗?

假设我是对的,在哪里可以找到有关如何正确执行操作的文档。我检查了this(解决方案是我不想使用的插件),this(代码太复杂),this((绕不回答)和{{3 }},以及来自Google的其他一些指向我不想使用的this插件。我只想链接到有关如何在iOS上检查和请求权限的文档。有这样的链接吗?

我所看到的像这样:

private bool HasLocationPermission()
{
    return  CoreLocation.CLLocationManager.Status == CoreLocation.CLAuthorizationStatus.Authorized ||
            CoreLocation.CLLocationManager.Status == CoreLocation.CLAuthorizationStatus.AuthorizedAlways ||
            CoreLocation.CLLocationManager.Status == CoreLocation.CLAuthorizationStatus.AuthorizedWhenInUse;
}

但是,当然,这仅用于“位置”权限。我没有在this文档中找到有关要检查的内容的任何信息。关于请求理性或某些东西?在哪里可以找到该怎么做?请没有插件。

1 个答案:

答案 0 :(得分:3)

如果您研究链接到的权限插件中的代码,则可以轻松推断出您要做的事情。

在iOS中,有两种不同类型的位置权限,要使它们中的任何一种都起作用,您需要在Info.plist中设置一些说明,当提示权限对话框时将显示这些说明。

根据您的需要设置NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription。这种模式之间的区别是。在使用时,用于偶尔需要定位服务的地方,即用于简要显示地图。通常情况下,对于需要始终跟踪用户位置的应用程序来说,总是如此。

Info.plist中的部分类似于:

<key>NSLocationWhenInUseUsageDescription</key>
<string>Do you want My App to access your location?</string>

您已经知道可以使用CoreLocationCLLocationManager来获取当前的权限状态:

var locationManager = new CLLocationManager();
var status = locationManager.Status;

状态为:

  • NotDetermined-该应用尚未获得许可,或者甚至从未要求过它。
  • AuthorizedAlways-如果您请求始终定位并添加了密钥NSLocationAlwaysUsageDescription
  • AuthorizedWhenInUse-如果您请求使用时位置并添加了密钥NSLocationWhenInUseUsageDescription
  • Denied-用户说“不,谢谢”

如果要请求权限,只需致电:

locationManager.RequestAlwaysAuthorization(); // for always
locationManager.RequestWhenInUseAuthorization(); // for when in use

您可以通过AuthorizationChanged事件来听取授权更改:

locationManager.AuthorizationChanged += OnAuthorizationChanged;

CLAuthorizationChangedEventArgs将为您提供新的状态。您甚至可能在请求权限之前就挂上它。

private void OnAuthorizationChanged(object sender, CLAuthorizationChangedEventArgs args)
{
    if (args.Status == CLAuthorizationStatus.AuthorizedAlways ||
        args.Status == CLAuthorizationStatus.AuthorizedWhenInUse)
    {
       // all green, you are good to start listening to location changes!
    }
}

现在您可以开始收听位置更改了:

locationManager.LocationsUpdated += OnLocationsUpdated;
locationManager.StartUpdatingLocation();