KakaoWebViewActivity 초기화 실패시에는 finish 시켜야 하는거 아닌가요?

카카오 로그인을 앱에 구현을 하였습니다.
그런데 앱 시나리오 상 사용자가 항상 카카오 로그인을 사용하는게 아니라서, KakaoAdapter 가 항상 인스턴스가 존재할 필요가 없다고 판단하여, 사용자가 실제 로그인 시도시에만 KakaoSDK.init()를 하도록 하였습니다.

그런데 다음과 같은 상황에서는 오류가 발생하더군요.

  1. KakaoWebViewActivity 가 전면에 노출된 상태에서 사용자가 홈키를 눌러 런쳐로 나감
  2. 한동안 사용안하고 있다가 메모리 부족으로 OS가 앱 프로세스를 kill.
  3. 다시 앱을 실행하면 KakaoWebViewActivity 화면 재생성
  4. 앞서 앱 프로세스 kill로 인해 KakaoAdapter가 존재하지 않음
  5. 따라서 KakaoWebViewActivity의 init()에서 KakaoSDK.getAdapter().getSessionConfig() 하다가 NPE 발생

application 생성될 때 무조건 KakaoSDK.init()를 하면 해결될 문제가 아니냐? 라고 말씀하실 수도 있습니다.
하지만 어차피 저런 상황에서는 KakaoWebViewActivity의 결과를 받아야 할 프래그먼트(사실 이 부분 관련해서도 문제가 있습니다만)가 증발된 상황이니, 결과를 받을수가 없는 상황이네요;;

그리고 사용하지도 않을 인스턴스가 프로세스 생명주기 내내 메모리를 차지하는게 맘에도 들지 않을 뿐더러,(심지어 null 처리도 못 시킵니다.) 프로세스 생성 때마다 SDK 초기화를 강제하는 것은 좋다고 생각되지는 않습니다.

KakaoAdapter 가 null인지 확인하여 KakaoWebViewActivity를 바로 종료시켜야 하는게 아닌가 생각됩니다.

그리고 위에도 말했지만 로그인 결과를 받는 콤포넌트가 액티비티로 강제되어 있는것도 수정이 되었으면 합니다. Session.getCurrentSession().open() 에 액티비티만 가능하네요. 다른 SNS들의 로그인 SDK들은 모두 프래그먼트를 지원하는데 반해 카카오 SDK는 아직도 액티비티를 써야 해서 많이 불편합니다.

1개의 좋아요

안녕하세요 개발자님, 소중한 의견 감사드립니다. 말씀해 주신 부분들은 합리적인 문제 제기라고 생각합니다. 제 생각에 지금 방식대로 구현되어 있는 이유는 SDK 개발의 용이성 때문인 것 같습니다.

저희 로그인 SDK는 단순히 토큰을 발급 받고 유저의 정보를 가져오는데서 그치는 것이 아니라 OAuth 권한 처리, 토큰 자동 갱신, 주기적 갱신, 내부적으로는 연령 인증 등등 다양하고 복잡한 로직을 가지고 있습니다. 이런 다양한 로직들이 실행되기 전에 SDK가 원하는 상태가 있는데, 안드로이드 프로세스가 언제 kill되고 다시 살아나던지 이 상태를 쉽게 보장할 수 있는 곳이 Application이기 떄문에 메모리의 효율성을 조금 희생하고 이 방식을 택한 것 같습니다. 비슷한 이유로 페이스북 SDK 또한 FacebookSDK.sdkInitialize라는 메소드를 통하여 앱 프로세스 생성 시 초기화를 호출하고 있구요. (물론 최근에는 Application 객체에서 하지 않고 FacebookInitProvider라는 곳에서 하도록 변경하였지만, 어쨋던 프로세스 생성시 초기화가 되는 것은 마찬가지라고 생각합니다).

지금 구현은 이렇게 되어있지만 비효율적인 부분을 개선하기 위해서 지속적으로 검토하고 고민할 것을 약속드려요~ 올해 SDK의 고도화/안정화를 최우선 목표로 잡고 있어서 지속적인 리팩토링과 개선으로 리소스를 lazy하고 효율적으로 사용하면서 원하는 기능을 구현할 수 있도록 노력하겠습니다!

이 외에 말씀해주신 로그인 시 프래그먼트 지원은 이슈를 인지하고 있고 최대한 빨리 지원할 계획입니다. SDK의 발전을 위한 피드백들을 주셔서 정말 감사드리고 언제든지 좋은 말씀 해주시면 적극 검토하도록 하겠습니다. 감사합니다 :slight_smile: