Kakao SDK 2 Beta (Rx)

Beta 서비스 중에는 기능의 변경이 발생하거나 일시적으로 서비스 접근이 불가할 수 있습니다. 변경내역

Reactive-X Kakao SDK for Android 는 Kotlin 기반으로 RxJava 라이브러리를 사용해 재사용성 향상, 비동기 처리 과정 개선과 함께 보다 간결한 인터페이스를 구현한 새로운 버전입니다. Kotlin 최신 기능(feature)과 Reactive-X를 통한 SDK log 구독(subscription) 활용이 가능하며, 토큰 저장 및 관리를 위한 기능인 토큰저장소(TokenManager)가 업데이트될 예정입니다.

설치

Kakao App 설정

Gradle 설정

Root project 의 build 파일에 repository 설정 부분에 아래와 같이 Kakao의 repository 를 추가합니다.

allprojects {
    repositories {
        google()
        jcenter()
        maven { url 'http://devrepo.kakao.com:8088/nexus/content/groups/public/' }
    }
}

사용할 앱의 build 파일에 아래와 같이 필요한 모듈을 선택적으로 설정합니다.

dependencies {
  implementation "com.kakao.sdk:user-rx:2.0.0-beta01"
  implementation "com.kakao.sdk:talk-rx:2.0.0-beta01"
  implementation "com.kakao.sdk:story-rx:2.0.0-beta01"
  implementation "com.kakao.sdk:link-rx:2.0.0beta-01"
  implementation "com.kakao.sdk:navi:2.0.0-beta01"
}
Dependencies

RxKakaoSDK 는 아래의 라이브러리들을 사용합니다.

Implementation Guide

SDK 초기화

SDK를 사용하기 위해서는 native-app-key 초기화가 필요합니다. (Kakao App 설정 참조)

Application 을 상속한 클래스를 사용하고 있다면 이 곳에서 초기화를 할 수 있습니다.


class GlobalApplication : Application() {
  override fun onCreate() {
    super.onCreate()
    // 다른 초기화 코드들

    KakaoSdk.init(this, "{your-native-app-key-here}")
  }
}

Application 을 상속한 클래스를 사용하고 있지 않다면 ContentProvider 를 상속하여 초기화를 하는 클래스를 만들고 AndroidManifest.xml에 등록할 수 있습니다.

class KakaoSdkProvider : ContentProvider() {
  ...
  override fun onCreate(): Boolean {
      KakaoSdk.init(context!!, "e19a463823bdbefb87c2c66c3fb6ab59", loggingEnabled = true)
      return true
  }
}
<application>
  ...
  <provider
    android:name=".KakaoSdkProvider"
    android:authorities="${unique한 authority 이름 (예를 들면 package name)}.KakaoSdkProvider" />
</application>
OAuthToken 가져오기

먼저 사용자는 Kakao API를 호출하기 위해 액세스 토큰을 가져와야합니다. 액세스 토큰은 OAuth 2.0 사양에 따라 발행됩니다.

  1. 카카오 계정 인증
  2. 사용자 동의 (필요하지 않은 경우 건너 뛰기)
  3. 인증 코드를 가져오고 (리디렉션을 통해) 액세스 토큰을 발행합니다 (POST API를 통해)

아래에 나열한 두가지 방법이 있습니다.

  1. 브라우져로 카카오계정 로그인 (Default browser)
  2. KakaoTalk 으로 로그인

브라우져로 카카오계정 로그인 (Default browser)

카카오 안드로이드 SDK v2 는 웹뷰를 사용하지 않고 기본 브라우저를 (Custom Tabs) 사용하여 로그인을 진행하기 때문에 아래와 같은 스킴 설정을 AndroidManifest.xml에 해주어야 합니다.

<application>
  ...
  <activity android:name="com.kakao.sdk.auth.AuthCodeCustomTabsActivity">
      <intent-filter>
          <action android:name="android.intent.action.VIEW" />

          <category android:name="android.intent.category.DEFAULT" />
          <category android:name="android.intent.category.BROWSABLE" />

          <data
              android:host="oauth"
              android:scheme="kakao{your-native-app-key-here}" />
      </intent-filter>
  </activity>
  ...
</application>

아래와 같이 authorization code 를 발급받고 이어서 OAuthToken 을 발급받을 수 있습니다.


