Геолокация не работает iOS PCL Xamarin формы

Я пытаюсь определить местоположение устройства с помощью этого примера https://github.com/XLabs/Xamarin-Forms-Labs/wiki/Geolocator. Это работает на симуляторах, но на iPad Air не работает. Мой файл info.plist, содержащий все необходимые ключи для определения местоположения., NSLocationUsageDescription и NSLocationWhenInUseUsageDescription

в коде

if (this.manager.RespondsToSelector(new Selector("requestWhenInUseAuthorization")))
{
    this.manager.RequestWhenInUseAuthorization();
} 

кусок кода, где используется объект Geolocator..

IGeolocator geolocator = null;
geolocator = DependencyService.Get<IGeolocator>();
if (geolocator != null)
{
    if (geolocator.IsGeolocationEnabled)
    {
        try
        {
            if (!geolocator.IsListening)
                geolocator.StartListening(1000, 1000);

            var task = await geolocator.GetPositionAsync(10000, CancellationToken.None);

            if(task != null)
            {
                this.Position = task;
            }

но событие LocationUpdated никогда не срабатывает......

Расположение на устройстве включено.

Если у кого-то есть подобная проблема....... пожалуйста, помогите..... Однажды эта работа на симуляторах.

Я использую VS 2013, Xamarin 3.7, Xamarin.iOS 8.4, iOS 8.1 на iPad Air.

2 ответа

Так что это хорошо работает в симуляторе воздуха iPad? Это похоже на проблему, характерную для используемого вами устройства. Может быть, кто-то нажал "Отмена" во всплывающем окне с разрешенной локацией?

Идти к Settings->General->Restrictions->Location Services, Убедитесь, что все включено и разрешено для вашего приложения. Я также попробовал бы другое приложение и удостоверился бы, что местоположение работает в этом приложении.

Вы пробовали без службы геокатора Xlabs, потому что в прошлый раз, когда я пытался, это было глючно.

Кроме того, в вашем коде я не вижу, что вы прикрепляете обработчик события PositionChanged:

_geolocator.PositionChanged += OnPositionChanged;

Это необходимо, если вы хотите непрерывное местоположение upadte.

Без использования XLabs я бы сделал что-то вроде этого:

  public bool Start(ActivityType activity = ActivityType.Other, bool alsoWhenInBackground = false, LocationAccuracy accuracy = LocationAccuracy.AccurracyBestForNavigation,
                      double minDistanceBetweenUpdatesInMeters = 0, TimeSpan? maxDelayBetweenUpdates = null)
    {
        if (manager != null)
            return true;

        manager = new CLLocationManager();
        manager.Failed += (sender, args) => FireError(args.Error.ToString());
        manager.LocationsUpdated += (sender, args) => FireLocationUpdated(args.Locations);
        //manager.AuthorizationChanged

        manager.ActivityType = (CLActivityType)activity;
        manager.DesiredAccuracy = Accuracies[(int)accuracy];
        if (maxDelayBetweenUpdates != null || minDistanceBetweenUpdatesInMeters > double.Epsilon)
            manager.AllowDeferredLocationUpdatesUntil(minDistanceBetweenUpdatesInMeters, (maxDelayBetweenUpdates ?? TimeSpan.Zero).TotalSeconds);

        if (alsoWhenInBackground)
            manager.PausesLocationUpdatesAutomatically = true;

        //Required: ask for authorization
        if (AuthorizationStatus == AuthorizationStatus.NotDetermined)
            AskAuthorization(alsoWhenInBackground);

        var authStatus = AuthorizationStatus;
        if (authStatus < AuthorizationStatus.AuthorizedAlways && authStatus != AuthorizationStatus.NotDetermined)
        {
            System.Diagnostics.Debug.WriteLine("user denied access to location");

            return false;
        }
        if (authStatus == AuthorizationStatus.AuthorizedWhenInUse && alsoWhenInBackground)
        {
            System.Diagnostics.Debug.WriteLine("alsoWhenInBackground is true, but user denied access to location in background");

            return false;
        }

        manager.StartUpdatingLocation();
        return true;
    }

public bool AskAuthorization(bool alsoWhenInBackground = false)
    {
        if (AuthorizationStatus != AuthorizationStatus.NotDetermined)
            return false;

        if (UIDevice.CurrentDevice.CheckSystemVersion(8, 0))
        {
            if (alsoWhenInBackground)
                manager.RequestAlwaysAuthorization();
            else
                manager.RequestWhenInUseAuthorization();
        }

        return true;
    }
Другие вопросы по тегам