사용 권한

Browse sample. 샘플 찾아보기

이 문서에서는 .NET 다중 플랫폼 앱 UI(.NET MAUI) Permissions 클래스를 사용하는 방법을 설명합니다. 이 클래스를 사용하면 런타임에 검사 권한을 요청할 수 있습니다. 형식은 Permissions 네임스페이 Microsoft.Maui.ApplicationModel 스에서 사용할 수 있습니다.

사용 가능한 권한

.NET MAUI는 가능한 한 많은 권한을 추상화하려고 시도합니다. 그러나 각 운영 체제에는 다른 사용 권한 집합이 있습니다. API에서 공통 권한에 대한 액세스를 허용하더라도 해당 권한과 관련된 운영 체제 간에 차이가 있을 수 있습니다. 다음 표에서는 사용 가능한 사용 권한을 설명합니다.

다음 표에서는 사용 권한이 지원됨을 나타내고 ❌ 사용 권한이 지원되지 않거나 필요하지 않음을 나타내는 데 사용합니다 ✔️.

Permission Android iOS Windows tvOS
배터리 ✔️
CalendarRead ✔️ ✔️
CalendarWrite ✔️ ✔️
카메라 ✔️ ✔️
ContactsRead ✔️ ✔️
ContactsWrite ✔️ ✔️
손전등 ✔️
LocationWhenInUse ✔️ ✔️ ✔️
LocationAlways ✔️ ✔️
미디어 ✔️
마이크 ✔️ ✔️
NetworkState ✔️
전화 ✔️ ✔️
사진 ✔️ ✔️
사진AddOnly ✔️ ✔️
미리 알림 ✔️
센서 ✔️ ✔️
Sms ✔️ ✔️
음성 ✔️ ✔️
StorageRead ✔️
StorageWrite ✔️
진동 ✔️
Permission Android iOS Windows tvOS
배터리 ✔️
Bluetooth ✔️
CalendarRead ✔️ ✔️
CalendarWrite ✔️ ✔️
카메라 ✔️ ✔️
ContactsRead ✔️ ✔️
ContactsWrite ✔️ ✔️
손전등 ✔️
LocationWhenInUse ✔️ ✔️ ✔️
LocationAlways ✔️ ✔️
미디어 ✔️
마이크 ✔️ ✔️
NearbyWifiDevices ✔️
NetworkState ✔️
전화 ✔️ ✔️
사진 ✔️ ✔️
사진AddOnly ✔️ ✔️
미리 알림 ✔️
센서 ✔️ ✔️
Sms ✔️ ✔️
음성 ✔️ ✔️
StorageRead ✔️
StorageWrite ✔️
진동 ✔️

사용 권한이 표시된 ❌경우 검사 요청 시 항상 반환 Granted 됩니다.

사용 권한 확인

권한의 현재 상태를 확인하려면 상태를 가져올 특정 권한과 함께 Permissions.CheckStatusAsync 메서드를 사용합니다. 다음 예제에서는 사용 권한의 LocationWhenInUse 상태 검사.

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

필요한 권한이 선언되지 않은 경우 A PermissionException 가 throw됩니다.

권한을 요청하기 전에 권한 상태를 확인하는 것이 좋습니다. 사용자에게 메시지가 표시되지 않은 경우 각 운영 체제는 다른 기본 상태를 반환합니다. iOS는 Unknown을 반환하고, 다른 운영 체제는 Denied를 반환합니다. 상태 Granted 있는 경우 다른 호출을 할 필요가 없습니다. iOS에서 상태 경우 설정의 사용 권한을 변경하라는 Denied 메시지를 사용자에게 표시해야 합니다. Android에서는 사용자가 이미 과거에 사용 권한을 거부했는지 감지하도록 호출 ShouldShowRationale 할 수 있습니다.

사용 권한 상태

사용 CheckStatusAsync 하거나 RequestAsync다음 PermissionStatus 단계를 결정하는 데 사용할 수 있는 A가 반환됩니다.

  • Unknown
    권한이 알 수 없는 상태이거나 iOS에서 사용자에게 메시지가 표시되지 않습니다.

  • Denied
    사용자가 권한 요청을 거부했습니다.

  • Disabled
    디바이스에서 기능을 사용할 수 없습니다.

  • Granted
    사용자에게 사용 권한이 부여되었거나 자동으로 부여됩니다.

  • Restricted
    제한된 상태입니다.

  • Limited
    제한된 상태입니다. iOS만 이 상태 반환합니다.

