Службы определения местоположения Xamarin Forms работают на iOSimulator, но не на сборке Testflight - PullRequest
0 голосов
/ 01 июня 2018

Я работаю над приложением Xamarin Forms, которое запрашивает у пользователя разрешение служб определения местоположения, используя PermissionsPlugin .Я использую Visual Studio 2017 в Windows и виртуальную машину в качестве хоста сборки MAC (macOS High Sierra 10.13.4).

Моя проблема в том, что приложение работает так, как задумано, при развертывании на iOSimulator.Он предлагает пользователю разрешить или запретить использование служб определения местоположения.В симуляторе приложение даже отображается в разделе «Настройки»> «Конфиденциальность»> «Услуги определения местоположения».Но после доставки встроенного файла IPA в Apple и тестирования его с помощью Testflight приложение ничего не запрашивает, а просто загружает на неопределенный срок.Приложение также не указано в разделе «Настройки»> «Конфиденциальность»> «Службы определения местоположения».

Вот код из приложения для запроса разрешения:

    async Task<bool> AskPermission()
    {
        var hasPermission = false;

        try
        {
            var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Location);

            if (status != PermissionStatus.Granted)
            {

                if (await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Location))
                {
                    await App.Current.MainPage.DisplayAlert("Need location", "Allow app to access location?", "OK", "Cancel");
                }

                var results = await CrossPermissions.Current.RequestPermissionsAsync(Permission.Location);

                if (results.ContainsKey(Permission.Location))
                {
                    status = results[Permission.Location];
                }
            }

            if (status == PermissionStatus.Granted)
            {
                hasPermission = true;
            }
            else if (status != PermissionStatus.Unknown)
            {
                await App.Current.MainPage.DisplayAlert("Location Denied", "Can not continue, try again.", "OK");
            }
        }
        catch (Exception ex)
        {

        }

        return hasPermission;
    }

Это один из методов, который вызываетсящелчок кнопки.Затем появляется индикатор активности, поскольку он привязан к логическому значению, которое переключается, когда все методы запускаются / выполняются.

Это пример кода из плагина Джеймса Монтемагно.Я подозреваю, что приложение застряло на await CrossPermissions.Current.RequestPermissionsAsync(Permission.Location).

Я также добавил необходимые дополнения в Info.plist в проекте iOS для приложения:

<key>NSLocationWhenInUseUsageDescription</key>
<string>prompt message</string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>prompt message</string>

Я также протестировал варианты, в которых я использовал NSLocationAlwaysUsageDescription вместо NSLocationWhenInUseUsageDescription, но получиланалогичные результаты ...

Я протестировал это в iOSimulator (iPhone 5, 6, 7, все в 11.3, все работало) и протестировал в Testflight с использованием iPhone 7 и iPad, также как и в 11.3;к сожалению, в обоих случаях диалоговое окно с запросом разрешения не запрашивалось.

Для справки, это работает так, как задумано в Android, как при отладке, так и при тестировании в магазине Play.

1 Ответ

0 голосов
/ 01 июня 2018

Я получил исправление;Мне просто нужно было включить все 3 NSLocationWhenInUseUsageDescription, NSLocationAlwaysUsageDescription и NSLocationWhenInUseUsageDescription ...

. У меня сложилось впечатление, что я могу добавить только один из NSLocationWhenInUseUsageDescription и NSLocationAlwaysUsageDescription.Должно быть, я где-то прочитал устаревший ответ, который произвел на меня неверное впечатление.

...