Xamarin.Essentials: İzinler

İzinler sınıfı, çalışma zamanı izinlerini denetleme ve isteme özelliğini sağlar.

başlarken

Bu API 'yi kullanmaya başlamak için, kitaplığın projelerinizde düzgün bir şekilde yüklendiğinden ve ayarlandığından emin olmak için Başlarken Kılavuzunu okuyun.

Bu API, Android üzerinde çalışma zamanı izinlerini kullanır. Lütfen Xamarin.Essentials uygulamanızın tam olarak başlatılmış ve izin işlemenin uygulamanızda ayarlandığından emin olun.

Android projesinde MainLauncher veya başlatılan ' de, ActivityXamarin.EssentialsOnCreate yönteminde başlatılmalıdır:

protected override void OnCreate(Bundle savedInstanceState) 
{
    //...
    base.OnCreate(savedInstanceState);
    Xamarin.Essentials.Platform.Init(this, savedInstanceState); // add this line to your code, it may also be called: bundle
    //...
}    

Android üzerinde çalışma zamanı izinlerini işlemek için Xamarin.Essentials herhangi bir almalıdır OnRequestPermissionsResult . Aşağıdaki kodu tüm Activity sınıflara ekleyin:

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
{
    Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

Izinleri kullanma

Sınıfınıza bir başvuru ekleyin Xamarin.Essentials :

using Xamarin.Essentials;

Izinler denetleniyor

Bir iznin geçerli durumunu denetlemek için, CheckStatusAsync durumunu almak üzere belirli bir izinle birlikte yöntemi kullanın.

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

PermissionExceptionGerekli izin bildirilmemiş ise oluşturulur.

İznin istenmeden önce durumunu denetlemesi en iyisidir. Kullanıcıya hiç istem yoksa, her işletim sistemi farklı bir varsayılan durum döndürür. iOS geri Unknown dönirken diğerleri döndürülür Denied . Durum Granted daha sonra, başka çağrılar yapmaya gerek yoktur. İOS 'ta, bu durum, Denied kullanıcının ShouldShowRationale geçmişte izin daha önce reddetmiş olup olmadığını algılamak için çağrıp ayarlar ve Android üzerinde izni değiştirmesini istebilmelisiniz.

İzin İsteme

Kullanıcılardan izin istemek için, RequestAsync yöntemini istemek üzere belirli bir izinle birlikte kullanın. Kullanıcı daha önce izin vermiş ve iptal edilmediği takdirde, bu yöntem Granted hemen döndürülür ve bir iletişim kutusu görüntülemez.

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

PermissionExceptionGerekli izin bildirilmemiş ise oluşturulur.

Bazı platformlarda izin isteği yalnızca tek bir kez etkinleştiribileceğine ilişkin unutmayın. Başka istemler, bir iznin durumunda olup olmadığını kontrol etmek Denied ve kullanıcıdan el ile açıp istememesini istemek için geliştirici tarafından işlenmelidir.

İzin durumu

Veya kullanıldığında CheckStatusAsyncRequestAsyncPermissionStatus , sonraki adımları belirlemede kullanılabilecek bir döndürülür:

  • Bilinmiyor-izin bilinmeyen bir durumda
  • Reddedildi-kullanıcı izin isteğini reddetti
  • Devre dışı-Bu özellik cihazda devre dışı bırakıldı
  • Verildi-kullanıcıya izin verildi veya otomatik olarak izin verildi
  • Kısıtlı durumda kısıtlanmış

Iznin neden gerekli olduğunu açıklayın

Uygulamanızın neden belirli bir izne ihtiyacı olduğunu açıklamak en iyi uygulamadır. İOS 'ta, kullanıcıya görüntülenen bir dize belirtmeniz gerekir. Android bu becerisine sahip değildir ve ayrıca varsayılan izin durumunu devre dışı olarak ayarlar. Bu, kullanıcının izni reddetmesinin veya ilk kez kullanıcıya sormasına ilişkin olduğunu bilme özelliğini kısıtlar. ShouldShowRationaleYöntemi, eğitim Kullanıcı arabiriminin görüntülenip görüntülenmediğini anlamak için kullanılabilir. Yöntem bunu döndürürse, true kullanıcının geçmişte izin reddetmiş veya devre dışı bırakıldığı için. Bu yöntem çağrılırken, diğer platformlar her zaman döndürülür false .

Kullanılabilir Izinler

Xamarin.Essentials mümkün olduğunca çok sayıda izin soyut olarak çalışır. Ancak, her işletim sisteminin farklı bir çalışma zamanı izinleri kümesi vardır. Ayrıca, bazı izinler için tek bir API sağlarken farklılık vardır. Şu anda kullanılabilir izinlere yönelik bir kılavuz aşağıda verilmiştir:

Simge Kılavuzu:

  • Tam destek destek-desteklenir
  • Desteklenmez değildir-desteklenmez/gerekli değildir
İzin Android iOS UWP watchOS tvOS Tizen
CalendarRead Android supportedDesteklenen desteklenen iOS supporteddesteklenen desteklenen UWP desteklenmeyen watchOSdesteklenen tvOSdesteklenmeyen Tizendesteklenmeyen
CalendarWrite Android supportedDesteklenen desteklenen iOS supporteddesteklenen desteklenen UWP desteklenmeyen watchOSdesteklenen tvOSdesteklenmeyen Tizendesteklenmeyen
Kamera Android supportedDesteklenen desteklenen iOS supporteddesteklenen desteklenen UWP desteklenmeyen watchOS desteklenmez tvOSdesteklenmeyen Tizen desteklenen
ContactsRead Android supportedDesteklenen desteklenen iOS supporteddesteklenen desteklenen UWP tarafından desteklenen watchOS desteklenmez tvOSdesteklenmeyen Tizendesteklenmeyen
ContactsWrite Android supportedDesteklenen desteklenen iOS supporteddesteklenen desteklenen UWP tarafından desteklenen watchOS desteklenmez tvOSdesteklenmeyen Tizendesteklenmeyen
El Feneri Android supportedDesteklenen desteklenen iOS desteklenmeyen UWP desteklenmeyen watchOS desteklenmez tvOSdesteklenmeyen Tizen desteklenen
Locationwhenınuse Android supportedDesteklenen desteklenen iOS supporteddesteklenen desteklenen UWP tarafından desteklenen watchOSdesteklenen tvOSdesteklenen Tizen desteklenen
LocationAlways Android supportedDesteklenen desteklenen iOS supporteddesteklenen desteklenen UWP tarafından desteklenen watchOSdesteklenen tvOSdesteklenmeyen Tizen desteklenen
Medya Android desteklenmeyen iOS supporteddesteklenen desteklenen UWP desteklenmeyen watchOS desteklenmez tvOSdesteklenmeyen Tizendesteklenmeyen
Mikrofon Android supportedDesteklenen desteklenen iOS supporteddesteklenen desteklenen UWP tarafından desteklenen watchOS desteklenmez tvOSdesteklenmeyen Tizen desteklenen
Telefon Android supportedDesteklenen desteklenen iOS supporteddesteklenen desteklenen UWP desteklenmeyen watchOS desteklenmez tvOSdesteklenmeyen Tizendesteklenmeyen
Fotoğraflar Android desteklenmeyen iOS supporteddesteklenen desteklenen UWP desteklenmeyen watchOS desteklenmez tvOSdesteklenen Tizendesteklenmeyen
Anımsatıcılar Android desteklenmeyen iOS supporteddesteklenen desteklenen UWP desteklenmeyen watchOSdesteklenen tvOSdesteklenmeyen Tizendesteklenmeyen
Sensörlerden Android supportedDesteklenen desteklenen iOS supporteddesteklenen desteklenen UWP tarafından desteklenen watchOSdesteklenen tvOSdesteklenmeyen Tizendesteklenmeyen
Kısa Android supportedDesteklenen desteklenen iOS supporteddesteklenen desteklenen UWP desteklenmeyen watchOS desteklenmez tvOSdesteklenmeyen Tizendesteklenmeyen
Konuşma Android supportedDesteklenen desteklenen iOS supporteddesteklenen desteklenen UWP desteklenmeyen watchOS desteklenmez tvOSdesteklenmeyen Tizendesteklenmeyen
StorageRead Android supportedDesteklenen desteklenen iOS desteklenmeyen UWP desteklenmeyen watchOS desteklenmez tvOSdesteklenmeyen Tizendesteklenmeyen
StorageWrite Android supportedDesteklenen desteklenen iOS desteklenmeyen UWP desteklenmeyen watchOS desteklenmez tvOSdesteklenmeyen Tizendesteklenmeyen

İzin desteklenmiyor olarak işaretlenmişse , her zaman not supported işaretlendiğinde veya istendiğinde döndürülür.

Genel kullanım

Aşağıdaki kod, bir iznin verilip verilmediğini belirlemek için genel kullanım modelini gösterir. Bu kod, Xamarin.Essentials Sürüm 1.6.0 veya sonrası ile kullanılabilen özellikleri kullanır.

public async Task<PermissionStatus> CheckAndRequestLocationPermission()
{
    var 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;
}

Her izin türü, yöntemlerin doğrudan çağrılabilecek şekilde oluşturulmuş bir örneğine sahip olabilir.

public async Task GetLocationAsync()
{
    var status = await CheckAndRequestPermissionAsync(new Permissions.LocationWhenInUse());
    if (status != PermissionStatus.Granted)
    {
        // Notify user permission was denied
        return;
    }

    var location = await Geolocation.GetLocationAsync();
}

public async Task<PermissionStatus> CheckAndRequestPermissionAsync<T>(T permission)
            where T : BasePermission
{
    var status = await permission.CheckStatusAsync();
    if (status != PermissionStatus.Granted)
    {
        status = await permission.RequestAsync();
    }

    return status;
}

Izinleri genişletme

Izinler API 'SI, ' de bulunmayan ek doğrulama veya izinler gerektiren uygulamalar için esnek ve genişletilebilir olacak şekilde oluşturulmuştur Xamarin.Essentials . ' Den devralan BasePermission ve gerekli soyut yöntemleri uygulayan yeni bir sınıf oluşturun.

public class MyPermission : 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();
    }
}

