crossplatformkorea / react-native-kakao-login

react-native native module for Kakao sign in.
MIT License
352 stars 134 forks source link

E_UNKOWN Attempt to invoke virtual method 'java.lang.String com.kakao.usermgmt.response.model.Profile.getNickname()' on a null object reference 에러가 발생합니다. #140

Closed peacel closed 4 years ago

peacel commented 4 years ago

Version of kakao-login libraries

2.5.0

Version of react-native

0.62.2

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

android

Expected behavior

샘플코드의 getProfile()에서 KakaoLogins.getProfile()이 에러가 없이 정상적으로 결과를 가져와야 하는 부분입니다.

Actual behavior

KakaoLogins.getProfile() 호출시 아래와 같은 에러가 발생합니다.

Get Profile Failed:E_UNKOWN Attempt to invoke virtual method 'java.lang.String com.kakao.usermgmt.response.model.Profile.getNickname()' on a null object reference

Tested environment (Emulator? Real Device?)

갤럭시 노트 5


https://github.com/react-native-seoul/react-native-kakao-login

이 곳에 있는 샘플 코드를 실행하였습니다.

카카오톡 로그인 > 필수만 동의 (가장 위에 것) > 그 후 토큰은 정상적으로 가져오고, GetProfile()을 호출하여 "Get Profile Start" 로그가 나온 후에 위에 적은 내용과 같이 "Get Profile Failed:..." 로그가 나타납니다.

heyman333 commented 4 years ago

혹시 이렇게 됐을경우 앱이 죽나요? 아니면 그냥 단순히 경고 메세지는 아닌가요? 지금 확인해 보니 다음처럼 필수 항목이 아닌경우는 null로 데이터가 들어오는 것 같네요. (샘플프로젝트에서 확인) Screenshot_1593933066 Screenshot_1593933085

LeeKyungJoon commented 4 years ago

저도 위와 같은 오류가 발생하였습니다. 터미널에 LOG: Get Profile Failed:E_UNKOWN Attempt to invoke virtual method 'java.lang.String com.kakao.usermgmt.response.model.Profile.getNickname()' on a null object reference가 뜨는 상황입니다.개발자님이 하신 방법으로 했을 경우 위의 스크린샷처럼 잘 나오지만 현재 저희는 이메일이 필요한 상황입니다.

heyman333 commented 4 years ago

@LeeKyungJoon 안녕하세요. 저 에러메제시가 로그캣에 찎히는건지 자바스크립트단에서 찍히는건지는 다시 한번 확인해 보겠습니다~ 하지만 개발자또는 회사에서 사용자로부터 이메일정보를 받으려면 카카오측에 검수를 받아야 합니다. 그런경우가 아니라면 사용자는 앱에 이메일정보를 주지 않을 권리를 갖게 됩니다

https://developers.kakao.com/docs/latest/ko/user-mgmt/common#user-info

peacel commented 4 years ago

const getKakaoProfile = () => { logCallback('Get Profile Start', setKakaoProfileLoading(true));

KakaoLogins.getProfile()
  .then(result => {
    setKakaoProfile(result);
    logCallback(
      `Get Profile Finished:${JSON.stringify(result)}`,
      setKakaoProfileLoading(false),
    );
  })
  .catch(err => {
    logCallback(
      `Get Profile Failed:${err.code} ${err.message}`,
      setKakaoProfileLoading(false),
    );
  });

};

위의 부분에서 err를 catch해서 "Get Profile Failed:E_UNKOWN Attempt to invoke virtual method 'java.lang.String com.kakao.usermgmt.response.model.Profile.getNickname()' on a null object reference" 메시지가 콘솔 로그로 찍힙니다.

-> 보여주신 화면 이미지처럼, id는 나오고 email이 null이라도 나왔으면 하는데요. 저는 프로파일 정보를 전혀 가져오지 못하고 있습니다 ^^;;

LeeKyungJoon commented 4 years ago

@heyman333 안녕하세요. 답변 감사합니다. 우선, 개발자님께서 알려주신 답변으로 저희 회사 측에서 확인한 결과 이메일을 사용하는 것이 아닌 id를 사용하는 것으로 변경하였습니다만 @peacel 님과 같은 결과를 보여주고 있어 id 조차 사용하지 못하는 상황입니다. 현재 유일하게 가져올 수 있는 것을 login을 통한 토큰과 만료일, refresh토큰 뿐입니다. 참고로 저 에러는 로그캣에서 찍히고 있습니다. 추가로 에뮬레이터가 아닌 실제 안드로이드 기종으로 확인하고 있습니다.

heyman333 commented 4 years ago

@LeeKyungJoon @peacel 아 무슨말씀이신지 잘 알겠습니다. 이번주중에 확인하고 이상이 있을경우 수정하겠습니다.

heyman333 commented 4 years ago

@LeeKyungJoon @peacel 두분다 iOS는 잘 동작하시는건가요?

LeeKyungJoon commented 4 years ago

@heyman333 네 iOS 에서는 잘 작동하는거 확인했습니다.

Eumhongin commented 4 years ago

@heyman333 네 iOS 에서는 잘 작동하는거 확인했습니다.

혹시 iOS동작 할때 세팅 어떻게 되있는지 알수있을까요? RN 버전과 패키지에 있는 카카오 버전이 궁금합니다.

peacel commented 4 years ago

@LeeKyungJoon @peacel 두분다 iOS는 잘 동작하시는건가요?

저는 안드로이드OS에서만 체크하고 있습니다.

LeeKyungJoon commented 4 years ago

@Eumhongin 현재 iOS에서 세팅은 Pod install을 사용하였고, 개발자님께서 올리신 방법대로 AppDelegate.m에 코드를 그대로 복붙한 상태입니다. 그리고 RN 버전은 "0.61.5" 이며, 패키지에 있는 카카오 버전은 "^2.4.5"을 사용 중입니다. 코드는 다음과 같습니다. const KakaoTalk = () => { //KakaoLogins.logout() // .then(result => { // console.log('logout'); // }) // .catch(err => { // console.log('error', err); // }); KakaoLogins.login() .then(result => { KakaoLogins.getProfile() .then(result => { console.log('TTTTT', result.id); }) .catch(err => { console.log(Get Profile Failed:${err.code} ${err.message}); }); console.log('TTTTTT', result); }) .catch(err => { if (err.code === 'E_CANCELLED_OPERATION') { console.log('KakaoTalk -> err.message', err.message); } else { console.log( 'KakaoTalk -> Login Failed:${err.code} ${err.message}', Login Failed:${err.code} ${err.message} ); } }); };

heyman333 commented 4 years ago

@LeeKyungJoon 혹시 안드로이드 에뮬레이터에서는 에러가 발생하지 않으시나요? 저도 지금 새로운 프로젝트를 만들고 위와 같은 경우에 대해서 테스트 해보고 있는데 다음처럼 안드로이드 LogCat에 필요한 데이터가 잘 들어오네요 (이메일을 선택으로 두고 이메일을 체크 하지 않았습니다) 저도 안드로이드 네이티브 개발자가 아닌지라 명확한 에러상황을 파악하는데에 다소 어려움이 있습니다😭

제가 안드로이드 실기기가 없어서 지금 딱히 테스트 해볼 방법이 없네요 ㅠㅠ 에뮬레이터에서 한번 확인해 주시면 감사하곘습니다. 빨리 해결 됐으면 좋겠네요

스크린샷 2020-07-11 오후 6 19 27