crossplatformkorea / react-native-kakao-login

react-native native module for Kakao sign in.
MIT License
358 stars 135 forks source link

안드로이드에서 getProfile 오류 #233

Closed kwangheum closed 2 years ago

kwangheum commented 3 years ago

Version of kakao-login libraries

3.3.0

Version of react-native

0.64.1

Platforms you faced the error (IOS or Android or both?)

android

Expected behavior

getProfile오류

Actual behavior

kotlin.Unit cannot be cast to kotlin.jvm.functions.Function2

getProfile RNKakaoLoginsModules.kt:133

Tested environment (Emulator? Real Device?)

pixcel_3a_API_30_x86

readme에 적힌 내용을 전부 해줬는데도 오류가 나네요 참고로 빌드는 정상적으로 됩니다. 해당 메소드 호출 시에만 오류가 납니다. ios는 잘 동작 합니다.

kosick commented 3 years ago

@react-native-seoul/kakao-login: "3.3.2", react-native: "0.64.0",

같은 문제를 겪고 있습니다. iOS 는 프로필 조회가 가능한데 android 는 크래시가 납니다.

marine1079 commented 3 years ago

저도 같은 문제가 생기네요.

ninhconggiang94 commented 3 years ago

I am having the same problem

ruebark commented 3 years ago

"react-native": "0.64.2", "@react-native-seoul/kakao-login": "3.3.2",

안드로이드 에뮬레이터 사용

kotlin.KotlinNullPointerException at com.dooboolab.kakaologins.RNKakaoLoginsModule$getProfile$1.invoke(RNKakaoLoginsModule.kt:143) at com.dooboolab.kakaologins.RNKakaoLoginsModule$getProfile$1.invoke(RNKakaoLoginsModule.kt:10)

사용 중 android getProfile가 위의 이슈로 크래시가 나는 경우 [카카오 로그인] -> [동의항목] -> 카카오계정(이메일) 을 선택 동의 이상으로 올렸을 경우 크래시가 사라졌습니다. 임시 방편으로 시도해보세요.

kr-yeon commented 2 years ago

이메일 선택 동의 이전의 kakaoUser값을 print해보니 null이 나옵니다.

val kakaoUser = user.kakaoAccount promise.resolve(kakaoUser) return@me

이메일 선택 동의시 값은 Account(profileNeedsAgreement=null, profile=null, emailNeedsAgreement=true, isEmailValid=null, isEmailVerified=null, email=null, ageRangeNeedsAgreement=null, ageRange=null, birthyearNeedsAgreement=null, birthyear=null, birthdayNeedsAgreement=null, birthday=null, birthdayType=null, genderNeedsAgreement=null, gender=null, ciNeedsAgreement=null, ci=null, ciAuthenticatedAt=null, legalNameNeedsAgreement=null, legalName=null, legalBirthDateNeedsAgreement=null, legalBirthDate=null, legalGenderNeedsAgreement=null, legalGender=null, phoneNumberNeedsAgreement=null, phoneNumber=null, isKoreanNeedsAgreement=null, isKorean=null) 가 됩니다.

null체크를 한번 한 후 id만 뽑아오는 형식으로 수정을 한다고 생각을 해보죠.

node_modules/@react-native-seoul/kakao-login/android/src/main/java/com/dooboolab/kakaologins/RNKakaoLoginsModules.kt를 수정합니다. priivate fun getProfile 함수의 내용을

UserApiClient.instance.me { user: User?, error: Throwable? ->
            if (error != null) {
                promise.reject("RNKakaoLogins", error.message, error)
                return@me
            }

            if (user != null) {
                val map = Arguments.createMap()
                map.putString("id", user.id.toString())
                val kakaoUser = user.kakaoAccount
                if (kakaoUser != null) {
                    map.putString("email", kakaoUser!!.email.toString())
                    map.putString("nickname", kakaoUser.profile?.nickname)
                    map.putString("profileImageUrl", kakaoUser.profile?.profileImageUrl)
                    map.putString("thumbnailImageUrl", kakaoUser.profile?.thumbnailImageUrl)

                    map.putString("phoneNumber", kakaoUser.phoneNumber.toString())
                    map.putString("ageRange", kakaoUser!!.ageRange.toString())
                    map.putString("birthday", kakaoUser.birthday.toString())
                    map.putString("birthdayType", kakaoUser.birthdayType.toString())
                    map.putString("birthyear", kakaoUser.birthyear.toString())
                    map.putString("gender", kakaoUser.gender.toString())
                    map.putBoolean("isEmailValid", convertValue(kakaoUser.isEmailValid))
                    map.putBoolean("isEmailVerified", convertValue(kakaoUser.isEmailVerified))
                    map.putBoolean("isKorean", convertValue(kakaoUser.isKorean))
                    map.putBoolean("ageRangeNeedsAgreement", convertValue(kakaoUser.ageRangeNeedsAgreement))
                    map.putBoolean("birthdayNeedsAgreement", convertValue(kakaoUser.birthdayNeedsAgreement))
                    map.putBoolean("birthyearNeedsAgreement", convertValue(kakaoUser.birthyearNeedsAgreement))
                    map.putBoolean("emailNeedsAgreement", convertValue(kakaoUser.emailNeedsAgreement))
                    map.putBoolean("genderNeedsAgreement", convertValue(kakaoUser.genderNeedsAgreement))
                    map.putBoolean("isKoreanNeedsAgreement", convertValue(kakaoUser.isKoreanNeedsAgreement))
                    map.putBoolean("phoneNumberNeedsAgreement", convertValue(kakaoUser.phoneNumberNeedsAgreement))
                    map.putBoolean("profileNeedsAgreement", convertValue(kakaoUser.profileNeedsAgreement))
                }
                promise.resolve(map)
                return@me
            }

            promise.reject("RNKakaoLogins", "User is null")
        }

이렇게 수정합니다.

그 후 node_modules/@react-native-seoul/kakao-login/index.d.ts를 수정합니다

export declare const getProfile: () => Promise<KakaoProfile>; -> export declare const getProfile: () => Promise<KakaoProfile | {id: string}>;

저는 id만 필요하기 때문에 이렇게 수정했지만, 하나의 (선택/필수)항목이라도 있을 경우 UserData는 null이 아닐거라 생각됩니다. 3.4.0버전의 사용을 바라며, 저처럼 동의 항목이 없는 경우 이렇게 수정하면 원하는 동작대로 작동 됩니다.

이것 또한 임시방편이라고 생각됩니다.

3.4.0 기준으로 작성했기 때문에 업데이트 하고 하시는걸 추천드립니다.