#2023.01.13 기준 가장 최신 버전은 1.3.1
dependencies:
# 모든 카카오 라이브러리 추가를 원하는 경우
kakao_flutter_sdk: ^1.3.1
dependencies:
# 카카오 로그인만 추가하는 경우
kakao_flutter_sdk_user: ^1.3.1
main 함수에 Kakao Flutter SDK 초기화 코드를 추가합니다. 단, runApp() 메서드 호출 전에 Flutter SDK를 초기화해야 합니다! ${YOUR_NATIVE_APP_KEY} 부분에는 [내 애플리케이션] > [앱 키]에서 확인한 네이티브 앱 키를 입력합니다.
void main() {
...
KakaoSdk.init(nativeAppKey: '${YOUR_NATIVE_APP_KEY}'); // 이 줄을 runApp 위에 추가한다.
runApp(MyApp());
...
}
네이티브 앱 키는 내 애플리케이션에 들어가면 있습니다. 아래 표에서 ‘네이티브 앱 키’를 위 코드의 ${YOUR_NATIVE_APP_KEY}에 넣으면 됩니다.
안드로이드 앱에 대한 설정을 추가합니다. a. android/app/src/AndroidManifest.xml 에 카카오 로그인 Redirect URI를 추가해야 합니다. 해당 파일의application 태그 안에 새로운 activity 태그를 아래 예제와 같이 추가합니다. ${YOUR_NATIVE_APP_KEY}부분에는 [내 애플리케이션] > [앱 키]에서 확인한 네이티브 앱 키를 입력합니다.
iOS 앱에 대한 설정을 추가합니다. a. iOS 폴더에 대고 마우스 오른쪽 클릭 - [Flutter] - [Open iOS module in Xcode]을 클릭해서 iOS용 프로젝트를 엽니다. b. 앱 실행 허용 목록 설정하기 : 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"를 입력합니다. (참고로, 기존 Scheme가 존재한다면 새로 추가해서 입력하시면 됩니다.)
// 카카오 로그인 구현 예제
// 카카오톡 설치 여부 확인
// 카카오톡이 설치되어 있으면 카카오톡으로 로그인, 아니면 카카오계정으로 로그인
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');
}
}