
참고 자료
카카오 로그인 Flutter SDK 공식문서
카카오 로그인 또한 코딩 이전까지의 과정이 험난합니다....... 잘 따라와주세요!

Kakao Developers 공식문서 : 시작하기 > 플랫폼 등록
위 링크에 더 자세한 설명이 있습니다. 여기서는 최대한 핵심만 알려드리고 넘어가겠습니다.
카카오 개발자 페이지에 들어가서 로그인합니다.
내 애플리케이션에 들어가서 새로운 앱을 만듭니다.
‘플랫폼’ 메뉴에 들어갑니다.
안드로이드 앱부터 등록해봅시다. ‘Android 플랫폼 등록'을 누릅니다.
아래의 정보들을 입력합니다.
package에 해당하는 값을 입력하시면 됩니다.
안드로이드 등록을 마쳤으면, 이번엔 ‘iOS 플랫폼 등록'을 눌러서 iOS 앱 등록으로 넘어갑니다.
다른 건 다 공란으로 두고, 번들 ID만 입력해주고 ‘저장'을 누릅니다.
iOS 번들 ID 찾는 방법 : https://velog.io/@adbr/flutter-firebase-ios-앱추가


⚠️ 출생 연도, 전화번호 등 몇몇 정보는 비즈 앱으로 전환하지 않으면 받을 수 없습니다.
만약 이런 정보들을 받고 싶으시다면, 현재 앱을 비즈 앱으로 전환한 뒤에 검수를 통과하셔야 합니다.


#2023.01.13 기준 가장 최신 버전은 1.3.1
dependencies:
# 모든 카카오 라이브러리 추가를 원하는 경우
kakao_flutter_sdk: ^1.3.1
dependencies:
# 카카오 로그인만 추가하는 경우
kakao_flutter_sdk_user: ^1.3.1
runApp() 메서드 호출 전에 Flutter SDK를 초기화해야 합니다!${YOUR_NATIVE_APP_KEY} 부분에는 [내 애플리케이션] > [앱 키]에서 확인한 네이티브 앱 키를 입력합니다.void main() {
...
KakaoSdk.init(nativeAppKey: '${YOUR_NATIVE_APP_KEY}'); // 이 줄을 runApp 위에 추가한다.
runApp(MyApp());
...
}
네이티브 앱 키는 내 애플리케이션에 들어가면 있습니다.
아래 표에서 ‘네이티브 앱 키’를 위 코드의 ${YOUR_NATIVE_APP_KEY}에 넣으면 됩니다.

android/app/src/AndroidManifest.xml 에 카카오 로그인 Redirect URI를 추가해야 합니다. 해당 파일의application 태그 안에 새로운 activity 태그를 아래 예제와 같이 추가합니다.${YOUR_NATIVE_APP_KEY}부분에는 [내 애플리케이션] > [앱 키]에서 확인한 네이티브 앱 키를 입력합니다.<activity android:name="com.kakao.sdk.flutter.AuthCodeCustomTabsActivity">
<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" />
<!-- Redirect URI, "kakao${YOUR_NATIVE_APP_KEY}://oauth" 형식 -->
<data android:scheme="kakao${YOUR_NATIVE_APP_KEY}" android:host="oauth"/>
</intent-filter>
</activity>
Runner로 이동한 뒤, Info 탭을 누릅니다. 이후, Custom iOS Target Properties 항목에 Array 타입 키(Key)인 LSApplicationQueriesSchemes를 추가하고, 해당 키의 [Item]으로 커스텀 URL 스킴에 사용할 값인 "kakaokompassauth", "kakaolink"를 추가합니다.
c. URL Schemes 설정하기 : 위의 Info 탭에서 맨 아래에 있는 URL Types를 엽니다. 이후, [URL Schemes] 항목에 네이티브 앱 키(Native App Key)를 kakao${NATIVE_APP_KEY} 형식으로 등록합니다. 예를 들어 네이티브 앱 키가 "123456789"라면 [URL Schemes]에 "kakao123456789"를 입력합니다.
드디어 설정 끝! 이제 코드를 작성해 봅시다.
Kakao Developers 공식문서 링크 : 카카오톡으로 로그인

