# react-native fcm ios 수신 에러

# 어디서 안되는지 확인

  • token값이 유효한지 확인
  • fcm을 통해 받은 token 값을 postman을 통해 fcm.google.com으로 쏜다.
  • 결과 NotRegistred 라는 결과를 얻게됨.
  • 만약 CURL문 또는 postman을 쐈는데, success라고 뜬다면 fcm을 받는 onMessage함수 로직이 잘못됨.

# fcm send curl문 예제

curl -X POST --header "Authorization: key=${fcm_server_key}" --header "Content-Type: application/json" https://fcm.googleapis.com/fcm/send -d '{"to" : "${fcm_token}",  "priority" : "high",  "notification" : { "body" : "Background Message", "title" : "BG Title" }, "data" : { "title" : "FG Title", "message" : "Foreground Message" }}'

# fail이유가 NotRegistred

  • ios의 경우 앱이 꺼지면 fcm과 연결이 끊기면서 이전 fcm token으로 send를 보내면 NotRegistred라는 에러를 띄운다
  • 그래서 해당 ios기기는 앱 실행시 다시 fcm과 새로운 token으로 연결을 시도해야한다.
  • 그러나 앱에 재접속하고 getToken 함수를 실행하면 끊긴 token 값을 리턴해준다.
  • 그러므로 getToken으로 받은 값과 서버에 존재하는 token 값이 같다면, deleteToken을 실행하여, fcm에 지정된 ios 기기 토큰 값을 초기화 하고, 다시 getToken을 실행하여 새로운 토큰값을 받아야한다.

# 해결

const getToken = async () => {
  const oldToken = await messaging().getToken();
  // oldToken과 서버의 token이 같다면
  await messaging().deleteToken(String(${fcm_send_id}), '*');
  const newToken = await messaging().getToken();
  if (oldToken === newToken) {
     console.log('not refresh')
  } else {
    return newToken;
  }
};

# fail이유가 InvalidRegistration

  • header에 들어가는 Authorization : key=xxxxx 이 값이 이전 server key를 바라보고 있거나, 다른 프로젝트의 server key를 사용할 가능성이 크다.
  • 위 이유가 아니라면 나의 경우, 같은 계정을 여러 디바이스에서 빠르게 실행하여 fcm에서 잠시 pause를 준것 처럼 느껴졌다. 약 10분이 지나니 정상 작동하였다.
Last Updated: 3/24/2021, 8:55:12 PM