[카카오 로그인] 초기화 문제가 나옵니다

문의 시, 사용하시는 SDK 버전 정보와 디벨로퍼스 앱ID를 알려주세요.

Faq 목록 - 10. Android ( Faq 목록 입니다 ) 먼저 확인해주세요.


SDK 버전정보: com.kakao.sdk:v2-user:2.13.0
디벨로퍼스 앱 ID: 28448

카카오 로그인 시 크래시 이슈가 나옵니다.

KakaoSdk.hosts가 초기화 되지 않아서 생기는 이슈같은데, 간헐적으로 발생하네요.

현재 저희 앱 내 플로우는 Application Create 시 KakaoSdk.init(application, application.getString(R.string.kakao_app_key));를 수행하고 있고,
카카오 로그인 클릭 시 로그인(아래 코드 참고) 로직을 수행하게 됩니다.

if (UserApiClient.getInstance().isKakaoTalkLoginAvailable(mActivity)) {
            loginWithKakaoTalk();
        } else {
            loginWithKakaoAccount();
        }

로그

Fatal Exception: kotlin.UninitializedPropertyAccessException
lateinit property hosts has not been initialized

com.kakao.sdk.common.KakaoSdk.getHosts (KakaoSdk.kt:40)

com.kakao.sdk.auth.network.ApiFactoryKt$kapiWithOAuth$2.invoke (ApiFactory.kt:32)

com.kakao.sdk.auth.network.ApiFactoryKt$kapiWithOAuth$2.invoke (ApiFactory.kt:30)

kotlin.SynchronizedLazyImpl.getValue (LazyJVM.kt:74)

com.kakao.sdk.auth.network.ApiFactoryKt.getKapiWithOAuth (ApiFactory.kt:30)

com.kakao.sdk.user.UserApiClient.<init> (UserApiClient.kt:36)

com.kakao.sdk.user.UserApiClient.<init> (UserApiClient.kt:36)

com.kakao.sdk.user.UserApiClient$Companion$instance$2.invoke (UserApiClient.kt:452)

com.kakao.sdk.user.UserApiClient$Companion$instance$2.invoke (UserApiClient.kt:452)

com.kakao.sdk.user.UserApiClient$Companion$instance$2.invoke (UserApiClient.kt:452)

com.kakao.sdk.user.UserApiClient$Companion$instance$2.invoke (UserApiClient.kt:452)

kotlin.SynchronizedLazyImpl.getValue (LazyJVM.kt:74)

com.kakao.sdk.user.UserApiClient$Companion.getInstance (UserApiClient.kt:452)

com.kakao.sdk.user.UserApiClient.getInstance (UserApiClient.kt)

안녕하세요

SDK 초기화하는 부분 전체 코드와 로그인 호출부 코드 전체 첨부 부탁드리겠습니다. (SDK와 상관없는 코드는 주석처리 혹은 제거해서 첨부하셔도 괜찮고, 앱 키는 제거해주세요)

안녕하세요

코드 첨부 드립니다.

public class Initializer {
    static volatile Initializer gSingleton;
    private boolean mInitialize;

    /**
     * Singleton
     *
     * @return
     */
    public static Initializer getInstance() {
        if (gSingleton == null) {
            Class var2 = Initializer.class;
            synchronized (Initializer.class) {
                if (gSingleton == null) {
                    gSingleton = new Initializer();
                }
            }
        }

        return gSingleton;
    }
    /**
     * 초기화 여부
     *
     * @return
     */
    public boolean isInitialized() {
        return mInitialize;
    }
    
    /**
     * 초기화
     *
     * @param application
     */
    public void init(Application application) {
        try {
            if (isInitialized()) {
                return;
            }
            
            setUpKakaoSdk(application);
            mInitialize = true;
        } catch (Exception e) {
            Log.e(e.getMessage(), e);
        }
    }

    /**
     * 카카오 SDK 세팅
     */
    private void setUpKakaoSdk(Application application) {
        KakaoSdk.init(application, "앱키");
    }
}

@HiltAndroidApp
public class MyAppApplication extends Application {
    private static MyAppApplication instance;

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;

        ((Runnable) () -> Initializer.getInstance().init(instance)).run();
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
//        MultiDex.install(this);
    }

    public static synchronized MyAppApplication getInstance() {
        return instance;
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
//        Glide.get(this).clearMemory();
    }

    @Override
    public void onTrimMemory(int level) {
        super.onTrimMemory(level);
//        Glide.get(this).trimMemory(level);
    }
}
public class SocialHelper {

