Activity Result API를 사용한 Facebook 로그인

Jonghwan Choi·2023년 2월 16일
0

Open API

목록 보기
1/3

개요

Facebook 로그인 코드를 공식 문서대로 작성했다면 Activity 클래스의 onActivityResult() 메소드를 써서 로그인 결과를 받았을 것이다. 그런데 이 메소드는 현재 deprecate되어 있어 취소선이 찍 그어진 것이 보기가 싫다. 그 대안으로 나온 것이 Activity Result API인데, Facebook로그인은 공식적으로 Activity Result API도 지원하지만 예제 코드까지 알려주지는 않는다. 그래서 한번 직접 구현해 보았다.

개발자 콘솔에 앱 등록하는 절차, 의존성 추가, Manifest 편집 등 사전 준비는 기존 방법과 동일하므로 공식 문서 참고.

코드

Activity 클래스에서는 Activity Result API를 못 쓴다. AppCompatActivity 클래스여야 함.

// 초기화 부분
val callbackManager = CallbackManager.Factory.create()
val contract = 
	LoginManager.getInstance().createLogInActivityResultContract(callbackManager)

val resultLauncher = registerForActivityResult(contract){ result ->
    if (result.resultCode == Activity.RESULT_OK) {
        val intent = result.data
        val resultKey = "com.facebook.LoginFragment:Result"
        val loginClientResult = 
        	intent?.getParcelableExtra<LoginClient.Result>(resultKey)
        val accessToken = loginClientResult?.token
        
        // accessToken 안에 있는 유저 정보 꺼내서 후속 작업 진행
    }
    else {
        Toast.makeText(this, "로그인 실패", Toast.LENGTH_SHORT).show()
    }
}
    
// 로그인 실행 부분
resultLauncher.launch(listOf("public_profile"))

참고한 페이지

마지막 launch() 메소드에 들어갈 인자는 요청할 페이스북 권한(permission) 리스트이다. 자세한 내용은 공식 문서 참고.

문제점

위의 참고한 페이지 링크에서 질문자가 언급한 내용인데, 코드를 보면 로그인 정보가 담긴 인텐트를 파싱하기 위해 key값 (위 코드의 resultKey) 이 무엇인지 알아야 한다. 그런데 이 key값이 com.facebook.LoginFragment 클래스에 internal 변수로 저장되어 있어 외부에서 참조하지 못하게 되어 있다. 즉 key값을 개발자가 직접 적어야 하므로 Facebook 측에서 혹시 이 값을 변경할 경우 에러가 나게 된다. 위 코드를 사용한다면 유념해 두어야 할 것 같다.

profile
유니티 게임 클라이언트 개발자를 꿈꾸는 뉴비

0개의 댓글