我只在 iOS 上遇到了一个奇怪的问题,我正在使用 Xamarin.Forms.Maps(从 docs 复制粘贴),我的 iOS 模拟器的 Mock 位置为“Apple”,我正在使用 Xamarin.Essentials Geolocation 来获取设备位置:
private async Task ExecuteDisplayCurrentLocationCommand()
{
IsBusy = true;
try
{
MainThread.BeginInvokeOnMainThread(async () =>
{
var request = new GeolocationRequest(GeolocationAccuracy.High, TimeSpan.FromSeconds(10));
var cts = new CancellationTokenSource();
var location = await Geolocation.GetLocationAsync(request, cts.Token);
if (location != null)
{
if (location.IsFromMockProvider)
{
//await App.Current.MainPage.DisplayAlert("Wrong Location", "Your device is giving a false location, please turn on location services in the settings", "Cancel");
Position position1 = new Position(location.Latitude, location.Longitude);
MapSpan mapSpan1 = MapSpan.FromCenterAndRadius(position1, Distance.FromKilometers(8));
Map.MoveToRegion(mapSpan1);
}
Position position = new Position(location.Latitude, location.Longitude);
MapSpan mapSpan = MapSpan.FromCenterAndRadius(position, Distance.FromKilometers(8));
Map.MoveToRegion(mapSpan);
}
//else
//{
// await App.Current.MainPage.DisplayAlert("Can't get location", "", "Cancel");
//}
});
}
catch (FeatureNotSupportedException)
{
await App.Current.MainPage.DisplayAlert("Location feature not supported", "Your device doesn't support location, please use a newer device", "Ok");
}
catch (FeatureNotEnabledException)
{
//await App.Current.MainPage.DisplayAlert("Location isn't enabled", "Your device doesn't have location services enabed, please turn on location services in the settings", "Ok");
}
catch (PermissionException)
{
await App.Current.MainPage.DisplayAlert("Location permission", "Your device isn't giving us permission to use your location, please turn on location services in the settings", "Ok");
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
finally
{
IsBusy = false;
}
}
我正在使用MainThread.BeginInvokeOnMainThread
它,因为它需要在 iOS 上才能工作
奇怪的是,当我运行代码并到达Map.MoveToRegion(mapSpan);
方法if (location.IsFromMockProvider)
中时,它会转到CustomMapRenderer
'sGetViewForAnnotation
并运行该var customPin = GetCustomPin(annotation as MKPointAnnotation);
方法,就好像它试图获取对我来说没有意义的地图图钉一样,这会抛出一个System.Reflection.TargetInvocationException
因为的论点是空CustomPin GetCustomPin(MKPointAnnotation annotation)
的annotation
,当然不应该这样称呼它吗?
奇怪的是对方法的调用:var customPin = GetCustomPin2(annotation as MKPointAnnotation);
实际上将 lat 和 lon 作为参数传递,我很困惑。
它应该首先调用它吗?
有谁知道它为什么这样做?我在 Android 上没有遇到过这个问题,目前无法检查它是否在 Android 上也有同样的问题,但如果有人知道它为什么会这样以及解决方案是什么,请帮忙。
谢谢
编辑
正如 Cole-MSFT 所说,我在GetCustomPin
方法中添加了一个空语句并且它有效
CustomPin GetCustomPin(MKPointAnnotation annotation)
{
Position position;
if (annotation != null)
{
position = new Position(annotation.Coordinate.Latitude, annotation.Coordinate.Longitude);
if (position != null)
{
foreach (var pin in customPins)
{
if (pin.Position == position)
{
return pin;
}
}
}
}
else
{
return null;
}
return null;
}