Udostępnij za pośrednictwem


Uprawnienia

Przeglądaj przykład. Przeglądanie przykładu

W tym artykule opisano sposób użycia klasy interfejsu użytkownika aplikacji wieloplatformowej platformy .NET (.NET MAUI). Permissions Ta klasa umożliwia sprawdzanie i żądanie uprawnień w czasie wykonywania. Typ Permissions jest dostępny w Microsoft.Maui.ApplicationModel przestrzeni nazw.

Dostępne uprawnienia

Program .NET MAUI próbuje wyodrębnić jak najwięcej uprawnień. Jednak każdy system operacyjny ma inny zestaw uprawnień. Mimo że interfejs API zezwala na dostęp do typowych uprawnień, mogą istnieć różnice między systemami operacyjnymi związanymi z tym uprawnieniem. W poniższej tabeli opisano dostępne uprawnienia:

W poniższej tabeli użyto ✔️ polecenia , aby wskazać, że uprawnienie jest obsługiwane i ❌ wskazać, że uprawnienie nie jest obsługiwane lub nie jest wymagane:

Uprawnienie Android iOS Windows tvOS
Akumulator ✔️
Bluetooth ✔️
Element CalendarRead ✔️ ✔️
CalendarWrite ✔️ ✔️
Aparat fotograficzny ✔️ ✔️
KontaktyPrzeczytane ✔️ ✔️
KontaktyWrite ✔️ ✔️
Latarka ✔️
LocationWhenInUse ✔️ ✔️ ✔️
LocationAlways ✔️ ✔️
Multimedia ✔️
Mikrofon ✔️ ✔️
NearbyWifiDevices ✔️
NetworkState ✔️
Telefon ✔️ ✔️
Zdjęcia ✔️ ✔️
ZdjęciaAddOnly ✔️ ✔️
PostNotifications ✔️
Przypomnienia ✔️
Czujniki ✔️ ✔️
SMS ✔️ ✔️
Mowa ✔️ ✔️
StorageRead ✔️
StorageWrite ✔️
Wibracje ✔️

Ważne

Uprawnienia StorageRead i StorageWrite zawsze będą zwracane Granted w interfejsie API systemu Android w wersji 33 lub nowszej. Dzieje się tak, ponieważ podstawowe uprawnienia systemu Android READ_EXTERNAL_STORAGE i WRITE_EXTERNAL_STORAGE nie są już dostępne w interfejsie API 33.

Jeśli uprawnienie jest oznaczone jako ❌, zawsze będzie zwracane Granted podczas sprawdzania lub żądania.

Sprawdzanie uprawnień

Aby sprawdzić bieżący stan uprawnienia, użyj Permissions.CheckStatusAsync metody wraz z określonym uprawnieniem, aby uzyskać stan. Poniższy przykład sprawdza stan LocationWhenInUse uprawnienia:

PermissionStatus status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();

Element jest PermissionException zgłaszany, jeśli wymagane uprawnienie nie zostanie zadeklarowane.

Przed zażądaniem tego uprawnienia najlepiej sprawdzić stan uprawnień. Każdy system operacyjny zwraca inny stan domyślny, jeśli użytkownik nigdy nie został wyświetlony monit. System iOS zwraca wartość Unknown, a inne zwracają wartość Denied. Jeśli stan to Granted , nie ma potrzeby nawiązywania innych wywołań. W systemie iOS, jeśli stan to Denied , użytkownik powinien poprosić użytkownika o zmianę uprawnień w ustawieniach. W systemie Android możesz wywołać metodę ShouldShowRationale wykrywania, czy użytkownik odrzucił już uprawnienia w przeszłości.

Stan uprawnień

W przypadku korzystania z elementu CheckStatusAsync lub RequestAsyncPermissionStatus zwracany jest element , którego można użyć do określenia następnych kroków:

  • Unknown
    Uprawnienie jest w nieznanym stanie lub w systemie iOS nigdy nie został wyświetlony monit.

  • Denied
    Użytkownik zaprzeczył żądaniu uprawnień.

  • Disabled
    Funkcja jest wyłączona na urządzeniu.

  • Granted
    Użytkownik przyznał uprawnienie lub jest automatycznie udzielany.

  • Restricted
    W stanie ograniczonym.

  • Limited
    W ograniczonym stanie. Tylko system iOS zwraca ten stan.

Żądanie uprawnień

Aby zażądać uprawnień od użytkowników, użyj RequestAsync metody wraz z określonym uprawnieniem do żądania. Jeśli użytkownik udzielił wcześniej uprawnień i nie odwołał go, ta metoda zwróci Granted się bez wyświetlania użytkownikowi okna dialogowego. Nie należy żądać uprawnień z klasy MauiProgram lub App i powinny być wymagane tylko po pojawieniu się pierwszej strony aplikacji.

Poniższy przykład żąda LocationWhenInUse uprawnień:

PermissionStatus status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();

Element jest PermissionException zgłaszany, jeśli wymagane uprawnienie nie zostanie zadeklarowane.

Ważne

Na niektórych platformach żądanie uprawnień można aktywować tylko raz. Dalsze monity muszą być obsługiwane przez dewelopera, aby sprawdzić, czy uprawnienie jest w Denied stanie, a następnie poproś użytkownika o ręczne włączenie go.

Wyjaśnienie, dlaczego wymagane jest uprawnienie

