#xamarin.forms
#xamarin.forms
Вопрос:
Я использую xamarin.forms для своего приложения, и я использую устройство ios. Я хочу проверить, использует ли мое приложение «Всегда» или «При использовании приложения» для определения местоположения в iOS.
var LocationStatus1 = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.LocationAlways);
if (LocationStatus1 == PermissionStatus.Granted)
{
LocationLabel.Text = "Location Always";
}
var LocationStatus2 = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.LocationWhenInUse);
if (LocationStatus2 == PermissionStatus.Granted)
{
LocationLabel.Text = "Location When In Use";
}
Я ожидаю, что когда у моего приложения есть разрешение типа «Всегда», тогда выполняется LocationStatus1 или «При использовании приложения» означает, что выполняется LocationStatus2. Но теперь LocationStatus1 и LocationStatus2 выполняются. Итак, кто-нибудь, пожалуйста, помогите мне решить эту проблему.
Комментарии:
1. Вам нужно будет взглянуть на реализацию перекрестных разрешений. Текущий. Проверьте permissionstatusasync или прочитайте его документ, если это сторонняя библиотека.
Ответ №1:
Причина:
CrossPermissions не может определить разницу между Always и WhenInUse, потому что это только в iOS.
Решение:
Вы можете реализовать его на собственной платформе iOS и получить его с помощью DependencyService.
Обратитесь к следующему коду
в формах
Определите интерфейс
namespace xxx
{
public interface ICheckLocationStatus
{
int CheckLocationStatus();
}
}
в проекте iOS
using xxx;
using xxx.iOS;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using CoreLocation;
[assembly: Dependency(typeof(GetLocationStatus))]
namespace xxx.iOS
{
public class GetLocationStatus : ICheckLocationStatus
{
public int CheckLocationStatus()
{
var status = CLLocationManager.Status;
if(status== CLAuthorizationStatus.AuthorizedAlways)
{
return 0;
}
else if (status == CLAuthorizationStatus.AuthorizedWhenInUse)
{
return 1;
}
else if (status == CLAuthorizationStatus.Denied)
{
return 2;
}
else
{
return 3;
}
}
}
}
И вызовите метод в формах (например, при нажатии кнопки)
private void Button_Clicked(object sender, EventArgs e)
{
int status = DependencyService.Get<ICheckLocationStatus>().CheckLocationStatus();
if (status == 0)
{
DisplayAlert("Title", "Location Always", "Cancel");
}
else if (status == 1)
{
DisplayAlert("Title", "Location WhenInUse", "Cancel");
}
else if (status == 2)
{
DisplayAlert("Title", "Location Denied", "Cancel");
}
else
{
DisplayAlert("Title", "Location Unknown", "Cancel");
}
}