    public interface OnLoginFinishedListener {
        void onLoginSuccess(String type, boolean isRegistration);
    }

    private Activity mActivity;

    public SocialHelper(Activity activity, OnLoginFinishedListener listener, int type) {
        this(activity, listener, type, null);
    }

    public SocialHelper(Activity activity, OnLoginFinishedListener listener, int type, String deepLink) {
//        mType = type;
//        mListener = listener;
        mActivity = activity;
    }

    /**
     * 카카오톡 로그인 시도
     */
    public void bindKakao() {
        if (UserApiClient.getInstance().isKakaoTalkLoginAvailable(mActivity)) {
            loginWithKakaoTalk();
        } else {
            loginWithKakaoAccount();
        }
    }

    /**
     * 카카오톡 앱으로 로그인
     */
    private void loginWithKakaoTalk() {
        UserApiClient.getInstance().loginWithKakaoTalk(mActivity, kakaoCallback);
    }

    /**
     * 카카오톡 웹으로 로그인
     */
    private void loginWithKakaoAccount() {
        UserApiClient.getInstance().loginWithKakaoAccount(mActivity, kakaoCallback);
    }

    /**
     * 카카오계정으로 로그인 공통 callback 구성
     * 카카오톡으로 로그인 할 수 없어 카카오계정으로 로그인할 경우에도 사용됨
     */
    private Function2<OAuthToken, Throwable, Unit> kakaoCallback = (oAuthToken, throwable) -> {
        if (throwable != null) {
            // 사용자가 로그인 요청을 취소했을 때
            if (throwable instanceof ClientError && ClientErrorCause.Cancelled == ((ClientError) throwable).getReason()) {
                return null;
            }
            // 카카오톡은 설치 되어있지만 로그인이 안 되어 있는 상태
            if (throwable instanceof AuthError && AuthErrorCause.Unknown == ((AuthError) throwable).getReason()) {
                loginWithKakaoAccount();
            } else {
                ToastUtil.showToast(R.string.alert_common_error);
                Log.e(throwable.getMessage(), throwable);
            }
        } else if (oAuthToken != null && StringUtils.isNotBlank(oAuthToken.getAccessToken())) {
            bindSocialLogin(Define.SocialLoginType.KAKAO.getType(), oAuthToken.getAccessToken());
        }
        return null;
    };
}
@AndroidEntryPoint
class LoginActivity : DeprecatedBaseActivity(), LoginCallback, OnLoginFinishedListener {

    private val binding: ActivityLoginBinding by lazy {
        ActivityLoginBinding.inflate(layoutInflater).apply {
            this.lifecycleOwner = this@LoginActivity
            this.event = this@LoginActivity
        }
    }

    private lateinit var socialHelper: SocialHelper

    override fun setUp() {
        setUpSocialHelper()
    }
    
    override fun setLayout() = binding.root

    override fun setUpToolbar(): ToolbarOption = ToolbarOption.getDefaultToolbarOption()

    private fun setUpSocialHelper() {
        socialHelper = SocialHelper(this, this, SocialHelper.TYPE_REGISTRATION)
    }

    override fun onClickKakao() {
        socialHelper.bindKakao()
    }
}

보내주신 코드 확인해보았습니다.

코드 확인했을 때는 특별히 문제되는 부분은 없어보이네요…

이슈 발생 비율은 어느 정도 되나요? 그리고 이슈 발생하는 디바이스 정보(모델명, OS 버전) 등도 첨부해주시면 감사하겠습니다.

발생 횟수는 그리 많지 않으나, 빈도를 측정하기에는 어려움이 좀 있네요.
자동 로그인 기능이 있어서 사용자들이 로그인 화면을 보는 경우가 많지는 않아서요.

오늘 날짜 기준으로 90일 동안 나왔던 크래시 이벤트를 보니 총 39번회네요

발생한 기기 정보

  • 모델: Nexus 5X, Poco F4 GT(샤오미), Z Flip4
  • OS 버전: Android 13, Android 12, Android 8

첨부해주신 코드 외에는 UserApiClient를 사용하는 코드가 없나요?

자동 로그인은 어떤 식으로 구현되어있는지도 궁금하네요.

위에 코드 외에는 UserApiClient를 사용하지 않는다면 앱 동선을 다시 한번 확인해보셔야할 것 같습니다.

흠… 일단 SDK쪽 문제는 아닌 것 같네요??
SDK 버전 안내를 받을 수 있을까 해서 문의를 드렸었는데, 우선은 저희 로직쪽을 한 번 더 살펴보겠습니다

1개의 좋아요