카카오 SDK accessToken 만료와 갱신.. 문제 해결(LifecycleObserver)
카카오 SDK에서 현재.. accessToken의 유효기간은 12시간, refreshToken은 30일입니다.
카카오 SDK를 써서 앱을 개발하시는 분들은 다 알고 계시겠지만
발급받은 accessToken은 아래와 같이 유효성 검사를 할 수 있습니다.
https://kapi.kakao.com/v2/user/me 에 Header에 Key를 "Authorization" 그리고 Value를 "Bearer ACCESS_TOKEN"으로 하여 request 하면 됩니다.
정상적인 토큰이면 HTTP 200 응답과 함께 토큰 관련 정보가 json으로 옵니다.
만료된 토큰이면 HTTP 401 응답이 옵니다.
개발한 앱에서 카카오톡으로 로그인 하기를 수행하면 accessToken과 refreshToken이 생성되고 수명이 있습니다.
카카오 측의 답변을 보면 refreshToken의 수명이 남아있는 한 자동으로 accessToken이 갱신된다고 합니다.(https://devtalk.kakao.com/t/access-token/792/3)
그런데 답변이 정확하지 않은 것 같습니다. 앱이 foreground에서 계속 있다면.. accessToken이 자동으로 갱신되는 것 같으나.. background에서 있다면 accessToken이 자동으로 갱신되지 않네요.
refreshToken이 유효한 상태에서 accessToken을 갱신하려면 아래의 코드를 실행하면 됩니다.(https://devtalk.kakao.com/t/sdk/17473/2)
Session.getCurrentSession().checkAndImplicitOpen()
위 함수를 실행하면 accessToken이 항상 갱신되는 것은 아니고 만료까지 얼마 안남았을 때 갱신되는 것 같습니다.
앱이 포그라운드로 돌아올 때 위의 코드를 실행시키고자 합니다.
홈 키를 눌러 앱이 백그라운드를 가거나.. 다시 앱을 클릭해 포그라운드로 돌아왔을 때는 Activity의 onPause(), onStop()
onStart(), onResume() 함수를 override 하면.. 대략적으로 알 수 있는 것 같습니다.
그런데 문제는 앱은 여러개의 액티비티로 구성되어 있어서 모든 액티비티에 onResume() 등의 함수를 구현하는 것은.. 비효율적인 것 같습니다.
그래서 관련 정보를 찾아보니 LifecycleObserver라는 게 있네요. 비교적 최근에 추가된 함수입니다.
위의 포스팅에 정보가 있습니다.
LifecycleObserver를 사용하기 위해 app쪽 gradle에 아래의 코드를 추가합니다.
dependencies {
def lifecycle_version = "2.1.0"
annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
// alternately - if using Java8, use the following instead of lifecycle-compiler
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
}
LifecycleObserver를 implents한 클래스를 하나 만듭니다.
public class AppLifecycleObserver implements LifecycleObserver {
public static final String TAG = AppLifecycleObserver.class.getName();
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onEnterForeground() {
//앱이 다시 포그라운드로 돌아올 때 실행될 코드 작성
Session.getCurrentSession().checkAndImplicitOpen();
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onEnterBackground() {
//앱이 백그라운드로 빠질 때 실행될 코드 작성
}
}
위 코드의 onEnterForeground()에서 checkAndImplicitOpen()함수가 실행되게 만들었습니다.
그리고 Application을 상속받는 클래스를 만들고 onCreate()에서 옵저버 객체를 만들고 등록을 합니다.
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
KakaoSDK.init(new KakaoSDKAdapter());
AppLifecycleObserver appLifecycleObserver = new AppLifecycleObserver();
ProcessLifecycleOwner.get().getLifecycle().addObserver(appLifecycleObserver);
}
}
AndroidManifest에 android:name도 추가해야할 거에요 ㅎ
<application
android:name=".MyApplication"
android:label="@string/app_name"
>
이렇게만 하면.. 앱이 백그라운드로 가거나 포그라운드로 돌아올 때 LifecycleObserver의 onEnterForeground(), onEnterBackground()함수가 불립니다.
참고
안드로이드 공식 홈 : https://developer.android.com/reference/androidx/lifecycle/ProcessLifecycleOwner.html
스택오버플로우 관련 질문: https://stackoverflow.com/questions/4414171/how-to-detect-when-an-android-app-goes-to-the-background-and-come-back-to-the-fo
댓글 영역