Belirli bir platformda bir izin uygularken, BasePlatformPermission sınıfı öğesinden devralınabilir. Bu, bildirimleri otomatik olarak denetlemek için ek platform Yardımcısı yöntemleri sağlar. Bu, gruplamaları yapan özel izinler oluştururken yardımcı olabilir. Örneğin, aşağıdaki özel izni kullanarak Android üzerinde depolama için hem okuma hem de yazma erişimi isteyebilirsiniz.

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

Daha sonra, Android projesinden yeni izninizi çağırabilirsiniz.

await Permissions.RequestAsync<ReadWriteStoragePermission>();

Paylaşılan kodınızdan bu API 'yi çağırmak isterseniz, bir arabirim oluşturabilir ve uygulamayı kaydetmek ve almak için bir bağımlılık hizmeti kullanabilirsiniz.

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

Daha sonra arabirimi platform projenizde uygulayın:

public class ReadWriteStoragePermission : Xamarin.Essentials.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();
}

Ardından, belirli bir uygulamayı kaydedebilirsiniz:

DependencyService.Register<IReadWritePermission, ReadWriteStoragePermission>();

Ardından, paylaşılan projenizden bunu çözümleyebilir ve kullanabilirsiniz:

var readWritePermission = DependencyService.Get<IReadWritePermission>();
var status = await readWritePermission.CheckStatusAsync();
if (status != PermissionStatus.Granted)
{
    status = await readWritePermission.RequestAsync();
}

Platform uygulama özellikleri

İzinler, Android bildirim dosyasında eşleşen özniteliklerin ayarlanmış olmalıdır. İzin durumu varsayılan olarak reddedildi.

Xamarin. Android belgelerindeki izinlerle ilgili daha fazla bilgi edinin.

API

Channel 9 ve YouTube'da daha fazla Xamarin videoları bulun.