我知道对这个问题的回答是“在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文档中找到有关要检查的内容的任何信息。关于请求理性或某些东西?在哪里可以找到该怎么做?请没有插件。
答案 0 :(得分:3)
如果您研究链接到的权限插件中的代码,则可以轻松推断出您要做的事情。
在iOS中,有两种不同类型的位置权限,要使它们中的任何一种都起作用,您需要在Info.plist中设置一些说明,当提示权限对话框时将显示这些说明。
根据您的需要设置NSLocationAlwaysUsageDescription
或NSLocationWhenInUseUsageDescription
。这种模式之间的区别是。在使用时,用于偶尔需要定位服务的地方,即用于简要显示地图。通常情况下,对于需要始终跟踪用户位置的应用程序来说,总是如此。
Info.plist
中的部分类似于:
<key>NSLocationWhenInUseUsageDescription</key>
<string>Do you want My App to access your location?</string>
您已经知道可以使用CoreLocation
和CLLocationManager
来获取当前的权限状态:
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();