확실히 iOS의 경우 안드로이드 보다 신경 쓸게 훨씬 많다...
기본적으로 pub.dev에 있는 ReadMe를 보면서 수행했다.
피곤하니까 바로 본론 정리해야지
일단 kakao_flutter_sdk 와 함께 dependency가 있는 package들을 같이 pubspec.yaml에 넣고 pub get을 해준다.
kakao_flutter_sdk: ^0.9.0
dio: ^4.0.0
json_annotation: ^4.0.1
shared_preferences: ^2.0.5
platform: ^3.0.0
package_info_plus: ^1.0.4
project_folder/ios/Podfile에 들어가면 platform : ios, '9.0'
이라고 위에 써있을 것이다.
minimum iOS version이 11.0 이기 때문에 iOS deployment의 주석을 해제하고 '11.0'으로 바꿔줘야 한다.
flutter clean
flutter pub get
flutter pub run
flutter run
https://developers.kakao.com/ 에 들어가서 본인의 카카오 계정으로 로그인 한다.
(참고로 카카오에서 만드는 프로젝트라면 본인의 계정이 아니라 카카오 사내 계정으로 로그인 해야 하더라!)
로그인 후에 상단바의 '내 어플리케이션'에 들어가서
애플리케이션 추가하기 버튼을 누르고
애플리케이션 추가하기에 앱 이름과 사업자명을 쓴다.
그러면 새로 추가된 애플리케이션이 보이는데 거기서 보이는 네이티브 앱 키를 계속 사용할 거다.
이 부분을 마지막으로 쓰는데 급격히 힘이 떨어져서... 밑에 reference로 달아둔 벨로그들 보면 잘 설명 돼있다.
하튼 위 3번의 카카오 개발자 페이지에서 내 애플리케이션 > 앱 설정 > 플랫폼
화면에 들어가서 'iOS 플랫폼 등록'이라는 버튼을 누른다. 이 때 앱스토어 ID랑 마켓 URL은 앱 출시 후 생성되기 때문에 채워줄 필요가 없고 번들 ID
만 만들어 주면 된다.
이는 'ios/Runner.xcodeproj/project.pbxproj' 파일에서 PRODUCT_BUNDLE_IDENTIFIER를 확인해도 되고,xCode에서 Runner > General > Identity > Bundle Identifier를 확인해주면 된다.
그 다음 카카오 개발자 페이지에서 내 애플리케이션 > 앱 설정 > 제품 설정 > 카카오 로그인
에서 카카오 로그인 활성화 버튼을 ON으로 바꿔주고, 내 애플리케이션 > 앱 설정 > 제품 설정 > 동의 항목
에서 적절한 값들 (e.g. 성별, 닉네임, 이메일 etc)를 동의 항목에 추가해서 가져올 수 있다.
project_folder/ios/Runner.xcworkspace를 들어가면 xCode에서 이 플러터 프로젝트에 대한 설정을 할 수 있는 아래 화면이 나온다. Runner의 Targets에 들어있는 runner로 들어간 뒤 info를 들어가면 Custom iOS Target Properties가 나온다 (여기 말고 Runner/Runner/info.plist에 들어가서 고쳐도 된다.) 여기서 'KAKAO_APP_KEY'를 추가하고 밑에 URL Types 항목에 새로운 url을 추가하고, URL Schemes에 'kakao'를 앞에 붙이고 네이티브키를 입력하면 된다. (i.e. kakao${native key})
마지막으로 info.plist
에 아래와 같은 코드를 추가해주면 설정은 끝이다.
<key>LSApplicationQueriesSchemes</key>
<array>
<!-- common -->
<string>kakao${native_app_key_here}</string>
<!-- KakaoTalk login -->
<string>kakaokompassauth</string>
<string>storykompassauth</string>
<!-- KakaoLink -->
<string>kakaolink</string>
<string>kakaotalk-5.9.7</string>
</array>
이게 제일 중요하다! 다른 블로그를 봐도 flutter_kakao_sdk 0.9.0 보다 훨씬 이전의 것들을 다루기 때문에 클래스 이름들과 메소드 이름들이 상당히 다르다. 무엇보다 공식 ReadMe example에 함정 카드가 설치 되있기 때문에 조심해야 된다.
6-1.일단 main function에 아래와 같이 카카오 클라이언트 아이디에 네이티브앱키를 넣어준다.
void main() {
KakaoContext.clientId = "네이티브앱키";
runApp(const MoilkApp());
}
6-2. 그 다음 카카오 로그인 기능을 쓸 stful 위젯 안에 isInstalled라는 값을 추가해준다. 기기에 카카오톡 앱이 깔려있는지 아닌지 확인해주는 값이다. 이것을 initState에 넣어준다.
bool _isInstalled = true;
_initKaKaoTalkInstalled() async {
final installed = await isKakaoTalkInstalled();
setState(() {
_isInstalled = installed;
}
);
}
void initState() {
super.initState();
_initKaKaoTalkInstalled();
}
6-3. 동일한 stful 위젯 안에서 login Button을 눌렀을 때의 function을 넣어준다.
pub.dev에 기록된 공식 문서에 따르면 authCode를 받아오고, 이를 통해 AccessTokenResponse를 받는다.
마지막으로 이 토큰을 shared preferences에 넣어주기 위해 TokenManager.instance.setToken(token);
이라는 문장을 넣는다.
void loginButtonClicked() async {
try {
String authCode = await AuthCodeClient.instance.request(); // via browser
// String authCode = await AuthCodeClient.instance.requestWithTalk() // or with KakaoTalk
AccessTokenResponse token = await AuthApi.instance.issueAccessToken(authCode);
TokenManager.instance.setToken(token); // Store access token in TokenManager for future API requests.
} catch (e) {
// some error happened during the course of user login... deal with it.
}
}
위의 공식 문서 주의!
위 예제는 TokenManager.instance.setToken()
을 사용하라고 하지만 실제 TokenManager
는 instance
라는 변수가 없다..
따라서 DefaultTokenManager
라는 다른 클래스를 사용해야 하는데, DefaultTokenManager
의 instance
변수는 static type이 아니라서 DefaultTokenManager.instance
와 같은 방식으로 부르지 못한다.
대신 constructor를 호출하면 instance
를 return하는 방식이기 때문에 tokenManager
라는 변수를 선언해서 constructor를 통해 instance를 불러오고, 이를 통해 tokenManager.setToken(token)
을 불러줘야 한다고 패키지코드를 하나하나 확인해보며 알아낼 수 있었다. 아래에 내가 만든 새로운 onClicked funtion을 보면 이해가 쉬울 것이다.
void loginButtonClicked() async {
try {
final authCode = _isInstalled
? await AuthCodeClient.instance.requestWithTalk()
: await AuthCodeClient.instance.request(); // via browser
// String authCode = await AuthCodeClient.instance.requestWithTalk() // or with KakaoTalk
var token = await AuthApi.instance.issueAccessToken(authCode);
var tokenManager = DefaultTokenManager();
tokenManager.setToken(token);
// Store access token in TokenManager for future API requests.
} catch (e) {
// some error happened during the course of user login... deal with it.
}
}
공식 문서와 다른 점은, 만약 카카오톡이 기기에 깔려 있다면 카카오톡에서 Auth code를 가지고 오고, 아닌 경우 web에서 가져오는 부분을 추가했을 뿐이다.
이상 많은 사람들이 kakao log in을 플러터 앱에서 사용했으면 좋겠다!
모두 화이팅! :)