안녕하세요, 플러터 카카오톡 로그인 관련 질문입니다!

문의 시 사용하시는 SDK 버전 정보와 플랫폼(Android / iOS) 및 디벨로퍼스 앱ID를 알려주세요.
SDK 버전 : kakao_flutter_sdk: ^1.5.0
앱 ID : 943048
앱 이름 : 심다


현재 프로젝트로 플러터를 활용한 안드로이드 앱 출시를 진행하고 있습니다.
카카오톡 로그인 기능을 구현하여 작업하고 있는데, 디버그 모드에서 카카오톡이 설치되지 않은 상황에서는 로그인 후 잘 작동이 되었습니다.

그런데, 릴리즈 모드 및 안드로이드 출시 후 요청을 보낸 결과
실제 카카오톡이 깔려있는 핸드폰에서는 깜빡하는 반응만 있을 뿐 아무런 창이 뜨지 않고, 로그인 요청조차 진행되지 않았습니다. 어떤 것이 문제인지 파악하려 했지만, 실제 출시 상황에서 디버깅도 힘들기 때문에 많은 어려움을 겪고 있습니다
혹시 릴리즈 키가 잘못된 것인지, 아니면 다른 것이 잘못되었는지 알 수 있는 방법이 있을까요

Future<void> main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  KakaoSdk.init(
    nativeAppKey: '네이티브 앱키',
  );
  // 달력 한국 시각

  await initializeDateFormatting();

  final GoogleMapsFlutterPlatform mapsImplementation =
      GoogleMapsFlutterPlatform.instance;
  if (mapsImplementation is GoogleMapsFlutterAndroid) {
    mapsImplementation.useAndroidViewSurface = true;
  }
  runApp(MaterialApp(
    theme: ThemeData(
      scaffoldBackgroundColor: Colors.white,
    ),
      debugShowCheckedModeBanner: false,
      home: const MyApp()));

  isLogin = await store.checkAccessTokenValidity();
}
<activity
            android:name="com.kakao.sdk.flutter.AuthCodeCustomTabsActivity"
            android:exported="true">
            <intent-filter android:label="flutter_web_auth">
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <!-- "kakao${YOUR_NATIVE_APP_KEY}://oauth" 형식의 앱 실행 스킴 설정 -->
                <!-- 카카오 로그인 Redirect URI -->
                <data android:scheme="kakao네이티브앱키" android:host="oauth"/>
            </intent-filter>
        </activity>

이런 식으로 등록되어 있습니다. 도움의 손길 부탁드립니다…

실제 카카오톡이 깔려있는 핸드폰에서는 깜빡하는 반응만 있을 뿐 아무런 창이 뜨지 않고, 로그인 요청조차 진행되지 않았습니다

안녕하세요.

설치된 카카오톡은 로그인이 되어 있는 상태인가요? androidmanifest 전체 공유 해주시겠어요? (민감정보는 *표로 블라인드 처리 해주시면됩니다.)

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <application
        android:label="simda"
        android:name="${applicationName}"
        android:icon="@mipmap/ic_launcher">

        <!-- TODO: Add your Google Maps API key here -->
        <meta-data android:name="com.google.android.geo.API_KEY"
            android:value="**********************"/>

        <activity
            android:name="com.kakao.sdk.flutter.AuthCodeCustomTabsActivity"
            android:exported="true">
            <intent-filter android:label="flutter_web_auth">
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <!-- "kakao${YOUR_NATIVE_APP_KEY}://oauth" 형식의 앱 실행 스킴 설정 -->
                <!-- 카카오 로그인 Redirect URI -->
                <data android:scheme="*****************" android:host="oauth"/>
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <!-- Specifies an Android theme to apply to this Activity as soon as
                 the Android process has started. This theme is visible to the user
                 while the Flutter UI initializes. After that, this theme continues
                 to determine the Window background behind the Flutter UI. -->
            <meta-data
                android:name="io.flutter.embedding.android.NormalTheme"
                android:resource="@style/NormalTheme"
                />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
