ㄴ유니티(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();
}
주의할 점
권한 요청을 유저가 한 번이라도 거부를 해야 세팅화면에 해당 권한이 나타나므로 최소 한 번은 권한 요청을 해야 합니다.
'Programming > 유니티' 카테고리의 다른 글
유니티(Unity) Rigidbody2d의 Addforce와 밀림방지 (0) | 2024.10.14 |
---|---|
유니티(Unity) 2d 물리 게임 이동충돌 (0) | 2024.10.10 |
유니티(Unity) iOS 진동모드 일때 소리가 안나오는 현상 (0) | 2024.08.08 |
유니티(Unity) Firebase Analytics 사용시 Null Error (0) | 2024.08.02 |
유니티(Unity) Firebase 추가시 Firebase.Editor.dll not loaded error (0) | 2024.07.25 |