Как запросить разрешения iOS (камера и местоположение) во время выполнения?

#c# #ios #unity3d

#c# #iOS #unity-игровой движок

Вопрос:

Я создаю приложение в Unity, которое использует камеру телефона и местоположение пользователя. Я хочу, чтобы эти всплывающие окна с разрешениями были показаны пользователю после того, как они прочитают, почему я хочу, чтобы они дали разрешение. Итак, нажатие кнопки «Принять» в приложении должно проверить, есть ли у приложения определенное разрешение, и если нет: попросите это разрешение. Короче говоря, мне нужно: — Способ проверить, есть ли у приложения определенное разрешение — Способ вызвать всплывающее окно с разрешением — (Приятно иметь:) Способ проверить, было ли предоставлено или отклонено разрешение в указанном всплывающем окне

Я уже создал именно это для Android, поскольку Android предоставляет способы сделать это. После поиска в Google я обнаружил, что iOS запрашивает permissionpopups, когда приложение запускает определенную службу, для которой требуется негрантированное разрешение. Это означает, что я мог бы просто запустить службу определения местоположения или камеру, чтобы проверить, есть ли у приложения эти разрешения. Я думаю, что это грязное исправление, поскольку оно требует, чтобы приложение запускало службы, которые в данный момент не нужны.

Ответ №1:

Добро пожаловать в StackOverflow!

Вы можете использовать эту библиотеку:https://github.com/jamesmontemagno/PermissionsPlugin

Если вы хотите получить разрешение на местоположение, вы можете использовать этот код:

 try
{
    var status = await CrossPermissions.Current.CheckPermissionStatusAsync(Permission.Location);
    if (status != PermissionStatus.Granted)
    {
        if(await CrossPermissions.Current.ShouldShowRequestPermissionRationaleAsync(Permission.Location))
        {
            await DisplayAlert("Need location", "Gunna need that location", "OK");
        }

        var results = await CrossPermissions.Current.RequestPermissionsAsync(Permission.Location);
        //Best practice to always check that the key exists
        if(results.ContainsKey(Permission.Location))
            status = results[Permission.Location];
    }

    if (status == PermissionStatus.Granted)
    {
        var results = await CrossGeolocator.Current.GetPositionAsync(10000);
        LabelGeolocation.Text = "Lat: "   results.Latitude   " Long: "   results.Longitude;
    }
    else if(status != PermissionStatus.Unknown)
    {
        await DisplayAlert("Location Denied", "Can not continue, try again.", "OK");
    }
}
catch (Exception ex)
{

    LabelGeolocation.Text = "Error: "   ex;
}
  

Комментарии:

1. Спасибо за ответ! Плагин, вероятно, многоват для того, что мне нужно, поскольку мне нужны только два разрешения iOS. Я также заметил, что всегда запрашивается разрешение календаря? Я не думаю, что у меня должно быть это в моем приложении.

2. Вам не нужно будет запрашивать разрешение календаря, оно вам нужно только в вашем info.plist пожалуйста, проголосуйте и отметьте как ответы, если это помогло вам!

3. О, это хорошие новости! Хотя я не совсем уверен, как использовать этот плагин в моем проекте Unity. На странице github ничего не говорится о Unity, и я не могу найти примеров того, как другие люди внедряли это в свои проекты Unity.