[PHP] FCM(Firebase Cloud Messaging) 기본 & 테스트 방법(InvalidaRegistration)

프로그래밍/서버2020. 1. 4. 23:38

안녕하세요.

PHP에서 구글 FCM으로 request를 보내.. 구글 FCM 서버가 단말기(혹은 여러 단말기)에 푸시(push, notification)을 내리게 하는게 목표입니다.

 

구글 공식 가이드를 보면... PHP에서 사용할 수 있는 Firebase Admin SDK는 제공되지 않는 것 같습니다.

비공식적인 버전이 있기는 한데.. 간단하게 푸쉬만 하는 것이 목표라 사용하기가 좀 꺼려지네요. 

 

그래서 PHP에선 그냥 REST API?처럼 http(s) request를 보내야 합니다.

legacy HTTPHTTP v1로 나뉘는데 구글은 HTTP v1을 권장하고 있습니다.

그런데 php에선 HTTP v1을 사용하기가.. 힘드네요. 가이드도 딱히 없고.. 공식적으로 Firebase Admin SDK가 제공되지도 않구요..(왜 php용을 제공하지 않는 것인지 모르겠네요)

 

 

https://console.firebase.google.com/에서.. 파이어베이스 프로젝트는 당연히 만든 상태여야 합니다.

공식 가이드가 잘 되어 있으니 참고해서 프로젝트를 만듭니다.

생성한 프로젝트의 콘솔에 접속하면 여러가지 Firebase 기능들을 사용할 수 있습니다. 제가 하려고 하는 것은 Cloud Messaging입니다. 여기서 간단하게 테스트 메세지를 보낼 수 있습니다.

메세지 종류에는 2가지가 있다고 하는데.. Notification Message와 Data Message? 둘 다 보낼 수 있는 것 같네요.

테스트 단말에서 구한 token을 등록한 후에 그 토큰을 선택하고 Test 버튼을 누르면 1~2초 후에 바로 테스트 단말에 Notification(알림)이 오는 것을 확인할 수 있습니다.

 

저의 경우 그 다음 단계는.. 콘솔이 아닌 서버쪽 PHP코드에서 구글 FCM 서버로 request를 보내는 것입니다.

인터넷에 떠도는 가이드를 참고해서 php 코드를 만들어서 테스트 해봤는데 뭔가 잘 안되더라구요.

 

php가 아니라 curl처럼 직접.. request를 생성해서 테스트 해보고 싶었습니다. 이럴 때 필요한 것은 크롬 스토어에서 다운 받을 수 있는 Postman입니다. https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop 에서 다운로드 가능합니다.

 

아 그런데 제가 Postman이 아닌 Advanced RestAdvanced REST client를 다운 받았네요 ㅡ.ㅡ;; 왜 이걸 다운 받았지;;

https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo/related

위의 링크에서 다운 가능합니다.. 사용법은 둘 다 비슷한 것 같아요.

 

Postman 실행을 하면 Request 메세지를 직접.. 편리하게 작성할 수 있습니다. FCM(firebase cloud messaging)을 테스트 하기 위해서 위 사진을 참고해주세요.

 

method는 POST로, Request URL은 https://fcm.googleapis.com/fcm/send로 해주세요.

Headers에는 2개의 헤더?를 추가해주세요.

Authorization과 Content-Type입니다. Content-Type에는 application/json을 입력해주세요.

Authorization에는.. key=서버키가 들어가야 합니다.

 

서버키는 파이어베이스 콘솔에서 확인할 수 있습니다. Settings > Cloud Messaging에 가면 Server key와 Legacy server key가 있습니다. 둘 중에 아무거나 사용해도 되지만 길이가 더 긴 Server key가 보안적인 측면에서 좀 더 좋은 것 같네요.

 

핵심적인 Body도 위 사진을 참고해서 작성해주세요.

단말기 1대에 메세지를 보낼 때 위와 같이 작성하면 됩니다.

to에 해당되는 값은 테스트 단말에서 구한 Firebase Instance ID를 적으면 됩니다. 다 적고 우상단의 SEND 버튼을 누르면.. 바로 메세지가 갑니다.

단말에서 바로 푸쉬가 생기는 것을 볼 수 있습니다.

 

 

참고

(body에 notification 키가.. notification message에 해당하고.. data 키가 있다면 data message가 되는 것 같네요.. 필요에 따라 data 키도 추가해서 사용하면 될 것 같아요)

 

 

 

문제 해결

저는 처음에.. body에 to 대신에 registration_ids를 사용했었습니다.

 

위 사진처럼.. registration_ids를 넣고.. 배열 타입으로 하고 첫번째 값에만 단말기의 Firebase instance ID를 넣었었죠.

이렇게 하면 잘 동작할 줄 알았는데 InvalidaRegistration 에러가 뜨더라구요..

 

서버키도 확인했고.. 단말기의 Firebase instance ID도 다 정상인데 위 에러가 계속 뜨니 난감하더라구요..

 

보니까 단말기 1대에만 메세지를 보낼 때는 registration_ids가 아닌 to를 사용해야 합니다.. ㅜ.ㅜ

 

참고2

아이폰 알림(Notification) 기본 가이드: https://developer.apple.com/documentation/usernotifications

iOS local notification 가이드: https://medium.com/quick-code/local-notifications-with-swift-4-b32e7ad93c2

 

작성자

Posted by 드리머즈

관련 글

댓글 영역