İzinler

Browse sample. Örneğe göz atın

Bu makalede .NET Çok Platformlu Uygulama Kullanıcı Arabirimi (.NET MAUI) Permissions sınıfını nasıl kullanabileceğiniz açıklanmaktadır. Bu sınıf, çalışma zamanında izinleri denetlemenize ve istemenize olanak tanır. Türü Permissions ad alanında Microsoft.Maui.ApplicationModel kullanılabilir.

Kullanılabilir izinler

.NET MAUI mümkün olduğunca çok izni soyutlama girişiminde bulunur. Ancak, her işletim sisteminin farklı bir izin kümesi vardır. API ortak bir izne erişime izin verse de, bu izinle ilgili işletim sistemleri arasında farklılıklar olabilir. Aşağıdaki tabloda kullanılabilir izinler açıklanmaktadır:

Aşağıdaki tablo, iznin desteklendiğini ve ❌ iznin desteklenmediğini veya gerekli olmadığını belirtmek için kullanır ✔️:

İzin Android iOS Pencereler tvOS
Pil ✔️
CalendarRead ✔️ ✔️
Takvim Yaz ✔️ ✔️
Kamera ✔️ ✔️
KişilerRead ✔️ ✔️
Kişiler Yazma ✔️ ✔️
El Feneri ✔️
LocationWhenInUse ✔️ ✔️ ✔️
LocationAlways ✔️ ✔️
Medya ✔️
Mikrofon ✔️ ✔️
NetworkState ✔️
Telefon ✔️ ✔️
Fotoğraf ✔️ ✔️
FotoğraflarAddOnly ✔️ ✔️
Anımsatıcılar ✔️
Sensör ✔️ ✔️
Sms ✔️ ✔️
Konuşma ✔️ ✔️
Depolama Read ✔️
Depolama Write ✔️
Titreşim ✔️
İzin Android iOS Pencereler tvOS
Pil ✔️
Bluetooth ✔️
CalendarRead ✔️ ✔️
Takvim Yaz ✔️ ✔️
Kamera ✔️ ✔️
KişilerRead ✔️ ✔️
Kişiler Yazma ✔️ ✔️
El Feneri ✔️
LocationWhenInUse ✔️ ✔️ ✔️
LocationAlways ✔️ ✔️
Medya ✔️
Mikrofon ✔️ ✔️
YakındakiWifiDevices ✔️
NetworkState ✔️
Telefon ✔️ ✔️
Fotoğraf ✔️ ✔️
FotoğraflarAddOnly ✔️ ✔️
Anımsatıcılar ✔️
Sensör ✔️ ✔️
Sms ✔️ ✔️
Konuşma ✔️ ✔️
Depolama Read ✔️
Depolama Write ✔️
Titreşim ✔️

bir izin olarak ❌işaretlenirse, her zaman işaretlendiğinde veya istendiğinde geri döner Granted .

İzinleri denetleme

bir iznin geçerli durumunu denetlemek için, durumunu almak için belirli izinle birlikte yöntemini kullanın Permissions.CheckStatusAsync . Aşağıdaki örnek, iznin LocationWhenInUse durumunu denetler:

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

Gerekli izin bildirilirse bir PermissionException oluşturulur.

İstekte bulunmadan önce iznin durumunu denetlemek en iyisidir. Kullanıcıdan hiç sorulmazsa her işletim sistemi farklı bir varsayılan durum döndürür. iOS döndürürken Unknown, diğerleri döndürür Denied. Durum böyleyse Granted başka aramalar yapmanıza gerek yoktur. iOS'ta durum böyleyse Denied , kullanıcıdan ayarlardaki izni değiştirmesini istemeniz gerekir. Android'de, kullanıcının geçmişte izni zaten reddedip reddetmediğini algılamak için arayabilirsiniz ShouldShowRationale .

İzin durumu

veya RequestAsynckullanırkenCheckStatusAsync, sonraki adımları belirlemek için kullanılabilecek bir PermissionStatus döndürülür:

  • Unknown
    İzin bilinmeyen bir durumda veya iOS'ta kullanıcıdan hiçbir zaman istenmedi.

  • Denied
    Kullanıcı izin isteğini reddetti.

  • Disabled
    Özellik cihazda devre dışı bırakıldı.

  • Granted
    Kullanıcı izin verdi veya otomatik olarak verildi.

  • Restricted
    Kısıtlı durumda.

  • Limited
    Sınırlı bir durumda. Yalnızca iOS bu durumu döndürür.

