Xamarin.Essentials:İzinler
permissions sınıfı, çalışma zamanı izinlerini denetleme ve isteme olanağı sağlar.
Bu API'yi kullanmaya başlamak için kitaplığın projelerinizde düzgün yüklendiğinden ve ayarlandığından emin olmak için Xamarin.Essentials kullanmaya başlama kılavuzunu okuyun.
Bu API, Android'de çalışma zamanı izinlerini kullanır. Lütfen tam olarak başlatıldığından Xamarin.Essentials ve uygulamanızda izin işlemenin ayarlandığından emin olun.
Android projesinde MainLauncher
veya başlatılan Xamarin.Essentials herhangi bir Activity
proje yönteminde OnCreate
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'de çalışma zamanı izinlerini işlemek için herhangi Xamarin.Essentials bir OnRequestPermissionsResult
almalıdır. 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);
}
Sınıfınızda için Xamarin.Essentials bir başvuru ekleyin:
using Xamarin.Essentials;
bir iznin geçerli durumunu denetlemek için, durumunu almak için belirli izinle birlikte yöntemini kullanın CheckStatusAsync
.
var status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
Gerekli izin bildirilmemişse 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 ve Android'de, kullanıcının geçmişte izni zaten reddedip reddetmediğini algılamak için arayabilirsiniz ShouldShowRationale
.
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 hemen döner Granted
ve bir iletişim kutusu görüntülemez.
var status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
Gerekli izin bildirilmemişse bir PermissionException
oluşturulur.
Bazı platformlarda bir izin isteğinin yalnızca tek bir kez etkinleştirilebileceğini unutmayın. Bir iznin Denied
durumunda olup olmadığını denetlemek ve kullanıcıdan bunu el ile açmasını istemek için geliştirici tarafından başka istemler işlenmelidir.
veya kullanırken CheckStatusAsync
RequestAsync
, sonraki adımları belirlemek için kullanılabilecek bir PermissionStatus
döndürülür:
- Bilinmiyor - İzin bilinmeyen bir durumda
- Reddedildi - Kullanıcı izin isteğini reddetti
- Devre dışı - Özellik cihazda devre dışı bırakıldı
- Verildi - Kullanıcıya izin verildi veya otomatik olarak verildi
- Kısıtlı - Kısıtlı durumda
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 Devre Dışı olarak varsayılan olarak kullanır. Bu, kullanıcının izni reddedip reddetmediğini veya kullanıcıdan ilk kez isteyip istemediğini anlama becerisini sınırlar. ShouldShowRationale
yöntemi, bir eğitim kullanıcı arabiriminin görüntülenip görüntülenmediğini belirlemek için kullanılabilir. Yöntemin döndürmesinin true
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 döndürülecektir false
.
Xamarin.Essentials mümkün olduğunca çok izni soyutlama girişiminde bulunur. 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ıklar vardır. Şu anda kullanılabilir izinler için bir kılavuz aşağıdadır:
Simge Kılavuzu:
- -Destekli
- - Desteklenmiyor/gerekli
İzin | Android | iOS | UWP | watchOS | tvOS | Tizen |
---|---|---|---|---|---|---|
CalendarRead | ||||||
Takvim Yaz | ||||||
Kamera | ||||||
KişilerRead | ||||||
Kişiler Yazma | ||||||
El Feneri | ||||||
LocationWhenInUse | ||||||
LocationAlways | ||||||
Medya | ||||||
Mikrofon | ||||||
Phone | ||||||
Fotoğraflar | ||||||
Anımsatıcılar | ||||||
Algılayıcılar | ||||||
SMS | ||||||
Konuşma | ||||||
StorageRead | ||||||
StorageWrite |
İzin olarak işaretlenirse, her zaman işaretlendiğinde veya istendiğinde döndürülecektir Granted
.
Aşağıdaki kod, bir iznin verilip verilmediğini belirlemek için genel kullanım desenini sunar ve verilmemişse istekte bulunur. Bu kod, sürüm 1.6.0 veya üzeri ile Xamarin.Essentials 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ılabileceği 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;
}
İzinler API'si, içinde olmayan Xamarin.Essentialsek doğrulama veya izinler gerektiren uygulamalar için esnek ve genişletilebilir olacak şekilde oluşturulmuştur. öğesinden BasePermission
devralan yeni bir sınıf oluşturun ve gerekli soyut yöntemleri uygulayın.
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 uygulanırken sınıfı BasePlatformPermission
öğesinden devralınabilir. Bu, bildirimleri otomatik olarak denetlemek için ek platform yardımcı yöntemleri sağlar. Bu, gruplandırmalar için özel izinler oluştururken yardımcı olabilir. Örneğin, aşağıdaki özel izni kullanarak Android'de depolamaya 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();
}
Ardından Android projesinden yeni izninizi çağırabilirsiniz.
await Permissions.RequestAsync<ReadWriteStoragePermission>();
Bu API'yi paylaşılan kodunuzdan çağırmak isterseniz bir arabirim oluşturabilir ve bir bağımlılık hizmeti kullanarak kaydolabilir ve uygulamayı alabilirsiniz.
public interface IReadWritePermission
{
Task<PermissionStatus> CheckStatusAsync();
Task<PermissionStatus> RequestAsync();
}
Ardından platform projenizde arabirimini 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 çözümleyebilir ve kullanabilirsiniz:
var readWritePermission = DependencyService.Get<IReadWritePermission>();
var status = await readWritePermission.CheckStatusAsync();
if (status != PermissionStatus.Granted)
{
status = await readWritePermission.RequestAsync();
}
İzinler, Android Bildirim dosyasında ayarlanmış eşleşen özniteliklere sahip olmalıdır. İzin durumu varsayılan olarak Reddedildi olarak değişir.
Xamarin.Android'de İzinler belgeleri hakkında daha fazla bilgi edinin.
Channel 9 ve YouTube'da daha fazla Xamarin videosu bulun.