ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유니티 안드로이드 네이버 로그인 구현 (Unity Android Naver Login)
    Unity 2022. 1. 3. 20:23
    728x90

    https://devkimluxx.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EC%B9%B4%EC%B9%B4%EC%98%A4-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%EC%9B%B9%EB%B7%B0-%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8-Unity-Kakao-Login-WebView-Plugin

     

    유니티 카카오 로그인 웹뷰 플러그인 (Unity Kakao Login WebView Plugin)

    유니티에서 카카오 로그인을 구현하려면, 프로젝트를 export해서 기능을 안드로이드 스튜디오에서 구현하거나, 안드로이드 스튜디오에서 반대로 카카오 로그인 플러그인을 만들어서 유니티 프

    devkimluxx.tistory.com

     

    네이버 로그인을 안드로이드로 구현한 버전이다. 이전에 작성했던 카카오 로그인과 같은 맥락으로, 안드로이드 스튜디오를 다뤄 aar 플러그인을 직접 만들기 어려운 상황일 때, 유니티에서 C#으로 네이버 로그인을 구현한 예제이다.

     

    com.naver.nid.naveridlogin-android-sdk-4.4.1.aar
    0.19MB

    //사용시 com.naver.nid.naveridlogin-android-sdk-4.4.1.aar 필요함 (다른 버전에서는 작동 미확인)
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    namespace NaverLogin
    {
        public class NaverLogin : MonoBehaviour
        {
            public static string OAUTH_CLIENT_ID = "";
            public static string OAUTH_CLIENT_SECRET = "";
            public static string OAUTH_CLIENT_NAME = "";
            [SerializeField]
            private string clientId;
            [SerializeField]
            private string clientSecret;
            [SerializeField]
            private string clientName;
    
            private static AndroidJavaObject oAuthLoginInstance;    //private static OAuthLogin mOAuthLoginInstance;
    
            public static NaverAuth naverAuth;
    
            void Start()
            {
                SetClientData();
    
                InitData();
                StartAuth();
    
                //↓사용 예제
                //StartCoroutine(GetAuthDelay(null));
            }
    
            /// <summary>inspector의 id/secret/name 값을 static으로 값 옮김</summary>
            private void SetClientData()
            {
                OAUTH_CLIENT_ID = clientId;
                OAUTH_CLIENT_SECRET = clientSecret;
                OAUTH_CLIENT_NAME = clientName;
            }
    
            #region INIT
    
            /// <summary>로그인 인스턴스 초기화</summary>
            private void InitData()
            {
                try
                {
                    using (AndroidJavaClass oAuthLogin = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLogin")) //import com.nhn.android.naverlogin.OAuthLogin;
                    {
                        using (AndroidJavaClass oAuthLoginHandler = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLoginHandler"))   //import com.nhn.android.naverlogin.OAuthLoginHandler;
                        {
                            //Init Data
                            oAuthLoginInstance = oAuthLogin.CallStatic<AndroidJavaObject>("getInstance"); //mOAuthLoginInstance = OAuthLogin.getInstance();
                            AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//context를 가져오기 위함
                            AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");//context를 가져오기 위함
                            oAuthLoginInstance.Call("init", context, OAUTH_CLIENT_ID, OAUTH_CLIENT_SECRET, OAUTH_CLIENT_NAME);  //mOAuthLoginInstance.init(mContext, OAUTH_CLIENT_ID, OAUTH_CLIENT_SECRET, OAUTH_CLIENT_NAME);
                        }
                    }
                }
                catch
                {
                    Logger.Error("Cannot load com.nhn.android.naverlogin, Check aar plugin exist");
                }
            }
    
            /// <summary>로그인 시작</summary>
            public static void StartAuth()
            {
                using (AndroidJavaClass oAuthLogin = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLogin")) //import com.nhn.android.naverlogin.OAuthLogin;
                {
                    using (AndroidJavaClass oAuthLoginHandler = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLoginHandler"))   //import com.nhn.android.naverlogin.OAuthLoginHandler;
                    {
                        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//context를 가져오기 위함
                        AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");//context를 가져오기 위함
                        AndroidJavaObject mOAuthLoginHander = new AndroidJavaObject("com.nhn.android.naverlogin.OAuthLoginHandler");   //OAuthLoginHandler mOAuthLoginHandler = new OAuthLoginHandler() {
    
                        oAuthLoginInstance.Call("startOauthLoginActivity", context, mOAuthLoginHander);
    
                    }
                }
            }
    
            #endregion
    
            #region GET_AUTH
    
            ///<summary>accessToken등 정보 가져오기 (로그인 성공 완료 전 가져오면 데이터 비어 있으니 주의할 것)</summary>
            private static NaverAuth GetAuth()
            {
                NaverAuth naverAuth = new NaverAuth();
                using (AndroidJavaClass oAuthLogin = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLogin")) //import com.nhn.android.naverlogin.OAuthLogin;
                {
                    using (AndroidJavaClass oAuthLoginHandler = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLoginHandler"))   //import com.nhn.android.naverlogin.OAuthLoginHandler;
                    {
                        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//context를 가져오기 위함
                        AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");//context를 가져오기 위함
    
                        naverAuth.accessToken = oAuthLoginInstance.Call<string>("getAccessToken", context);
                        naverAuth.refreshToken = oAuthLoginInstance.Call<string>("getRefreshToken", context);
                        naverAuth.expiresAt = oAuthLoginInstance.Call<long>("getExpiresAt", context);
                        naverAuth.tokenType = oAuthLoginInstance.Call<string>("getTokenType", context);
                    }
                }
                return naverAuth;
            }
            ///<summary>accessToken등 정보 가져오기 (로그인 성공 완료 전 가져오면 데이터 비어 있으니 주의할 것)</summary>
            public static IEnumerator GetAuthDelay(System.Action<NaverAuth> callback)
            {
                //var text = GameObject.Find("Text").GetComponent<UnityEngine.UI.Text>();
                while (true)
                {
                    yield return new WaitForSeconds(0.1f);
                    var auth = GetAuth();
                    //text.text = string.Format("token : {0} \n refresh : {1} \n expire : {2} \n type : {3}", auth.accessToken, auth.refreshToken, auth.expiresAt, auth.tokenType);
                    if (!string.IsNullOrEmpty(auth.accessToken))
                    {
                        naverAuth = auth;
                        yield return naverAuth;
                        callback?.Invoke(naverAuth);
                        break;
                    }
                }
            }
    
            #endregion
    
            #region REQUEST
    
            private static string RequestApi()
            {
                string str;
                using (AndroidJavaClass oAuthLogin = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLogin")) //import com.nhn.android.naverlogin.OAuthLogin;
                {
                    using (AndroidJavaClass oAuthLoginHandler = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLoginHandler"))   //import com.nhn.android.naverlogin.OAuthLoginHandler;
                    {
                        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//context를 가져오기 위함
                        AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");//context를 가져오기 위함
    
                        str = oAuthLoginInstance.Call<string>("getAccessToken", context);
                    }
                }
                return str;
            }
            ///<summary>accessToken등 정보 가져오기 (로그인 성공 완료 전 가져오면 데이터 비어 있으니 주의할 것)</summary>
            public static IEnumerator RequestApi(System.Action<string> callback)
            {
                while (true)
                {
                    yield return new WaitForSeconds(0.1f);
                    string auth = RequestApi();
                    if (!string.IsNullOrEmpty(auth))
                    {
                        yield return auth;
                        callback?.Invoke(auth);
                        break;
                    }
                }
            }
    
            #endregion
    
            #region REFRESH
    
            private static string RefreshToken()
            {
                string str;
                using (AndroidJavaClass oAuthLogin = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLogin")) //import com.nhn.android.naverlogin.OAuthLogin;
                {
                    using (AndroidJavaClass oAuthLoginHandler = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLoginHandler"))   //import com.nhn.android.naverlogin.OAuthLoginHandler;
                    {
                        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//context를 가져오기 위함
                        AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");//context를 가져오기 위함
    
                        str = oAuthLoginInstance.Call<string>("getRefreshToken", context);
                    }
                }
                return str;
            }
            public static IEnumerator RefreshToken(System.Action<string> callback)
            {
                while (true)
                {
                    yield return new WaitForSeconds(0.1f);
                    string auth = RefreshToken();
                    if (!string.IsNullOrEmpty(auth))
                    {
                        yield return auth;
                        callback?.Invoke(auth);
                        break;
                    }
                }
            }
            #endregion
    
            #region LOGOUT
    
            private static void Logout()
            {
                using (AndroidJavaClass oAuthLogin = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLogin")) //import com.nhn.android.naverlogin.OAuthLogin;
                {
                    using (AndroidJavaClass oAuthLoginHandler = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLoginHandler"))   //import com.nhn.android.naverlogin.OAuthLoginHandler;
                    {
                        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//context를 가져오기 위함
                        AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");//context를 가져오기 위함
    
                        oAuthLoginInstance.Call("logout", context);
                    }
                }
            }
    
    
            #endregion
    
            #region DELETE_TOKEN
            private static void DeleteAndLogout()
            {
                using (AndroidJavaClass oAuthLogin = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLogin")) //import com.nhn.android.naverlogin.OAuthLogin;
                {
                    using (AndroidJavaClass oAuthLoginHandler = new AndroidJavaClass("com.nhn.android.naverlogin.OAuthLoginHandler"))   //import com.nhn.android.naverlogin.OAuthLoginHandler;
                    {
                        AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");//context를 가져오기 위함
                        AndroidJavaObject context = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");//context를 가져오기 위함
    
                        oAuthLoginInstance.Call("logoutAndDeleteToken", context);
                    }
                }
            }
            #endregion
    
            #region MODEL
            [System.Serializable]
            public class NaverAuth
            {
                public string accessToken;
                public string refreshToken;
                public long expiresAt;
                public string tokenType;
            }
            #endregion
        }
    
    }
    728x90

    댓글

Designed by Tistory.