İzin isteme

Kullanıcılardan izin istemek için, isteğin RequestAsync belirli izniyle birlikte yöntemini kullanın. Kullanıcı daha önce izin verdiyse ve iptal etmediyse, bu yöntem kullanıcıya bir iletişim kutusu göstermeden geri döner Granted . İzinler veya App sınıfınızdan MauiProgram istenmemelidir ve yalnızca uygulamanın ilk sayfası göründüğünde istenmelidir.

Aşağıdaki örnek izin istemektedir LocationWhenInUse :

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

Gerekli izin bildirilirse bir PermissionException oluşturulur.

Önemli

Bazı platformlarda izin isteği yalnızca tek bir kez etkinleştirilebilir. Bir iznin Denied durumunda olup olmadığını denetlemek ve ardından kullanıcıdan bunu el ile açmasını istemek için geliştirici tarafından başka istemler işlenmelidir.

İznin neden gerekli olduğunu açıklama

Kullanıcınıza uygulamanızın neden belirli bir izne ihtiyacı olduğunu açıklamak en iyi yöntemdir. iOS'ta, kullanıcıya görüntülenecek bir dize belirtmeniz gerekir. Android'in bu özelliği yoktur ve ayrıca izin durumunu Disabledolarak varsayılan olarak kullanır. Bu, kullanıcının izni reddedip reddetmediğini veya iznin ilk kez istenip istenmediğini anlama becerisini sınırlar. ShouldShowRationale yöntemi, bilgilendirici bir kullanıcı arabiriminin görüntülenip görüntülenmediğini belirlemek için kullanılabilir. yöntemi döndürürse true, bunun nedeni kullanıcının geçmişte izni reddetmesi veya devre dışı bırakmış olmasıdır. Bu yöntem çağrılırken diğer platformlar her zaman geri döner false .

Örnek

Aşağıdaki kod, bir iznin verilip verilmediğini belirlemek için genel kullanım desenini sunar ve verilmediyse bunu ister.

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

İzinleri genişletme

İzinler API'si, .NET MAUI'ye dahil edilmeyen daha fazla doğrulama veya izin gerektiren uygulamalar için esnek ve genişletilebilir olacak şekilde oluşturulmuştur. öğesinden Permissions.BasePermissiondevralan bir sınıf oluşturun ve gerekli soyut yöntemleri uygulayın. Aşağıdaki örnek kod, temel soyut üyeleri gösterir ancak uygulamaz:

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

Belirli bir platformda bir izin uygulanırken sınıfı Permissions.BasePlatformPermission öğesinden devralınabilir. Bu sınıf, izin bildirimlerini otomatik olarak denetlemek için ek platform yardımcı yöntemleri sağlar. Bu, gruplandırmalar için özel izinler oluştururken, örneğin Android'de depolamaya hem Okuma hem de Yazma erişimi istemeye yardımcı olur. Aşağıdaki kod örneğinde Okuma ve Yazma depolama erişimi isteği gösterilmektedir:

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

Ardından izni, .NET MAUI tarafından sağlanan diğer izin türleriyle aynı şekilde denetlersiniz:

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

Bu API'yi platformlar arası kodunuzdan çağırmak isterseniz bir arabirim oluşturabilir ve özel izni uygulamanın hizmet kapsayıcısına bağımlılık olarak kaydedebilirsiniz. Aşağıdaki örnekte arabirimi gösterilmektedir IReadWritePermission :

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

Ardından arabirimini özel izninizde uygulayı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 Daha sonra sınıfında arabirimini ve somut türünü ve özel izni kullanacak türü uygulamanın hizmet kapsayıcısına kaydetmeniz gerekir:

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

Daha sonra özel izin uygulaması çözümlenebilir ve görünüm modeli gibi türlerinizden birinden çağrılabilir:

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

Platform farklılıkları

Bu bölümde, izinler API'siyle platforma özgü farklar açıklanmaktadır.

İzinler, Android Bildirim dosyasında ayarlanmış eşleşen özniteliklere sahip olmalıdır. İzin durumu varsayılan olarak olarak Deniedgösterilir.