Oprávnění

Projděte si ukázku. Procházení ukázky

Tento článek popisuje, jak můžete používat třídu .NET Multi-Platform App UI (.NET MAUI). Permissions Tato třída umožňuje kontrolovat a požadovat oprávnění za běhu. Typ Permissions je k dispozici v Microsoft.Maui.ApplicationModel oboru názvů.

Dostupná oprávnění

.NET MAUI se pokouší co nejvíce abstraktovat oprávnění. Každý operační systém má ale jinou sadu oprávnění. I když rozhraní API umožňuje přístup k běžným oprávněním, mohou existovat rozdíly mezi operačními systémy souvisejícími s tímto oprávněním. Následující tabulka popisuje dostupná oprávnění:

Následující tabulka používá ✔️ k označení, že je oprávnění podporováno, a ❌ k označení, že oprávnění není podporované nebo není povinné:

Oprávnění Android iOS Okna tvOS
Baterie ✔️
Bluetooth ✔️
CalendarRead ✔️ ✔️
CalendarWrite ✔️ ✔️
Kamera ✔️ ✔️
ContactsRead ✔️ ✔️
ContactsWrite ✔️ ✔️
Svítilna ✔️
UmístěníWhenInUse ✔️ ✔️ ✔️
LocationAlways ✔️ ✔️
Médium ✔️
Mikrofon ✔️ ✔️
Blízké okolíWifiDevices ✔️
NetworkState ✔️
Telefon ✔️ ✔️
Fotografie ✔️ ✔️
PhotosAddOnly ✔️ ✔️
Připomenutí ✔️
Senzory ✔️ ✔️
Sms ✔️ ✔️
Řeč ✔️ ✔️
StorageRead ✔️
Přepsání úložiště ✔️
Vibrace ✔️

Pokud je oprávnění označeno jako ❌, vždy se vrátí Granted , když je zaškrtnuto nebo požadováno.

Kontrola oprávnění

Pokud chcete zkontrolovat aktuální stav oprávnění, použijte Permissions.CheckStatusAsync metodu spolu s konkrétním oprávněním k získání stavu. Následující příklad zkontroluje stav LocationWhenInUse oprávnění:

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

Vyvolá PermissionException se, pokud není deklarováno požadované oprávnění.

Před vyžádáním je nejlepší zkontrolovat stav oprávnění. Pokud se uživateli nikdy nezobrazí výzva, vrátí každý operační systém jiný výchozí stav. iOS vrátí Unknown, zatímco ostatní vrátí Denied. Pokud je Granted stav, není potřeba provádět další hovory. Pokud je Denied stav v iOSu, měl by se uživateli zobrazit výzva ke změně oprávnění v nastavení. V Androidu můžete volat ShouldShowRationale , abyste zjistili, jestli uživatel už oprávnění v minulosti odepřel.

Stav oprávnění

Při použití CheckStatusAsync nebo RequestAsyncje vrácena PermissionStatus funkce, která se dá použít k určení dalších kroků:

  • Unknown
    Oprávnění je v neznámém stavu nebo v iOSu se uživateli nikdy nezobrazí výzva.

  • Denied
    Uživatel zamítl žádost o oprávnění.

  • Disabled
    Tato funkce je na zařízení zakázaná.

  • Granted
    Uživatel udělil oprávnění nebo se mu automaticky udělí.

  • Restricted
    V omezeném stavu.

  • Limited
    V omezeném stavu. Tento stav vrátí jenom iOS.

Žádost o oprávnění

Pokud chcete požádat o oprávnění od uživatelů, použijte metodu RequestAsync spolu s konkrétním oprávněním k vyžádání. Pokud uživatel dříve udělil oprávnění a neodvolal ho, vrátí se tato metoda Granted bez zobrazení dialogového okna pro uživatele. Oprávnění by neměla být požadována z vaší MauiProgram třídy App a měla by být požadována pouze po zobrazení první stránky aplikace.

Následující příklad požaduje LocationWhenInUse oprávnění:

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

Vyvolá PermissionException se, pokud není deklarováno požadované oprávnění.

Důležité

Na některých platformách může být žádost o oprávnění aktivována pouze jednou. Další výzvy musí zpracovat vývojář, aby zkontroloval, jestli je oprávnění ve Denied stavu, a pak požádejte uživatele, aby ho ručně zapnul.

Vysvětlení, proč je potřeba oprávnění

Osvědčeným postupem je vysvětlit uživateli, proč vaše aplikace potřebuje konkrétní oprávnění. V iOSu musíte zadat řetězec, který se zobrazí uživateli. Android nemá tuto schopnost a také výchozí stav oprávnění .Disabled Tím se omezí možnost zjistit, jestli uživatel oprávnění zamítl nebo jestli se jedná o první žádost o oprávnění. Metodu ShouldShowRationale lze použít k určení, jestli se má zobrazit informativní uživatelské rozhraní. Pokud metoda vrátí true, je to proto, že uživatel zamítl nebo zakázal oprávnění v minulosti. Při volání této metody se vždy vrátí false jiné platformy.

Příklad

Následující kód představuje vzor obecného použití pro určení, jestli bylo uděleno oprávnění, a potom ho požádá, pokud ne.

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;
}

Rozšíření oprávnění

Rozhraní API pro oprávnění byla vytvořena tak, aby byla flexibilní a rozšiřitelná pro aplikace, které vyžadují více ověření nebo oprávnění, která nejsou součástí rozhraní .NET MAUI. Vytvořte třídu, která dědí z Permissions.BasePermissiona implementuje požadované abstraktní metody. Následující příklad kódu ukazuje základní abstraktní členy, ale bez implementace:

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();
    }
}

Při implementaci oprávnění v konkrétní platformě Permissions.BasePlatformPermission může být třída zděděna. Tato třída poskytuje pomocné metody pro další platformu pro automatickou kontrolu deklarací oprávnění. To pomáhá při vytváření vlastních oprávnění, která seskupují , například žádost o přístup ke čtení i zápisu do úložiště v Androidu. Následující příklad kódu ukazuje vyžádání přístupu k úložišti pro čtení a zápis :

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();
}

Oprávnění pak zkontrolujete stejným způsobem jako jakýkoli jiný typ oprávnění, který poskytuje .NET MAUI:

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

Pokud chcete toto rozhraní API volat z kódu pro různé platformy, můžete vytvořit rozhraní a zaregistrovat vlastní oprávnění jako závislost v kontejneru služby aplikace. Následující příklad ukazuje IReadWritePermission rozhraní:

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

Pak implementujte rozhraní ve vlastním oprávnění:

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 Ve třídě byste pak měli zaregistrovat rozhraní a jeho konkrétní typ a typ, který bude využívat vlastní oprávnění v kontejneru služby aplikace:

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

Vlastní implementaci oprávnění je pak možné přeložit a vyvolat z jednoho z vašich typů, jako je například model viewmodel:

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();
        }
    }
}

Rozdíly mezi platformami

Tato část popisuje rozdíly specifické pro platformu s rozhraním API pro oprávnění.

Oprávnění musí mít odpovídající atributy nastavené v souboru manifestu Androidu. Výchozí Deniedstav oprávnění je .