최근 Xamarin.forms에서 sdk 수준을 6.0으로 업데이트했습니다. Xaml을 사용하여 페이지에지도를 배치했습니다. 6.0으로 업데이트했기 때문에지도를 표시하려면 권한이 필요합니다. 내 문제는 앱이지도를 표시하기 전에지도 표시 권한을 요청하는 방법을 알 수 없다는 것입니다. 결과적으로 처리되지 않은 예외가 발생합니다.
public MapPage()
{
Init();
InitializeComponent();
azureService = AzureService.defaultManager;
}
private async Task Init()
{
await RequestLocationPermission();
}
protected async override void OnAppearing()
{
base.OnAppearing();
MyMap.MoveToRegion(
MapSpan.FromCenterAndRadius(
new Position(0, 0),
Distance.FromMiles(10.0)));
}
private async Task RequestLocationPermission()
{
try
{
var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Location);
if (status != PermissionStatus.Granted)
{
if (await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Location))
{
await DisplayAlert("Need location", "Gunna need that location", "OK");
}
var results = await CrossPermissions.Current.RequestPermissionsAsync(new[] { Permission.Location });
status = results[Permission.Location];
}
if (status == PermissionStatus.Granted)
{
}
else if (status != PermissionStatus.Unknown)
{
await DisplayAlert("Location Denied", "Can not continue, try again.", "OK");
}
}
catch (Exception ex)
{
}
}
지도가 Xaml로 설정된 경우 표시하기 전에 권한을 요청하려면 어떻게해야합니까?
생성자가 지금 설정되는 방식은 별도의 스레드에서 실행되는 작업에서 권한 요청을 시작하는 것입니다. 즉, 사용자가 권한을 부여하기 전에 InitializeComponent ()가 실행될 수 있습니다. 문제는 생성자를 비동기 메서드로 만들 수 없으므로이 문제를 해결하는 쉬운 방법이 없다는 것입니다.
많은 노력없이이 작업을 수행하려면 생성자에서 InitializeComponent ()를 "if (status == PermissionStatus.Granted)"블록으로 이동할 수 있습니다. 아마도 다음과 같이 보일 것입니다.
if (status == PermissionStatus.Granted)
{
Device.BeginInvokeOnMainThread(() =>
{
InitializeComponent()
});
}
이 접근 방식을 사용하면 InitializeComponent () 전에 호출 될 수 있으므로 OnAppearing ()에서 수행하는 작업에주의해야합니다. 해당 시점에서 UI 구성 요소에 액세스하려고하면 실패합니다.
그러나 이것을 처리하는 더 좋은 방법은 권한 요청 코드를 한 수준 위로 이동하는 것입니다. 즉,이 페이지를 인스턴스화하는 클래스에 넣으십시오. 그런 다음 액세스가 허용 된 경우이 페이지를 표시하거나 액세스가 거부 된 경우지도가없는 다른 페이지를 표시 할 수 있습니다. 더 나은 사용자 경험을 제공 할 것입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다