// 카카오 로그인 구현 예제
// 카카오톡 설치 여부 확인
// 카카오톡이 설치되어 있으면 카카오톡으로 로그인, 아니면 카카오계정으로 로그인
if (await isKakaoTalkInstalled()) {
try {
await UserApi.instance.loginWithKakaoTalk();
print('카카오톡으로 로그인 성공');
} catch (error) {
print('카카오톡으로 로그인 실패 $error');
// 사용자가 카카오톡 설치 후 디바이스 권한 요청 화면에서 로그인을 취소한 경우,
// 의도적인 로그인 취소로 보고 카카오계정으로 로그인 시도 없이 로그인 취소로 처리 (예: 뒤로 가기)
if (error is PlatformException && error.code == 'CANCELED') {
return;
}
// 카카오톡에 연결된 카카오계정이 없는 경우, 카카오계정으로 로그인
try {
await UserApi.instance.loginWithKakaoAccount();
print('카카오계정으로 로그인 성공');
} catch (error) {
print('카카오계정으로 로그인 실패 $error');
}
}
} else {
try {
await UserApi.instance.loginWithKakaoAccount();
print('카카오계정으로 로그인 성공');
} catch (error) {
print('카카오계정으로 로그인 실패 $error');
}
}
주의 : 모든 정보를 다 가져올 수 있는 건 아닙니다. 다음의 경우 정보를 가져오지 못할 수 있으며, 이런 경우에 대한 예외처리가 별도로 필요합니다!
try {
User user = await UserApi.instance.me();
print('사용자 정보 요청 성공'
'\n회원번호: ${user.id}'
'\n닉네임: ${user.kakaoAccount?.profile?.nickname}'
'\n이메일: ${user.kakaoAccount?.email}');
} catch (error) {
print('사용자 정보 요청 실패 $error');
}
<주의 사항>
: 사용자로부터 무조건 받아올 수 있는 카카오 계정 닉네임은 user.kakaoAccount?.profile?.nickname 입니다.
user.kakaoAccount?.name이 아닙니다! (이거 때문에 한참 해멨습니다. 이 name값은 nullable한 값입니다.)
User user;
try {
user = await UserApi.instance.me();
} catch (error) {
print('사용자 정보 요청 실패 $error');
return;
}
List<String> scopes = [];
if (user.kakaoAccount?.emailNeedsAgreement == true) {
scopes.add('account_email');
}
if (user.kakaoAccount?.birthdayNeedsAgreement == true) {
scopes.add("birthday");
}
if (user.kakaoAccount?.birthyearNeedsAgreement == true) {
scopes.add("birthyear");
}
if (user.kakaoAccount?.ciNeedsAgreement == true) {
scopes.add("account_ci");
}
if (user.kakaoAccount?.phoneNumberNeedsAgreement == true) {
scopes.add("phone_number");
}
if (user.kakaoAccount?.profileNeedsAgreement == true) {
scopes.add("profile");
}
if (user.kakaoAccount?.ageRangeNeedsAgreement == true) {
scopes.add("age_range");
}
if (scopes.length > 0) {
print('사용자에게 추가 동의 받아야 하는 항목이 있습니다');
// OpenID Connect 사용 시
// scope 목록에 "openid" 문자열을 추가하고 요청해야 함
// 해당 문자열을 포함하지 않은 경우, ID 토큰이 재발급되지 않음
// scopes.add("openid")
//scope 목록을 전달하여 카카오 로그인 요청
OAuthToken token;
try {
token = await UserApi.instance.loginWithNewScopes(scopes);
print('현재 사용자가 동의한 동의 항목: ${token.scopes}');
} catch (error) {
print('추가 동의 요청 실패 $error');
return;
}
// 사용자 정보 재요청
try {
User user = await UserApi.instance.me();
print('사용자 정보 요청 성공'
'\n회원번호: ${user.id}'
'\n닉네임: ${user.kakaoAccount?.profile?.nickname}'
'\n이메일: ${user.kakaoAccount?.email}');
} catch (error) {
print('사용자 정보 요청 실패 $error');
}
}
카카오톡으로 이동되었다가 바로 앱으로 돌아옵니다.. 에러가 나진 않아요. 왜 이럴까요???
키값도 잘 입력했습니다 ㅜㅜ