구글에서 기존 http방식으로 전송하는 서비스를 중단하겠다고 메일로 통보해 왔다.
(이전글 : https://www.musi.co.kr/archives/102362)
변경해야 하는 부분은 서버키 방식이 아니라 접근토큰으로 인증받아야 하며, 메세지 포멧 변경, 요청 주소변경 정도이다. 즉, 메세지 수신 부분은 수정할 필요가 없다. 물론 json파싱 방식이 아닌 문자열을 잘라서 사용한 서버의 로그처리방식은 수정해야 한다.
메세지 전송 부분에서 막혀서 고생을 했다. 원인은 샘플 소스에 문제가 있었다. 심지어 자바나 Node.js 샘풀은 잘 동작한다.
public String getAccessToken(Context context) throws IOException {
InputStream inputStream = context.getResources().openRawResource(R.raw.fcmtest45662);
GoogleCredentials googleCredentials = GoogleCredentials
.fromStream(inputStream)
.createScoped(Arrays.asList(SCOPES));
// googleCredentials.refreshAccessToken().getTokenValue();
// return googleCredentials.getAccessToken().getTokenValue();
return googleCredentials.refreshAccessToken().getTokenValue();
}
위 소스에서 코멘트로 막은 부분이 원래 소스이다. refresh 다음에 값을 받아 저장하지 않고 바로 토큰을 얻으려고 하면 null에러가 발생한다.
http v1방식으로 보낸 메세지는 기존 http방식으로 수신하는 방식에서는 받을 수 없다.
현재 해결 못한 부분이 있는데, 같은 안드로이드에서 호출시에는 상대방이 백그라운드상태이거나 미실행시에도 잘 전달이 된다. 하지만, Node.js 에서 호출시에는 포그라운드상태에서만 메세지를 받을 수 있다. 다른 부분이 뭔지 좀 더 살펴봐야 한다.
샘플소스에서 project-id 를 변경하서 서비스계정 파일을 해당 위치에 놓으면 잘 실행이 된다. 다만 내 기존 소스에서는 호출하는 방식이 달라 조금 더 수정해야 했다.

2023.11.23(목)
안드로이드앱에서 호출시에는 백그라운드 상태에서도 메세지를 잘 받았는데, 새로 변경한 서버환경에서 호출할 때에는 반응하지 않았다. 문서를 읽다가 메세지 내용중에 알림과 데이타가 있는데, 둘 다 보낼 경우 바로 처리하지 않는다는 내용을 확인했다. 이건 기존에도 마찬가지이다. 즉 기존 소스에서는 알림 없이 데이터만 보내어 잘 동작했던 것이고, 새로운 것은 샘플을 기반으로 작성된 것이라 알림과 데이터가 모두 있어서 바로 처리되지 않은 거 였다. 결국 알림을 제거하고 데이터만 보내니 백그라운드에서 바로 수신이 되어 처리가 가능했다.
백그라운드에서 수신이 되는 경우라도 20초이내 처리되어야 하며, 그렇지 않은 경우 Worker를 상속받아 서비스를 호출해야한다.
