안드로이드/API

[Android/Firebase/API] kakao login (2) app에서 functions 사용 및 여러 에러 다루기 & functions을 firebase local emulator에서 사용해보기

란서 2022. 8. 22. 13:32

APP에서 Functions 사용 


app에서 functions을 사용하기 위해서는 다음과 같은 작업이 필요하다.

 

1. gradle 추가

implementation 'com.google.firebase:firebase-functions-ktx:20.1.0'

 

2. functions 를 사용할 ui component에서 functions instance를 할당.

private lateinit var functions: FirebaseFunctions
functions = FirebaseFunctions.getInstance("asia-northeast3")

FirebaseFunctions로부터 instance값을 가져올 때 중요한 것은 functions의 위치(지역)을 꼭 기입해줘야 한다는 것. 

 

실제로 functions index.js에서 외부에 노출되는 함수를 작성할 때도 

exports.kakaoToken = functions.region('asia-northeast3').https.onCall((data) => {
	...
});

다음과 같이 functions.region('asia-northeast3')을 기입해주었고, 이에맞춰 app에서도 똑같은 region을 기입해줘야 한다.

 

 

3. functions의 함수를 app에서 사용.

private fun getCustomToken(kakaoAccessToken: String) {
    coroutineScope.launch {
        Log.i(TAG, "kakaoAccessToken : ${kakaoAccessToken}")
        val data = hashMapOf(
            "access_token" to kakaoAccessToken
        )

        functions.getHttpsCallable("kakaoToken")
            .call(data)
            .continueWith { task ->
                val result = task.result?.data as String

                result
            }
            .addOnCompleteListener { task ->
                if (task.isSuccessful) {
                    Log.i(TAG, "${task.result}")
                    viewModel.setCustomToken(task.result)
                } else {
                    Log.e(TAG, "${task.exception?.message}")
                }
            }
    }
}

1. functions.getHttpsCallable("functions에서 지정한 함수 이름")  을 사용하여 함수를 호출한다.

 

2. hashMap타입의 변수를 만들어 functions에서 받을 data ("access_token" to kakaoAccessToken)

.call(data) 를 통해 넘긴다.

 

3. continueWith{} 를 이용하여 functins로 부터 결과를 반환받는다.

 

4. 성공 여부를 체크하고 반환받은 결과를 ui에서 사용한다.

 

 

 

 

Local Emulators에서 functions 사용하기.


지금까지 functions의 index.js를 올바르게 작성하고, app에서 functions를 사용할 준비를 마쳤다면 

이제 functions가 정말로 잘 작동하는지 알아볼 필요가 있다. 

 

local emulators를 통해 간편하고 빠르게 functions가 앱에서 잘 작동하는지 알아보고 싶을 것이다.

 

 

우선 functions에서 local emulators를 사용하기 위해 다음과 같은 세팅이 필요하다.

 

 

1.app에서 firebase emulators를 사용

        FirebaseFunctions.getInstance("asia-northeast3").useEmulator("10.0.2.2", 5001)

 

2.project경로에서 firebase emulators실행.

firebase emulators:start

 

만약 문제가 설정이나 어딘가에 문제가 없다면 app에서 functions의 함수를 호출할 때

emulators에서 함수를 호출한 로그들이 찍힐 것이다.

 

 

그렇지 않은 경우를 다음 섹션에서 알아보도록 하자.,

 

 

여러가지 문제 및 Error 해결하기


1. local emulator를 구동한 상태에서 app에서 아무리 함수를 호출해봐도  functions에서 함수가 호출이 되지 않는 경우.

 

app에서 FirebaseFunctions의 instance를 구할 때 region을 설정해주지 않을 경우 app에서 함수를 호출한다고 해도 local emulators의 functions이 아무런 반응을 보이지 않았다.

 

private lateinit var functions: FirebaseFunctions
functions = FirebaseFunctions.getInstance("asia-northeast3")

따라서 위에서 설명한대로 제대로 된 region을 명시하여 FirebaseFunctions의 instance를 얻어 함수를 호출하도록 하자.

 

 

2.cmd에서 실행한 emulator에 error가 발생했을 경우.

local emulator설정이 제대로 되지 않았을 수도 있다.

나의 경우 다음과 같은 부분이 제대로 설정 해주지 않아서 emulator 실행에 오류가 발생하였다.

 

 

현재 project경로의 firebase emulator의 project setup이 나의 firebase console의 project name과 다를 경우.

 

project를 진행하다가 package명을 바꾸어 새롭게 firebase console에 등록을 해놓고는, (com.example -> com.xxxxx)

firebase emulators의 project setup은 계속해서 이전의 project를 설정하고 있었다.

 

firebase use --add

따라서 해당 명령어를 통해 project를 재설정해주었다.