Najlepszym rozwiązaniem jest wyjaśnienie użytkownikowi, dlaczego aplikacja potrzebuje określonych uprawnień. W systemie iOS należy określić ciąg wyświetlany użytkownikowi. System Android nie ma tej możliwości, a także domyślnie określa stan uprawnień na Disabled. Ogranicza to możliwość sprawdzenia, czy użytkownik odmówił udzielenia uprawnień lub czy jest to pierwszy raz, gdy jest wymagane uprawnienie. Metody ShouldShowRationale można użyć do określenia, czy powinien być wyświetlany informacyjny interfejs użytkownika. Jeśli metoda zwróci truewartość , jest to spowodowane tym, że użytkownik odmówił lub wyłączył uprawnienie w przeszłości. Inne platformy zawsze zwracają false się podczas wywoływania tej metody.

Przykład

Poniższy kod przedstawia ogólny wzorzec użycia na potrzeby określania, czy udzielono uprawnień, a następnie żąda go, jeśli nie.

public async 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 application
        return 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;
}

Rozszerzanie uprawnień

Interfejs API uprawnień został utworzony tak, aby był elastyczny i rozszerzalny dla aplikacji wymagających większej weryfikacji lub uprawnień, które nie są uwzględnione w programie .NET MAUI. Utwórz klasę dziedziczą z Permissions.BasePermissionklasy i implementuj wymagane metody abstrakcyjne. Poniższy przykładowy kod demonstruje podstawowe abstrakcyjne elementy członkowskie, ale bez implementacji:

public class MyPermission : Permissions.BasePermission
{
    // This method checks if current status of the permission.
    public override Task<PermissionStatus> CheckStatusAsync()
    {
        throw new System.NotImplementedException();
    }

    // This method is optional and a PermissionException is often thrown if a permission is not declared.
    public override void EnsureDeclared()
    {
        throw new System.NotImplementedException();
    }

    // Requests the user to accept or deny a permission.
    public override Task<PermissionStatus> RequestAsync()
    {
        throw new 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.
    public override bool ShouldShowRationale()
    {
        throw new NotImplementedException();
    }
}

Podczas implementowania uprawnienia na określonej platformie Permissions.BasePlatformPermission klasę można dziedziczyć. Ta klasa udostępnia dodatkowe metody pomocnika platformy do automatycznego sprawdzania deklaracji uprawnień. Pomaga to w tworzeniu uprawnień niestandardowych, które grupują, na przykład żądając dostępu zarówno do odczytu , jak i zapisu do magazynu w systemie Android. W poniższym przykładzie kodu pokazano żądanie dostępu do magazynu odczytu i zapisu :

public class ReadWriteStoragePerms : Permissions.BasePlatformPermission
{
    public override (string androidPermission, bool isRuntime)[] RequiredPermissions =>
        new List<(string androidPermission, bool isRuntime)>
        {
        (global::Android.Manifest.Permission.ReadExternalStorage, true),
        (global::Android.Manifest.Permission.WriteExternalStorage, true)
        }.ToArray();
}

Następnie sprawdzasz uprawnienie w taki sam sposób, jak każdy inny typ uprawnień dostarczony przez program .NET MAUI:

PermissionStatus status = await Permissions.RequestAsync<ReadWriteStoragePerms>();

Jeśli chcesz wywołać ten interfejs API z kodu międzyplatformowego, możesz utworzyć interfejs i zarejestrować uprawnienie niestandardowe jako zależność w kontenerze usługi aplikacji. W poniższym przykładzie pokazano IReadWritePermission interfejs:

public interface IReadWritePermission
{        
    Task<PermissionStatus> CheckStatusAsync();
    Task<PermissionStatus> RequestAsync();
}

Następnie zaimplementuj interfejs w ramach uprawnień niestandardowych:

public class ReadWriteStoragePermission : Permissions.BasePlatformPermission, IReadWritePermission
{
    public override (string androidPermission, bool isRuntime)[] RequiredPermissions => new List<(string androidPermission, bool isRuntime)>
    {
        (Android.Manifest.Permission.ReadExternalStorage, true),
        (Android.Manifest.Permission.WriteExternalStorage, true)
    }.ToArray();
}

MauiProgram W klasie należy następnie zarejestrować interfejs i jego konkretny typ oraz typ, który będzie używać uprawnień niestandardowych, w kontenerze usługi aplikacji:

builder.Services.AddTransient<MyViewModel>();
builder.Services.AddSingleton<IReadWritePermission, ReadWriteStoragePermission>();

Implementacja uprawnień niestandardowych można następnie rozpoznać i wywołać z jednego z Twoich typów, takich jak model widoku:

public class MyViewModel
{
    IReadWritePermission _readWritePermission;

    public MyViewModel(IReadWritePermission readWritePermission)
    {
        _readWritePermission = readWritePermission;
    }

    public async Task CheckPermissionAsync()
    {
        var status = await _readWritePermission.CheckStatusAsync();
        if (status != PermissionStatus.Granted)
        {
            status = await _readWritePermission.RequestAsync();
        }
    }
}

Różnice między platformami

W tej sekcji opisano różnice specyficzne dla platformy dotyczące interfejsu API uprawnień.

Uprawnienia muszą mieć zgodne atrybuty ustawione w pliku manifestu systemu Android. Stan uprawnień jest domyślnie ustawiony na Denied.