</manifest>

이렇게 작성하였습니다
실제 작동 코드는

@override
  Future<int> login() async {
    DatabaseReference ref = FirebaseDatabase.instance.ref("logs");
    try {
      bool isInstalled = await isKakaoTalkInstalled();

      OAuthToken? token;
      if (isInstalled) {
        try {
          token = await UserApi.instance.loginWithKakaoTalk();
        }catch(e){
          await ref.set({
            'error': e
          });
        }
      } else {
        try{
          token = await UserApi.instance.loginWithKakaoAccount();
        }catch(e){
          await ref.set({
            'error': e
          });
        }
      }
      await ref.set({
        'status' : 'success'
      });
        try {
          await ref.set({
            'info' : '카카오 - flutter 로그인 성공'
          });
          store.saveAccessToken(token!);

          final url = Uri.parse("$ip/user/login/kakao");
          final response = await http.post(url,
              headers: {"Content-Type": "application/json"},
              body: json.encode({
                'accessToken': token.accessToken,
              }));

          // print(response);
          saveStorage(jsonDecode(response.body));
          if (response.statusCode == 200) {
            // print("로그인 성공!");
            return 1;
          } else if (response.statusCode == 202) {
            // print("회원가입 필요!");
            // email = response.body;
            // print(email);
            return 0;
          }

          await ref.set({
            'info' : 'flutter - backend 로그인 성공'
          });

          // print("뭔가 오류가 있다");
          return -1;
        } catch (e) {
          await ref.set({
            'error': e
          });
          print(e);
          return -1;
        }
    } catch (e) {
      await ref.set({
        'error': e
      });
      return -1;
    }
  }

이렇게 작성하였습니다…

카카오톡 로그인은 되어있는 상태입니다

로그를 보니 키해시가 등록안되어 다수의 토큰 발급 에러가 있습니다.
앱에서 헤더에 세팅하여 전달하지만 디벨로퍼스 설정에 없는 키해시는 아래와 같습니다.

C/U7FHuwS5wV*************

확인 부탁드리며, 키해시 추출이 원활하지 않다면 아래 코드로 로깅하여 확인해주세요.

import com.kakao.sdk.common.util.Utility

var keyHash = Utility.getKeyHash(this)

플러터일 경우

print(await KakaoSdk.origin);
1개의 좋아요

감사합니다, 키 해시를 찾아보겠습니다. 혹시 구글 스토어에서 SHA-1 코드를 가지고 해싱을 진행하는데, 이 때 openSSL의 버전은 0.9.8e_X64가 맞을까요…? 도움 감사합니다

보통은 윈도우 OS 파워쉘에서 수행한게 아니라면 큰 문제는 없었는데요.

최신버전으로 업데이트 하시고 실행해보시겠어요?

https://www.openssl.org/source/

구글 스토어에서는 “업로드 키 인증서” SHA-1을 사용하면 안되고
“앱 서명 키 인증서” SHA-1을 사용해야하는데 이부분 정도 확인해 주시면 좋을 것 같습니다.

앱은 스토어에 최종 배포된 버전이 맞지요?

네, 최종 배포를 위해 구글 스토어에 등록하였고,서명 키 인증서를 사용했습니다
윈도우 환경이라, 깃 배쉬에서 echo “${PRINTCERT}” | xxd -r -p | openssl base64
이 명령어를 사용해서 ${PRINTCERT} 부분 전체를 서명 키 인증서 값(XX:XX:XX 등으로 이루어진 값)을 통해 추출했습니다…
중간에 키 스토어를 한 번 더 생성했었는데 그 부분이 문제될런지 모르겠습니다.,.
image

감사합니다 콘솔로 찍어서 확인해가지고, 릴리즈 키 값을 찾아냈습니다 감사합니다

1개의 좋아요