Bagikan melalui


Izin

Telusuri sampel. Telusuri sampel

Artikel ini menjelaskan bagaimana Anda dapat menggunakan kelas .NET Multi-platform App UI (.NET MAUI). Permissions Kelas ini memungkinkan Anda untuk memeriksa dan meminta izin pada run-time. Permissions Jenis tersedia di Microsoft.Maui.ApplicationModel namespace layanan.

Izin yang tersedia

.NET MAUI mencoba mengabstraksi izin sebanyak mungkin. Namun, setiap sistem operasi memiliki serangkaian izin yang berbeda. Meskipun API mengizinkan akses ke izin umum, mungkin ada perbedaan antara sistem operasi yang terkait dengan izin tersebut. Tabel berikut ini menjelaskan izin yang tersedia:

Tabel berikut ini menggunakan ✔️ untuk menunjukkan bahwa izin didukung dan ❌ untuk menunjukkan izin tidak didukung atau tidak diperlukan:

Izin Android iOS Windows tvOS
Baterai ✔️
Bluetooth ✔️
CalendarRead ✔️ ✔️
CalendarWrite ✔️ ✔️
Kamera ✔️ ✔️
ContactsRead ✔️ ✔️
KontakWrite ✔️ ✔️
Senter ✔️
LocationWhenInUse ✔️ ✔️ ✔️
LocationAlways ✔️ ✔️
Media ✔️
Mikrofon ✔️ ✔️
NearbyWifiDevices ✔️
NetworkState ✔️
Nomor ✔️ ✔️
Foto ✔️ ✔️
PhotosAddOnly ✔️ ✔️
Pengingat ✔️
Sensor ✔️ ✔️
Sms ✔️ ✔️
Ucapan ✔️ ✔️
StorageRead ✔️
StorageWrite ✔️
Bergetar ✔️

Jika izin ditandai sebagai ❌, izin akan selalu kembali Granted saat dicentang atau diminta.

Memeriksa izin

Untuk memeriksa status izin saat ini, gunakan Permissions.CheckStatusAsync metode bersama dengan izin tertentu untuk mendapatkan status. Contoh berikut memeriksa status LocationWhenInUse izin:

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

PermissionException dilemparkan jika izin yang diperlukan tidak dinyatakan.

Yang terbaik adalah memeriksa status izin sebelum memintanya. Setiap sistem operasi mengembalikan status default yang berbeda, jika pengguna belum pernah diminta. iOS mengembalikan Unknown, sementara yang lain mengembalikan Denied. Jika statusnya maka Granted tidak perlu melakukan panggilan lain. Di iOS jika statusnya adalah Denied Anda harus meminta pengguna untuk mengubah izin di pengaturan. Di Android, Anda dapat memanggil ShouldShowRationale untuk mendeteksi apakah pengguna telah menolak izin di masa lalu.

Status izin

Saat menggunakan CheckStatusAsync atau RequestAsync, PermissionStatus dikembalikan yang dapat digunakan untuk menentukan langkah-langkah berikutnya:

  • Unknown
    Izin dalam status tidak diketahui, atau di iOS, pengguna belum pernah diminta.

  • Denied
    Pengguna menolak permintaan izin.

  • Disabled
    Fitur ini dinonaktifkan pada perangkat.

  • Granted
    Pengguna memberikan izin atau secara otomatis diberikan.

  • Restricted
    Dalam status terbatas.

  • Limited
    Dalam keadaan terbatas. Hanya iOS yang mengembalikan status ini.

Meminta izin

Untuk meminta izin dari pengguna, gunakan RequestAsync metode bersama dengan izin khusus untuk meminta. Jika pengguna sebelumnya memberikan izin, dan belum mencabutnya, maka metode ini akan kembali Granted tanpa menampilkan dialog kepada pengguna. Izin tidak boleh diminta dari kelas atau App AndaMauiProgram, dan hanya boleh diminta setelah halaman pertama aplikasi muncul.

Contoh berikut meminta LocationWhenInUse izin:

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

PermissionException dilemparkan jika izin yang diperlukan tidak dinyatakan.

Penting

Pada beberapa platform, permintaan izin hanya dapat diaktifkan satu kali. Permintaan lebih lanjut harus ditangani oleh pengembang untuk memeriksa apakah izin dalam Denied status, lalu meminta pengguna untuk mengaktifkannya secara manual.

Menjelaskan mengapa izin diperlukan

Praktik terbaik untuk menjelaskan kepada pengguna Anda mengapa aplikasi Anda memerlukan izin tertentu. Di iOS, Anda harus menentukan string yang ditampilkan kepada pengguna. Android tidak memiliki kemampuan ini, dan juga default status izin ke Disabled. Ini membatasi kemampuan untuk mengetahui apakah pengguna menolak izin atau apakah itu pertama kalinya izin diminta. Metode ShouldShowRationale ini dapat digunakan untuk menentukan apakah UI informatif harus ditampilkan. Jika metode mengembalikan true, ini karena pengguna telah menolak atau menonaktifkan izin di masa lalu. Platform lain selalu kembali false saat memanggil metode ini.

Contoh

Kode berikut menyajikan pola penggunaan umum untuk menentukan apakah izin telah diberikan, lalu memintanya jika belum.

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

Memperluas izin

API Izin dibuat agar fleksibel dan dapat diperluas untuk aplikasi yang memerlukan lebih banyak validasi atau izin yang tidak disertakan dalam .NET MAUI. Buat kelas yang mewarisi dari Permissions.BasePermission, dan terapkan metode abstrak yang diperlukan. Contoh kode berikut menunjukkan anggota abstrak dasar, tetapi tanpa implementasi:

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

Saat menerapkan izin di platform tertentu, Permissions.BasePlatformPermission kelas dapat diwariskan. Kelas ini menyediakan metode pembantu platform tambahan untuk secara otomatis memeriksa deklarasi izin. Ini membantu saat membuat izin kustom yang melakukan pengelompokan , misalnya meminta akses Baca dan Tulis ke penyimpanan di Android. Contoh kode berikut menunjukkan permintaan akses penyimpanan Baca dan Tulis :

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

Anda kemudian memeriksa izin dengan cara yang sama seperti jenis izin lain yang disediakan oleh .NET MAUI:

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

Jika Anda ingin memanggil API ini dari kode lintas platform, Anda dapat membuat antarmuka dan mendaftarkan izin kustom sebagai dependensi dalam kontainer layanan aplikasi. Contoh berikut menunjukkan IReadWritePermission antarmuka:

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

Kemudian terapkan antarmuka dalam izin kustom Anda:

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

Di kelas, MauiProgram Anda kemudian harus mendaftarkan antarmuka dan jenis betonnya, dan jenis yang akan menggunakan izin kustom, dalam kontainer layanan aplikasi:

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

Implementasi izin kustom kemudian dapat diselesaikan dan dipanggil dari salah satu jenis Anda, seperti 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();
        }
    }
}

Perbedaan platform

Bagian ini menjelaskan perbedaan khusus platform dengan API izin.

Izin harus memiliki atribut yang cocok yang diatur dalam file Manifes Android. Status izin default ke Denied.