권한 요청

사용자에게 권한을 요청하려면 요청할 특정 권한과 함께 RequestAsync 메서드를 사용합니다. 사용자가 이전에 사용 권한을 부여하고 해지하지 않은 경우 이 메서드는 사용자에게 대화 상자를 표시하지 않고 반환 Granted 됩니다. 사용 권한은 사용자 MauiProgram 또는 App 클래스에서 요청해서는 안 되며 앱의 첫 번째 페이지가 나타난 후에만 요청해야 합니다.

다음 예제에서는 사용 권한을 요청합니다.LocationWhenInUse

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

필요한 권한이 선언되지 않은 경우 A PermissionException 가 throw됩니다.

Important

일부 플랫폼에서는 권한 요청을 한 번만 활성화할 수 있습니다. 사용 권한이 Denied 상태인지 검사 다음 사용자에게 수동으로 설정하도록 요청하려면 개발자가 추가 프롬프트를 처리해야 합니다.

사용 권한이 필요한 이유 설명

애플리케이션에 특정 권한이 필요한 이유를 사용자에게 설명하는 것이 가장 좋습니다. iOS에서는 사용자에게 표시되는 문자열을 지정해야 합니다. Android에는 이 기능이 없으며 기본적으로 권한 상태 Disabled. 이렇게 하면 사용자가 사용 권한을 거부했는지 또는 사용 권한이 처음 요청되었는지 여부를 알 수 있는 기능이 제한됩니다. 이 메서드를 ShouldShowRationale 사용하여 정보 제공 UI를 표시해야 하는지 여부를 확인할 수 있습니다. 메서드가 반환 true되는 경우 이는 사용자가 과거에 사용 권한을 거부하거나 사용하지 않도록 설정했기 때문입니다. 다른 플랫폼은 이 메서드를 호출할 때 항상 반환 false 됩니다.

예시

다음 코드는 사용 권한이 부여되었는지 여부를 확인하고 권한이 없는 경우 요청하는 일반적인 사용 패턴을 제공합니다.

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

사용 권한 확장

권한 API는 .NET MAUI에 포함되지 않은 더 많은 유효성 검사 또는 사용 권한이 필요한 애플리케이션에 대해 유연하고 확장 가능하도록 만들어졌습니다. 상속되는 클래스를 Permissions.BasePermission만들고 필요한 추상 메서드를 구현합니다. 다음 예제 코드는 구현이 없는 기본 추상 멤버를 보여 줍니다.

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

특정 플랫폼에서 권한을 구현하는 경우 Permissions.BasePlatformPermission 클래스를 상속할 수 있습니다. 이 클래스는 권한 선언을 자동으로 검사 추가 플랫폼 도우미 메서드를 제공합니다. 이렇게 하면 그룹화 작업을 수행하는 사용자 지정 권한을 만들 때 도움이 됩니다(예: Android의 스토리지에 대한 읽기쓰기 액세스 모두 요청). 다음 코드 예제에서는 읽기쓰기 스토리지 액세스를 요청하는 방법을 보여 줍니다.

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

그런 다음, .NET MAUI에서 제공하는 다른 사용 권한 유형과 동일한 방식으로 권한을 검사.

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

플랫폼 간 코드에서 이 API를 호출하려는 경우 인터페이스를 만들고 사용자 지정 권한을 앱의 서비스 컨테이너에 종속성으로 등록할 수 있습니다. 다음 예제에서는 인터페이스를 보여줍니다.IReadWritePermission

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

그런 다음 사용자 지정 권한으로 인터페이스를 구현합니다.

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 그런 다음 클래스에서 앱의 서비스 컨테이너에서 인터페이스와 구체적인 형식 및 사용자 지정 권한을 사용할 형식을 등록해야 합니다.

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

그런 다음, 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();
        }
    }
}

플랫폼 간 차이점

이 섹션에서는 권한 API와 플랫폼별 차이점에 대해 설명합니다.

권한은 Android 매니페스트 파일에 일치하는 특성이 설정되어 있어야 합니다. 사용 권한 상태 기본값은 .입니다Denied.