Unity
유니티 안드로이드 네이버 로그인 구현 (Unity Android Naver Login)
devkimluxx
2022. 1. 3. 20:23
728x90
유니티 카카오 로그인 웹뷰 플러그인 (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