private val disposables: CompositeDisposable = CompositeDisposable()

fun loginButtonClicked() {
  AuthCodeClient.rx.authorize(context)
    .observeOn(Schedulers.io())
    .flatMap { authCode -> AuthApiClient.rx.issueAccessToken(authCode) }
    .subscribe({}) { error -> /* 에러 처리 */ }.addTo(disposables)
}

override fun onDestroy() {
  disposables.dispose(); // 메모리 누수를 막기 위해 onDestroy() 에서 반드시 dispose() 호출. ViewModel 내에서 호출한다면 onCleared() 에서 호출.
  super.onDestroy()
}

KakaoTalk 으로 로그인
...

fun loginButtonClicked() {
  AuthCodeClient.rx.authorizeWithTalk(context, 1002 /* random request code for startActivity */)
    .observeOn(Schedulers.io())
    .flatMap { authCode -> AuthApiClient.rx.issueAccessToken(authCode) }
    .subscribe({ /* 성공 */}) { error -> /* 에러 처리 */ }.addTo(disposables)
}

override fun onDestroy() {
  disposables.dispose(); // 메모리 누수를 막기 위해 onDestroy() 에서 반드시 dispose() 호출. ViewModel 내에서 호출한다면 onCleared() 에서 호출.
  super.onDestroy()
}
Token based API 호출하기

위 단계에서 access token을 성공적으로 가져오면 token based API를 호출할 수 있습니다. 다음은 현재 KakaoSDK에서 지원되는 API 세트 입니다.

  • UserApiClient
  • TalkApiClient
  • StoryApiClient

UserApiClient에 있는 me()를 호출하는 예제 입니다.

...

private val disposables: CompositeDisposable = CompositeDisposable()

func userMe() {
    UserApiClient.rx.me()
      .subscribe ({ user -> /* 유저 응답 사용 */}) { error -> /* 에러 처리 */}
      .addTo(disposables)
}

...

override fun onDestroy() {
  disposables.dispose(); // 메모리 누수를 막기 위해 onDestroy() 에서 반드시 dispose() 호출
  super.onDestroy()
}
Appkey based API 호출하기
  • KakaoLink

KakaoLink API는 토큰 기반 API가 아니기 때문에 로그인 프로세스 없이 SDK 초기화 이후에 사용할 수 있습니다.

아래는 커스텀 템플릿으로 KakaoLink 메시지를 전송하는 예입니다.

...

func customLink() {
    LinkClient.rx.customLink(context, 637)
        doOnSuccess { intent ->
            context.startActivity(intent)
        }
            .subscribe({}) { error -> /* 에러 처리 */}
        .addTo(disposables)
}

...

override fun onDestroy() {
  disposables.dispose(); // 메모리 누수를 막기 위해 onDestroy() 에서 반드시 dispose() 호출
  super.onDestroy()
}

SDK Feature

Token 자동갱신

토큰만료 에러시 토큰은 자동갱신됩니다.

동적동의(Dynamic User Agreement)

임의의 사용자의 동의가 필요한 경우 (가입 시 유저가 동의하지 않았거나, 앱설정에 이용중 선택으로 설정한 경우) 직접 유저에게 해당 정보 제공 동의를 받아야 합니다. 이를 동적동의 라고 합니다. 간단하게 동적동의를 구현할 수 있는 operator 를 제공합니다.


private val disposables: CompositeDisposable = CompositeDisposable()
...

fun talkFriends() {
    TalkApiClient.rx.friends()
        .retryWhen(TokenBasedApiInterceptor.instance.handleInvalidScope(context))
        .subscribe({ friends -> /* 응답 사용 */}, { error -> /* 에러 처리 */})
        .addTo(disposables)
}

...

override fun onDestroy() {
  disposables.dispose(); // 메모리 누수를 막기 위해 onDestroy() 에서 반드시 dispose() 호출
  super.onDestroy()
}

Customization

  1. TokenManager
  2. sdk(release) log subscription : Reactive-x only

Documentation

Docs 는 Dokka 에 의해 생성되며 결과 문서 페이지는 KakaoDevelopers 에서 제공됩니다.

변경 이력

변경날짜 변경이력 버전
2019.12.09 베타 서비스 개시 2.0.0-beta01

Last Modified : 2019-12-09