min21 - 30 sdk고 v2버전쓰고 있습니다.
카카오 인증을 하고 카카오 토큰으로 커스텀 토큰을 발행하는 방식인데, 카카오 로그인 인증시 아래쪽부터 새창이 떳다가 아래로 내려가는 듯한(깜빡임)현상이 있어요.
안녕하세요~
사용하고 계신 sdk의 정확한 버전과, 현재 구현 중인 로그인 코드 첨부 부탁드리겠습니다
로그아웃하고 다시 로그인 할때 그러더라고요
"com.kakao.sdk:v2-user:2.4.2" 사용중이며,
// 로그인코드(코틀린)
@Suppress(“NAME_SHADOWING”)
class KaKaoLogin {
interface IKLoginResult
{
//var accessToken : String?
fun onKakaoLoginResult(user: User?)
}
var user:User? = null
var accessToken : String? = null
var listener:IKLoginResult? = null
// 로그인 callback 구성
val callback: (OAuthToken?, Throwable?) -> Unit = { token, error ->
if (error != null) {
Log.e("TAG", "로그인 실패", error)
if(listener != null)
listener!!.onKakaoLoginResult(null)
}
else if (token != null)
{
Log.i("TAG", "로그인 성공 ${token.accessToken}")
UserApiClient.instance.me { user, error ->
if (error != null)
{
Log.e("TAG", "사용자 정보 요청 실패", error)
}
else if (user != null)
{
Log.i("TAG", "사용자 정보 요청 성공" +
"\n회원번호: ${user.id}" +
"\n이메일: ${user.kakaoAccount?.email}" +
"\n닉네임: ${user.kakaoAccount?.profile?.nickname}" +
"\n프로필사진: ${user.kakaoAccount?.profile?.thumbnailImageUrl}")
this.user = user
if(listener != null) {
this.accessToken = token.accessToken
listener!!.onKakaoLoginResult(user)
// listener!!.accessToken = token.accessToken
// Log.e("TAG", "accessToken : " + token.accessToken)
}
}
}
}
}
fun login(context: Context)
{
// 카카오톡이 설치되어 있으면 카카오톡으로 로그인, 아니면 카카오계정으로 로그인
if (UserApiClient.instance.isKakaoTalkLoginAvailable(context))
UserApiClient.instance.loginWithKakaoTalk(context, callback = callback)
else
UserApiClient.instance.loginWithKakaoAccount(context, callback = callback)
}
//로그아웃
fun onLink() {
UserApiClient.instance.unlink { error ->
if (error != null) {
Log.e("TAG", "연결 끊기 실패", error)
}
else {
Log.i("TAG", "연결 끊기 성공. SDK에서 토큰 삭제 됨")
}
}
}
companion object {
@JvmStatic
val instance by lazy { KaKaoLogin() }
}
}
//카카오 로그인 버튼 호출입니다.
onCreate()
KaKaoLogin.getInstance().setListener(this);
kakaoLoginImageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
KaKaoLogin.getInstance().login(LoginActivity.this);
}
});
// 완료된 리스너를 오버라이드해서 JWT토큰으로 로그인을 합니다
@Override // 완료되면 호출되는 메서드
public void onKakaoLoginResult(@Nullable User user) {
progressHandler(false);
Toast.makeText(getApplicationContext(), “로그인중입니다.”, Toast.LENGTH_SHORT).show();
Log.d(TAG, “onKakaoLoginResult”);
Log.d(TAG,user.getId() + ", " +
user.getKakaoAccount().getEmail());
String accessToken = KaKaoLogin.getInstance().getAccessToken();
if (accessToken != null)
Log.d(TAG,accessToken);;
getFirebaseJwt(accessToken,LOGIN_TYPE_KAKAO).continueWithTask(new Continuation<String, Task>() {
@Override
public Task then(@NonNull Task task) throws Exception {
String firebaseToken = task.getResult();
FirebaseAuth auth = FirebaseAuth.getInstance();
return auth.signInWithCustomToken(firebaseToken);
}
}).addOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(@NonNull Task task) {
if (task.isSuccessful()) {
FirebaseMessaging.getInstance().getToken().addOnCompleteListener(new OnCompleteListener() {
@Override
public void onComplete(@NonNull @NotNull Task task) {
if (!task.isSuccessful()) {
Log.w(TAG, “getInstanceId failed”, task.getException());
return;
}
FirebaseUser user = mAuth.getCurrentUser();
String frieStoreDocument;
if(user.getEmail()!= null){
frieStoreDocument = user.getEmail();
}else{
frieStoreDocument = user.getUid();
}
String token = task.getResult();
Map<String, Object> data = new HashMap<>();
data.put("token", token);
FirebaseFirestore.getInstance().collection("Tokens")
.document(frieStoreDocument)
.set(data)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
progressHandler(true);
Log.d(TAG, "add token to DB Success!");
//updateUI(user);
checkFirstRun(mAuth.getCurrentUser().getUid());
requestFinish();
}
})
.addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.d(TAG,"add token to DB failed...");
}
});
}
});
} else {
progressHandler(true);
Toast.makeText(getApplicationContext(), "로그인 실패.", Toast.LENGTH_LONG).show();
if (task.getException() != null) {
Log.e(TAG, task.getException().toString());
}
}
}
});
}
보내주신 코드는 확인해봤는데 정확하게 어떤 현상에 대해서 말씀하시는 것인지 이해하지 못해서 동영상 첨부해주시면 좀 더 이슈 파악하는데 수월할 것 같습니다.
추가로 로그아웃 코드에서 UserApiClient.instance.unlink()
를 호출하고 계신데, 해당 기능은 앱과 사용자 계정을 연결 해제하는 기능으로 일반적으로 기대하는 로그아웃과는 조금 다른 기능입니다.
logout 설명 문서와 unlink 설명 문서 확인해보시고 코드 수정하시면 좋을 것 같습니다.
동영상 첨부해주셔서 감사합니다.
첨부해주신 동영상에서 보이는 현상은 카카오톡으로 로그인 하기 기능이 실행될 때 로그인하기 위해서 잠깐 카카오톡을 띄우게 되는데, 그 때 발생하는 현상으로 정상적인 동작입니다.
제조사별로 안드로이드OS를 커스텀하기 때문에 특정 디바이스에서는 해당 현상이 발생하지 않을 수 있습니다.
감사합니다.