Uprawnienia
W tym artykule opisano sposób użycia klasy interfejsu użytkownika aplikacji wieloplatformowej platformy .NET (.NET MAUI). Permissions Ta klasa umożliwia sprawdzanie i żądanie uprawnień w czasie wykonywania. Typ Permissions
jest dostępny w Microsoft.Maui.ApplicationModel
przestrzeni nazw.
Dostępne uprawnienia
Program .NET MAUI próbuje wyodrębnić jak najwięcej uprawnień. Jednak każdy system operacyjny ma inny zestaw uprawnień. Mimo że interfejs API zezwala na dostęp do typowych uprawnień, mogą istnieć różnice między systemami operacyjnymi związanymi z tym uprawnieniem. W poniższej tabeli opisano dostępne uprawnienia:
W poniższej tabeli użyto ✔️ polecenia , aby wskazać, że uprawnienie jest obsługiwane i ❌ wskazać, że uprawnienie nie jest obsługiwane lub nie jest wymagane:
Uprawnienie | Android | iOS | Windows | tvOS |
---|---|---|---|---|
Akumulator | ✔️ | ❌ | ❌ | ❌ |
Bluetooth | ✔️ | ❌ | ❌ | ❌ |
Element CalendarRead | ✔️ | ✔️ | ❌ | ❌ |
CalendarWrite | ✔️ | ✔️ | ❌ | ❌ |
Aparat fotograficzny | ✔️ | ✔️ | ❌ | ❌ |
KontaktyPrzeczytane | ✔️ | ✔️ | ❌ | ❌ |
KontaktyWrite | ✔️ | ✔️ | ❌ | ❌ |
Latarka | ✔️ | ❌ | ❌ | ❌ |
LocationWhenInUse | ✔️ | ✔️ | ❌ | ✔️ |
LocationAlways | ✔️ | ✔️ | ❌ | ❌ |
Multimedia | ❌ | ✔️ | ❌ | ❌ |
Mikrofon | ✔️ | ✔️ | ❌ | ❌ |
NearbyWifiDevices | ✔️ | ❌ | ❌ | ❌ |
NetworkState | ✔️ | ❌ | ❌ | ❌ |
Telefon | ✔️ | ✔️ | ❌ | ❌ |
Zdjęcia | ❌ | ✔️ | ❌ | ✔️ |
ZdjęciaAddOnly | ❌ | ✔️ | ❌ | ✔️ |
PostNotifications | ✔️ | ❌ | ❌ | ❌ |
Przypomnienia | ❌ | ✔️ | ❌ | ❌ |
Czujniki | ✔️ | ✔️ | ❌ | ❌ |
SMS | ✔️ | ✔️ | ❌ | ❌ |
Mowa | ✔️ | ✔️ | ❌ | ❌ |
StorageRead | ✔️ | ❌ | ❌ | ❌ |
StorageWrite | ✔️ | ❌ | ❌ | ❌ |
Wibracje | ✔️ | ❌ | ❌ | ❌ |
Ważne
Uprawnienia StorageRead i StorageWrite zawsze będą zwracane Granted w interfejsie API systemu Android w wersji 33 lub nowszej. Dzieje się tak, ponieważ podstawowe uprawnienia systemu Android READ_EXTERNAL_STORAGE
i WRITE_EXTERNAL_STORAGE
nie są już dostępne w interfejsie API 33.
Jeśli uprawnienie jest oznaczone jako ❌, zawsze będzie zwracane Granted podczas sprawdzania lub żądania.
Sprawdzanie uprawnień
Aby sprawdzić bieżący stan uprawnienia, użyj Permissions.CheckStatusAsync metody wraz z określonym uprawnieniem, aby uzyskać stan. Poniższy przykład sprawdza stan LocationWhenInUse
uprawnienia:
PermissionStatus status = await Permissions.CheckStatusAsync<Permissions.LocationWhenInUse>();
Element jest PermissionException zgłaszany, jeśli wymagane uprawnienie nie zostanie zadeklarowane.
Przed zażądaniem tego uprawnienia najlepiej sprawdzić stan uprawnień. Każdy system operacyjny zwraca inny stan domyślny, jeśli użytkownik nigdy nie został wyświetlony monit. System iOS zwraca wartość Unknown, a inne zwracają wartość Denied. Jeśli stan to Granted , nie ma potrzeby nawiązywania innych wywołań. W systemie iOS, jeśli stan to Denied , użytkownik powinien poprosić użytkownika o zmianę uprawnień w ustawieniach. W systemie Android możesz wywołać metodę ShouldShowRationale wykrywania, czy użytkownik odrzucił już uprawnienia w przeszłości.
Stan uprawnień
W przypadku korzystania z elementu CheckStatusAsync lub RequestAsyncPermissionStatus zwracany jest element , którego można użyć do określenia następnych kroków:
Unknown
Uprawnienie jest w nieznanym stanie lub w systemie iOS nigdy nie został wyświetlony monit.Denied
Użytkownik zaprzeczył żądaniu uprawnień.Disabled
Funkcja jest wyłączona na urządzeniu.Granted
Użytkownik przyznał uprawnienie lub jest automatycznie udzielany.Restricted
W stanie ograniczonym.Limited
W ograniczonym stanie. Tylko system iOS zwraca ten stan.
Żądanie uprawnień
Aby zażądać uprawnień od użytkowników, użyj RequestAsync metody wraz z określonym uprawnieniem do żądania. Jeśli użytkownik udzielił wcześniej uprawnień i nie odwołał go, ta metoda zwróci Granted się bez wyświetlania użytkownikowi okna dialogowego. Nie należy żądać uprawnień z klasy MauiProgram
lub App
i powinny być wymagane tylko po pojawieniu się pierwszej strony aplikacji.
Poniższy przykład żąda LocationWhenInUse
uprawnień:
PermissionStatus status = await Permissions.RequestAsync<Permissions.LocationWhenInUse>();
Element jest PermissionException zgłaszany, jeśli wymagane uprawnienie nie zostanie zadeklarowane.
Ważne
Na niektórych platformach żądanie uprawnień można aktywować tylko raz. Dalsze monity muszą być obsługiwane przez dewelopera, aby sprawdzić, czy uprawnienie jest w Denied stanie, a następnie poproś użytkownika o ręczne włączenie go.
Wyjaśnienie, dlaczego wymagane jest uprawnienie
Najlepszym rozwiązaniem jest wyjaśnienie użytkownikowi, dlaczego aplikacja potrzebuje określonych uprawnień. W systemie iOS należy określić ciąg wyświetlany użytkownikowi. System Android nie ma tej możliwości, a także domyślnie określa stan uprawnień na Disabled. Ogranicza to możliwość sprawdzenia, czy użytkownik odmówił udzielenia uprawnień lub czy jest to pierwszy raz, gdy jest wymagane uprawnienie. Metody ShouldShowRationale można użyć do określenia, czy powinien być wyświetlany informacyjny interfejs użytkownika. Jeśli metoda zwróci true
wartość , jest to spowodowane tym, że użytkownik odmówił lub wyłączył uprawnienie w przeszłości. Inne platformy zawsze zwracają false
się podczas wywoływania tej metody.
Przykład
Poniższy kod przedstawia ogólny wzorzec użycia na potrzeby określania, czy udzielono uprawnień, a następnie żąda go, jeśli nie.
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;
}
Rozszerzanie uprawnień
Interfejs API uprawnień został utworzony tak, aby był elastyczny i rozszerzalny dla aplikacji wymagających większej weryfikacji lub uprawnień, które nie są uwzględnione w programie .NET MAUI. Utwórz klasę dziedziczą z Permissions.BasePermissionklasy i implementuj wymagane metody abstrakcyjne. Poniższy przykładowy kod demonstruje podstawowe abstrakcyjne elementy członkowskie, ale bez implementacji:
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();
}
}
Podczas implementowania uprawnienia na określonej platformie Permissions.BasePlatformPermission klasę można dziedziczyć. Ta klasa udostępnia dodatkowe metody pomocnika platformy do automatycznego sprawdzania deklaracji uprawnień. Pomaga to w tworzeniu uprawnień niestandardowych, które grupują, na przykład żądając dostępu zarówno do odczytu , jak i zapisu do magazynu w systemie Android. W poniższym przykładzie kodu pokazano żądanie dostępu do magazynu odczytu i zapisu :
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();
}
Następnie sprawdzasz uprawnienie w taki sam sposób, jak każdy inny typ uprawnień dostarczony przez program .NET MAUI:
PermissionStatus status = await Permissions.RequestAsync<ReadWriteStoragePerms>();
Jeśli chcesz wywołać ten interfejs API z kodu międzyplatformowego, możesz utworzyć interfejs i zarejestrować uprawnienie niestandardowe jako zależność w kontenerze usługi aplikacji. W poniższym przykładzie pokazano IReadWritePermission
interfejs:
public interface IReadWritePermission
{
Task<PermissionStatus> CheckStatusAsync();
Task<PermissionStatus> RequestAsync();
}
Następnie zaimplementuj interfejs w ramach uprawnień niestandardowych:
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
W klasie należy następnie zarejestrować interfejs i jego konkretny typ oraz typ, który będzie używać uprawnień niestandardowych, w kontenerze usługi aplikacji:
builder.Services.AddTransient<MyViewModel>();
builder.Services.AddSingleton<IReadWritePermission, ReadWriteStoragePermission>();
Implementacja uprawnień niestandardowych można następnie rozpoznać i wywołać z jednego z Twoich typów, takich jak model widoku:
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();
}
}
}
Różnice między platformami
W tej sekcji opisano różnice specyficzne dla platformy dotyczące interfejsu API uprawnień.
Uprawnienia muszą mieć zgodne atrybuty ustawione w pliku manifestu systemu Android. Stan uprawnień jest domyślnie ustawiony na Denied.