카카오로그인에대한 질문입니다. V1->V2 웹뷰 사용하고있습니다. 웹은 실행되나 앱은 실행이안됩니다

앱ID : 517379
SDK 버전은 33입니다.

안녕하세요. 이번 앱 SDK버전 이슈로 안드로이드 업데이트를 하게되었는데 기능중에 카카오로그인이 있어서 문의드립니다.
1.27버전을 사용했던 앱이라 이번에 업데이트를 하였습니다.

    implementation "com.kakao.sdk:v2-user:2.8.3" // 카카오 로그인
    implementation "com.kakao.sdk:v2-talk:2.8.3" // 친구, 메시지(카카오톡)
    implementation "com.kakao.sdk:v2-link:2.8.3" // 메시지(카카오링크)

기본빌드엔 간단히 세개만 작성하였고 사실상 로그인만 우선적으로 구현하고 싶어 로그인쪽을 쭉 살펴봤는데 제가 필요한건 안드로이드 로그인이아닌 웹뷰로그인인지라… 웹쪽에는 완성이 되어있는 상태입니다.

세션을 이용하던 내용을 모두 수정했고 로그인까지 완료하였지만 문제는 앱과 웹을 구분하는부분에서 앱이 실행이 되지 않습니다.

코드를 쭉 따라가 확인하여봤습니다. 코드의 일부분입니다.

  public static void kakaoLogin() {
        boolean isKakaoTalkLoginAvailable = UserApiClient.getInstance().isKakaoTalkLoginAvailable(appContext);
        Log.d(TAG, "KakaoTalk login available: " + isKakaoTalkLoginAvailable);

        if (isKakaoTalkLoginAvailable) {
            Log.d(TAG, "KakaoTalk login is available. Attempting login...");
            UserApiClient.getInstance().loginWithKakaoTalk(appContext, callback);
        } else {
            Log.d(TAG, "KakaoTalk login is not available. Attempting login with Kakao Account...");
            UserApiClient.getInstance().loginWithKakaoAccount(appContext, callback);
        }
    }

테스트를위해 가져온 코드이고 카톡이 있다 없다의 판단은 잘 작동하지만

2023-10-27 15:46:34.692 18486-18486 MyActivity              com.inplusweb.untactwash             D  KakaoTalk login available: true
2023-10-27 15:46:34.692 18486-18486 MyActivity              com.inplusweb.untactwash             D  KakaoTalk login is available. Attempting login...

UserApiClient.getInstance().loginWithKakaoTalk(appContext, callback);
해당내용이 실행이 안됩니다… 앱에서 카카오톡을 여시겠습니까 라던가 하는게 있거나 카카오톡으로 이동하길 원하시만 웹은 잘열리지만 앱은 열리지 않습니다 …

혹시몰라 KaKaoAccount를 위로올려보니 해당부분 실행되어 웹으로 잘 작동하는것도 확인했습니다.

다른분들글을 참고해 열심히 코드를 만들었지만 해당내용에대한 글을 찾지못해 이렇게 문의를 남깁니다…

혹여 제가 빼먹은 부분이 있는지 확인 좀 부탁드리겠습니다. (해시키는 IjnLDK 으로 시작하는 키입니다.)

감사합니다.

안녕하세요.

어떤 이유로 네이티브 SDK 사용이 꼭 필요하신 경우라면 사용하셔도 무방하나 일반적으로 웹뷰를 사용하는 하이브리드 앱 에서는 네이티브 SDK 사용이 필요치 않습니다.

오늘 앱 517379에서 네이티브 앱키를 사용한 로그인 성공 이력이 확인되는데요 현재도 동일증상이 재현되실까요?

1개의 좋아요

안녕하세요

첨부해주신 코드 및 내용을 참고해서 확인해봤는데, 이슈가 재현되지 않고 코드 상의 문제도 없어보여서 정확한 원인 파악이 되지 않고 있습니다.

카카오톡으로 로그인 기능 실행 시 출력되는 로그는 없는지, 콜백을 통해 에러가 전달되지 않는지 등 확인 부탁드립니다.

그리고 callback 구현부도 추가로 첨부 부탁드리겠습니다

1개의 좋아요

답변 감사합니다.

제가 안드로이드 개발자가 아니다보니 설명하기가 조금 벅차네요.

우선 웹뷰로 이용하고 있습니다. 네이버와 다른 몇가지 로그인이 모두 들어가있고 현재는 카카오톡과 네이버로그인을 사용하고있습니다.

현재상황은 웹뷰에서 a href=“kakaologin:” 으로 url을 보내면 카카오로그인이 실행되도록 되어있습니다.

public void onCreate() {
super.onCreate();
instance = this;
appContext = getApplicationContext(); // 전역 context 변수 초기화

    // Kakao Sdk 초기화

    KakaoSdk.init(this, getString(R.string.kakao_app_key));
    /* HashKey = Utility.getKeyHash(this);*/

    HashKey = getKeyHash();
    Log.d(TAG, "KakaoTalk hash key: " + HashKey);
}

