Я работаю над приложением 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.