В этой статье описывается, как использовать класс многоплатформенного пользовательского интерфейса приложений .NET (.NET MAUI). Permissions Этот класс позволяет проверять и запрашивать разрешения во время выполнения. Тип Permissions доступен в Microsoft.Maui.ApplicationModel пространстве имен.
Доступные разрешения
.NET MAUI пытается абстрагировать как можно больше разрешений. Однако у каждой операционной системы есть другой набор разрешений. Несмотря на то что API разрешает доступ к общему разрешению, могут быть различия между операционными системами, связанными с этим разрешением. В следующей таблице описаны доступные разрешения:
В следующей таблице показано ✔️, что разрешение поддерживается и ❌ указывает, что разрешение не поддерживается или не требуется:
Разрешения StorageRead и StorageWrite всегда возвращаются Granted в API Android 33+. Это связано с тем, что базовые разрешения Android READ_EXTERNAL_STORAGE и WRITE_EXTERNAL_STORAGE разрешения больше не доступны из API 33.
Если разрешение помечается как ❌, оно всегда возвращается Granted при проверке или запросе.
Проверка разрешений
Чтобы проверить текущее состояние разрешения, используйте метод Permissions.CheckStatusAsync вместе с конкретным разрешением, состояние которого необходимо получить. В следующем примере проверяется состояние LocationWhenInUse разрешения:
C#
PermissionStatus status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
Прежде чем запрашивать разрешение, рекомендуется проверить его состояние. Каждая операционная система возвращает другое состояние по умолчанию, если пользователю никогда не было предложено. iOS возвращает Unknown, тогда как другие ОС возвращают Denied. Если состояние есть Granted , нет необходимости выполнять другие вызовы. В iOS, если состояние должно быть Denied предложено пользователю изменить разрешение в параметрах. В Android можно вызвать ShouldShowRationale , чтобы определить, уже ли пользователь отказался от разрешения в прошлом.
Limited
В ограниченном состоянии. Только iOS возвращает это состояние.
Запрос разрешений
Чтобы запросить разрешение у пользователей, используйте метод RequestAsync вместе с конкретным разрешением для запроса. Если пользователь ранее предоставил разрешение и не отозвал его, этот метод вернется Granted без отображения диалогового окна пользователю. Разрешения не следует запрашивать из вашего MauiProgram или App класса и запрашивать только после появления первой страницы приложения.
На некоторых платформах запрос на разрешение можно активировать только один раз. Дальнейшие запросы должны обрабатываться разработчиком, чтобы проверить, находится ли разрешение в Denied состоянии, а затем попросите пользователя вручную включить его.
Объясните, почему требуется разрешение
Рекомендуется объяснить пользователю, почему приложению требуется определенное разрешение. В iOS необходимо указать строку, отображаемую пользователю. Android не имеет этой возможности, а также имеет состояние Disabledразрешений по умолчанию. Это ограничивает возможность узнать, отрицает ли пользователь разрешение или если это первый раз, когда запрашивается разрешение. Этот ShouldShowRationale метод можно использовать для определения того, должен ли отображаться информативный пользовательский интерфейс. Если метод возвращается true, это связано с тем, что пользователь отрицал или отключил разрешение в прошлом. Другие платформы всегда возвращаются false при вызове этого метода.
Пример
В следующем коде представлен общий шаблон использования для определения того, было ли предоставлено разрешение, а затем запрашивать его, если это не так.
C#
publicasync Task<PermissionStatus> CheckAndRequestLocationPermission()
{
PermissionStatus status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
if (status == PermissionStatus.Granted)
return status;
if (status == PermissionStatus.Denied && DeviceInfo.Platform == DevicePlatform.iOS)
{
// Prompt the user to turn on in settings// On iOS once a permission has been denied it may not be requested again from the applicationreturn status;
}
if (Permissions.ShouldShowRationale<Permissions.LocationWhenInUse>())
{
// Prompt the user with additional information as to why the permission is needed
}
status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
return status;
}
Расширение разрешений
API разрешений был создан для гибкой и расширяемой для приложений, требующих большей проверки или разрешений, которые не включены в .NET MAUI. Создайте класс, наследующий от Permissions.BasePermissionи реализующий необходимые абстрактные методы. В следующем примере кода показаны основные абстрактные члены, но без реализации:
C#
publicclassMyPermission : Permissions.BasePermission
{
// This method checks if current status of the permission.publicoverride Task<PermissionStatus> CheckStatusAsync()
{
thrownew System.NotImplementedException();
}
// This method is optional and a PermissionException is often thrown if a permission is not declared.publicoverridevoidEnsureDeclared()
{
thrownew System.NotImplementedException();
}
// Requests the user to accept or deny a permission.publicoverride Task<PermissionStatus> RequestAsync()
{
thrownew System.NotImplementedException();
}
// Indicates that the requestor should prompt the user as to why the app requires the permission, because the// user has previously denied this permission.publicoverrideboolShouldShowRationale()
{
thrownew NotImplementedException();
}
}
При реализации разрешения на определенной платформе класс Permissions.BasePlatformPermission может быть унаследован. Этот класс предоставляет дополнительные вспомогательные методы платформы для автоматической проверки объявлений разрешений. Это помогает при создании пользовательских разрешений, которые выполняют группировки, например запрашивать доступ на чтение и запись к хранилищу в Android. В следующем примере кода показано, как запрашивать доступ к хранилищу чтения и записи :
Затем вы проверяете разрешение таким же образом, как и любой другой тип разрешений, предоставленный .NET MAUI:
C#
PermissionStatus status = await Permissions.RequestAsync<ReadWriteStoragePerms>();
Если вы хотите вызвать этот API из кроссплатформенного кода, можно создать интерфейс и зарегистрировать пользовательское разрешение в качестве зависимости в контейнере службы приложения. В следующем примере показан IReadWritePermission интерфейс:
MauiProgram В классе необходимо зарегистрировать интерфейс и его конкретный тип, а также тип, который будет использовать пользовательское разрешение в контейнере службы приложения:
У разрешений должны быть соответствующие атрибуты, заданные в файле манифеста Android. Состояние разрешения по Deniedумолчанию.
Разрешения должны иметь соответствующую строку в файле Info.plist . После запроса разрешения и отказа всплывающее окно больше не появится, если вы запрашиваете разрешение во второй раз. Вы должны запрашивать у пользователя вручную настроить параметры на экране параметров приложений в iOS. Состояние разрешения по Unknownумолчанию.
Различия платформ отсутствуют.
Совместная работа с нами на GitHub
Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.
Отзыв о .NET MAUI
.NET MAUI — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв:
Присоединитесь к серии встреч для создания масштабируемых решений искусственного интеллекта на основе реальных вариантов использования с другими разработчиками и экспертами.
Узнайте, как использовать интерфейс IConnectivity для .NET MAUI в Microsoft.Maui.Networking пространстве имен. С помощью этого интерфейса можно определить, можно ли взаимодействовать с Интернетом и какие сетевые устройства подключены.
Описывает интерфейс IAppInfo в Microsoft.Maui.ApplicationModel пространстве имен, который предоставляет сведения о приложении. Например, он предоставляет имя и версию приложения.
Узнайте, как использовать интерфейс IDeviceInfo для .NET MAUI в Microsoft.Maui.Devices пространстве имен, который предоставляет сведения об устройстве, на котором работает приложение.
Узнайте, как использовать интерфейс IVersionTracking для .NET MAUI, который позволяет проверка версии приложений и номера сборки вместе с дополнительными сведениями.
Узнайте, как открыть телефонный телефонный набор для определенного номера в .NET MAUI. Интерфейс I Телефон Dialer в Microsoft.Maui.ApplicationModel.Communication пространстве имен используется для открытия телефонного абонента.