private static Function2<OAuthToken, Throwable, Unit> callback = new Function2<OAuthToken, Throwable, Unit>() {
    @Override
    public Unit invoke(OAuthToken oAuthToken, Throwable throwable) {
        /* 토큰 전달시 성공 전달되지 않았다면 실패*/
        logincheck(appContext);
        return null;
    }
};

public static void kakaoLogin() {
    boolean isKakaoTalkLoginAvailable = UserApiClient.getInstance().isKakaoTalkLoginAvailable(appContext);
    Log.d(TAG, "KakaoTalk login available: " + isKakaoTalkLoginAvailable);

    if (isKakaoTalkLoginAvailable) {
        Log.d(TAG, "KakaoTalk login is available. Attempting login...");
        UserApiClient.getInstance().loginWithKakaoTalk(appContext, callback);
    } else {
        Log.d(TAG, "KakaoTalk login is not available. Attempting login with Kakao Account...");
        UserApiClient.getInstance().loginWithKakaoAccount(appContext, callback);
    }
}

해당코드입니다.

문제점은 현재 핸드폰에서 로그인 시 카카오톡이 깔려있고 깔려있지않고의 판단은 정확히 되지만 카카오톡 앱이 깔려있는 경우에 앱으로 실행이 되지 않습니다.

콜백이든 로그든 전혀 반응이 없어서 해당위치까지 가는것만 확인하였습니다.

else if (url.startsWith(“kakaologin:”)) {
// 카카오 로그인
// 세션을 열기 전에 로그인 요청을 생성하고 요청 정보를 설정합니다.
Log.e(“=============카카오톡:2//” , url);
GlobalApplication app = new GlobalApplication();
app.kakaoLogin();
return true;
}

로그인은 이런식으로 불러와서 실행시키고있습니다.

로그인 성공이력은 아마 제가 웹으로 접속하여 테스트해서 발생한걸로 생각됩니다.

카카오톡부분이 실행이 안되기에 해당부분에
UserApiClient.getInstance().loginWithKakaoAccount(appContext, callback);
를 넣으면 정상적으로 웹으로 실행이 되긴하지만 카카오톡이 있다면 카카오톡을 실행시키고 싶습니다…

웹 뷰를 통해 웹 페이지를 띄우고 있고, 웹 페이지에 있는 버튼을 누르면 JavascriptInterface를 통해 Android 네이티브 코드(카카오 로그인 코드)를 호출하는 것으로 이해했습니다.

위에 설명한 상황이 맞다면 JavaScript SDK를 사용하시기를 권장드립니다.

만약 특정 이유로 네이티브 SDK를 사용해야만 한다면 MainActivity 코드 전문과, AndroidManifest.xml 파일도 추가로 첨부 부탁드립니다. (앱 키는 가려서 첨부해주세요)

추가로 아래와 같은 샘플 코드를 실행했을 때 정상적으로 동작하는지도 확인 부탁드립니다.

public class MainActivity extends AppCompatActivity {
    public static String TAG = "LoginTest";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        KakaoSdk.init(this, "app_key");

        WebView webView = findViewById(R.id.webview);
        webView.getSettings().setJavaScriptEnabled(true);

        String html = "<!DOCTYPE html>\n" +
                "<html lang=\"en\">\n" +
                "<head>\n" +
                "    <meta charset=\"UTF-8\">\n" +
                "    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n" +
                "    <title>Document</title>\n" +
                "</head>\n" +
                "<body>\n" +
                "    <input type=\"button\" value=\"Login\" onClick=\"login()\" />\n" +
                "\n" +
                "    <script type=\"text/javascript\">\n" +
                "        function login() {\n" +
                "            Kakao.kakaologin();\n" +
                "    }\n" +
                "</script>\n" +
                "</body>\n" +
                "</html>";
        webView.addJavascriptInterface(this, "Kakao");
        WebView.setWebContentsDebuggingEnabled(true);
        webView.loadData(html, "text/html; charset=utf-8", "UTF-8");
    }

    Function2<OAuthToken, Throwable, Unit> callback = (oAuthToken, throwable) -> {
        // 이때 토큰이 전달이 되면 로그인이 성공한 것이고 토큰이 전달되지 않았다면 로그인 실패

        if (oAuthToken != null) {
            Log.d(TAG, oAuthToken.toString());
        } else if (throwable != null) {
            Log.d(TAG, throwable.toString());
        }
        return null;
    };

    @JavascriptInterface
    public void kakaologin() {
        if (UserApiClient.getInstance().isKakaoTalkLoginAvailable(MainActivity.this)) {
            UserApiClient.getInstance().loginWithKakaoTalk(MainActivity.this, callback);
        } else {
            UserApiClient.getInstance().loginWithKakaoAccount(MainActivity.this, callback);
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</androidx.constraintlayout.widget.ConstraintLayout>
``