본문 바로가기

Programming/유니티

유니티(Unity) - 아이폰, 안드로이드 권한 셋팅 화면으로 이동하기

ㄴ유니티(Unity) 특수문자 json parsing, jsonUtillity와 litjson
ㄴ유니티(Unity) META-INF/kotlinx_coroutines_core.version
ㄴUndefined symbol : 유니티 Ios 빌드, Pod 설치 및 제거하기
ㄴ유니티(Unity) 빌드시 Firebase 오류
ㄴ유니티 (Unity) - Button의 OnClick Listener 사용법
ㄴ유니티(Unity) 프로젝트 점프게임 만들기 : [7] 플랫폼 생성

권한요청

앱을 만들다 보면 유저들에게 권한을 허락받아서 앱의 기능을 구현해야 할 때가 있습니다. 보통은 권한을 허락해 주지만 민감하신 분들은 허용하지 않으시는 분들도 많습니다. 그러다 보면 앱에서 로직으로 권한 설정을 하지 못하고 유저에게 직접 권한을 설정하도록 유도를 해야 하는데요, 오늘은 유니티로 앱을 제작할 때 권한을 요청하는 방법과 직접 유저에게 권한을 활성화하도록 시스템 세팅 화면을 띄워주는 방법에 대해 알아보겠습니다.

----

----

목차
1. 유니티 권한요청
2. 권한 수락 여부 확인
3. 시스템 세팅 화면으로 이동
4. 사용 예시
5. 주의할 점

유니티 권한요청

유니티에서 권한을 요청하는 방법은 안드로이드와 아이폰이 다릅니다. 예제로 권한 요청 방법을 확인해 보겠습니다.
※ 예제는 마이크 이용 권한을 요청하는 로직입니다.

[ 안드로이드 ]
PermissionCallbacks pCallback = new PermissionCallbacks();
pCallback.PermissionDenied += _d => {
    //권한요청을 거부했을 때 로직구현
};
pCallback.PermissionDeniedAndDontAskAgain += _d => {
    //권한요청을 거부하고 다시 묻지 않기를 눌렀을 때 로직구현
};
pCallback.PermissionGranted += _d => {
    //권한을 허락 했을 때 로직구현
};

Permission.RequestUserPermission(Permission.Microphone, pCallback);

[ 아이폰 ]
IEnumerator IosMicPermission()
{
    yield return Application.RequestUserAuthorization(UserAuthorization.Microphone);
    //권한 요청을 완료하고 다음 로직 구현
}

보통 아이폰의 경우 권한 요청을 완료하고 권한을 얻었는지 확인을 해주는 로직을 아래 넣어서 확인합니다.

권한 수락 여부 확인

[ 안드로이드 ]
if (Permission.HasUserAuthorizedPermission(Permission.Microphone ) == false) {
	//권한 허락이 되지 않았을 때 → 권한 요청을 하거나 셋팅화면으로 이동 시킴
}

[ 아이폰 ]
if (Application.HasUserAuthorization(UserAuthorization.Microphone) == false) {
	//권한 허락이 되지 않았을 때 → 권한 요청을 하거나 셋팅화면으로 이동 시킴
}

시스템 세팅 화면으로 이동

안드로이드는 해당 로직을 cs 파일에 작성해 주면 끝이지만 IOS(아이폰)에서는 Plugin 파일을 하나 만들어야 하기 때문에 Assets/Plugins/IOS 폴더를 만들고 cs파일과 mm파일을 넣어주면 됩니다.

[ 안드로이드 ]
try
{
	using (var unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
	using (AndroidJavaObject currentActivityObject = unityClass.GetStatic<AndroidJavaObject>("currentActivity"))
    {
        string packageName = currentActivityObject.Call<string>("getPackageName");
        using (var uriClass = new AndroidJavaClass("android.net.Uri"))
        using (AndroidJavaObject uriObject = uriClass.CallStatic<AndroidJavaObject>("fromParts", "package", packageName, null))
        using (var intentObject = new AndroidJavaObject("android.content.Intent", "android.settings.APPLICATION_DETAILS_SETTINGS", uriObject))
        {
            intentObject.Call<AndroidJavaObject>("addCategory", "android.intent.category.DEFAULT");
            intentObject.Call<AndroidJavaObject>("setFlags", 0x10000000);
            currentActivityObject.Call("startActivity", intentObject);
        }
    }
}
catch (Exception ex)
{
	Debug.LogException(ex);
}

[ 아이폰 ]
IosSystemOpen.cs 파일
public class IosSystemOpen : MonoBehaviour
{
#if UNITY_IOS
    [DllImport("__Internal")]
    public static extern void OpenSystemSettings();
#endif
}

IosSystemOpen.mm 파일
extern “C” {
    void OpenSystemSettings () {
        NSURL * url = [NSURL URLWithString: UIApplicationOpenSettingsURLString];
        [[UIApplication sharedApplication] openURL: url];
    }
}

사용 예시

앱이 시작하면 권한을 요청하고 실제 권한을 사용해야 하는 때가 되면 권한을 확인하고 그에 맞는 대응을 해주면 됩니다.

[ 안드로이드 ]
if (Permission.HasUserAuthorizedPermission(Permission.Microphone ) == false) {
	try
    {
        using (var unityClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer"))
        using (AndroidJavaObject currentActivityObject = unityClass.GetStatic<AndroidJavaObject>("currentActivity"))
        {
            string packageName = currentActivityObject.Call<string>("getPackageName");
            using (var uriClass = new AndroidJavaClass("android.net.Uri"))
            using (AndroidJavaObject uriObject = uriClass.CallStatic<AndroidJavaObject>("fromParts", "package", packageName, null))
            using (var intentObject = new AndroidJavaObject("android.content.Intent", "android.settings.APPLICATION_DETAILS_SETTINGS", uriObject))
            {
                intentObject.Call<AndroidJavaObject>("addCategory", "android.intent.category.DEFAULT");
                intentObject.Call<AndroidJavaObject>("setFlags", 0x10000000);
                currentActivityObject.Call("startActivity", intentObject);
            }
        }
    }
    catch (Exception ex)
    {
        Debug.LogException(ex);
    }
}

[ 아이폰 ]
if (Application.HasUserAuthorization(UserAuthorization.Microphone) == false) {
	IosSystemOpen.OpenSystemSettings();
}

주의할 점

권한 요청을 유저가 한 번이라도 거부를 해야 세팅화면에 해당 권한이 나타나므로 최소 한 번은 권한 요청을 해야 합니다.