0

只在 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;
    }
4

1 回答 1

1

如果您删除插件,问题是否仍然存在Xamarin.Essentials Geolocation

你试过真机吗?


查看定义(从文档复制)

当注解的位置在地图上可见时调用 GetViewForAnnotation 方法,用于在显示之前自定义注解。

Pins如果您未在 map 上设置,则不应调用此方法。

尝试添加以下代码

if(annotation == null)  return null;  //add this line
var customPin = GetCustomPin(annotation as MKPointAnnotation);
于 2021-12-17T05:53:27.697 回答