티스토리 뷰

🐍/Django

[Django] FCM 서버를 통해 앱에 푸쉬보내기

사용자 eungding 2020. 10. 24. 17:06
728x90
반응형

[Flutter] Firebase Cloud Messaging 연동 + 파베 콘솔에서 푸쉬보내기 에서  푸쉬를 받는 클라이언트(iOS, 안드로이드) 쪽 설정을 해줬는데요

이제 푸쉬를 보내는 서버쪽 작업을 해주겠습니다.

 

 

문서 중 서버환경 쪽 보면 됩니다. 

 

 

[1]  Firebase 클라우드 메시징의 서버 구성요소 

 

우선 Firebase 클라우드 메시징의 서버 측 구성요소는 2가지입니다.

 

  • Google에서 제공하는 FCM 백엔드
  • 서버 로직이 실행되는 앱 서버

 

저의 앱 서버가 FCM 백엔드에 메시지 요청을 보내면

FCM 백엔드는 사용자 기기에서 실행되는 클라이언트 앱에 메시지를 보내는 플로우입니다. 

 

[2]  나의 서버가 FCM 서버랑 상호작용하는 방법

 

FCM 서버랑 상호작용하는 방법은 여러가지가 있는데요, 

저는 문서에서 권장하는 1번 방법으로 할게요! 

 

참고로 3번째 HTTP 방법은 HTTP v1으로 마이그레이션하라고 가이드하고 있으니까 안해주는게 좋을 것 같아요! 

(관련문서: firebase.google.com/docs/cloud-messaging/migrate-v1?authuser=1

 

 

참고로  pyfcm , fcm-django 이라는 파이썬 패키지도 있답니다. (근데 복잡하지 않아서 굳이 패키지 안써도 될것같아요)

 

 

[3] Firebase Admin SDK 설치

firebase.google.com/docs/admin/setup?hl=ko 를 참고해서 해보겠습니다. 

 

자신의 가상환경에 진입해서

conda activate 가상환경이름

 

firebase-admin을 설치해줍니다. 

 pip install firebase-admin

 

그 다음에 비공개 키 파일을 생성해주라고 하네요 

 

 

파베 콘솔 > 설정 > 서비스 계정에 들어가서 비공개키를 생성해주세요

 

 

생성 버튼을 누르면 json파일이 다운로드 되는데,

문서에 적혀있는 이름이랑 똑같이 파일명을 바꿔주고 장고플젝에 넣어줬습니다. 

 

 

settings.py에 가서 Admin SDK setup을 해줍니다. 

import firebase_admin
from firebase_admin import credentials

cred_path = os.path.join(BASE_DIR, "serviceAccountKey.json")
cred = credentials.Certificate(cred_path)
firebase_admin.initialize_app(cred)

 

[4] FCM 서버로 요청보내기

 

우선 push_notification 이라는 이름의 앱을 하나 만들어줄게요

python manage.py startapp push_notification

 

settings.py에 앱이름도 추가해주세요 

 

 

 

그리고 push_notification 앱안에 push_fcm_notification.py라는 파일을 만들어주었어요 

문서를 참고하여 이렇게 코드를 작성해주었습니다.

 

 

 

 

 

일단 push_notification의  init.py에서 저 메소드를 실행하도록 해줍니다. 

from .push_fcm_notification import *

send_to_firebase_cloud_messaging()

참고로 프로젝트 설정(여기서 Admin SDK초기화해줌)이 끝나고 앱의 init.py가 불린답니다.

(나중에 django-crontab을 써서 자동화된 푸쉬작업을 해주면 좋겠죠..?! 일단 지금은 테스트니까 이렇게 해줄게요-=) 

 

 

 

그리고 서버를 돌려보면 

python manage.py runserver localhost:8000

 

특정 디바이스로 알림이 잘 오는 것을 볼 수 있습니다. 

 

 

 

[5] 여러 기기에 메세지 보내기 등등

 

최대 100개의 기기에 동시에 메세지를 멀티캐스트 할 수 도 있다고 합니다 👍

https://firebase.google.com/docs/cloud-messaging/send-message?hl=ko

 

그외에 일괄 메세지 보내기, 주제별 메세지 보내기 등도 있으니 문서를 참고해주세요! 

 

 

 

[ 추가 ]

 

이 포스팅 쓸때는 push_notification이라는 앱으로 만들어서 했는데, 앱으로 안만들어도 될 것 같아요!! 

 

저는 플젝에 파일로 만들어주고 

 

 

사용하는 쪽에서  이런식으로 써주게 바꿨습니다~ 

 

import fcm_notification

... 

fcm_notification.send_push_when_new_family_question_registered(family_question)

 

 

 

[ 추가 ]

 

발생할 수 있는 오류에 대해서 

문서에서 말하고 있는 것 첨부합니다. 

 

영어버전
한국어버전

저는 try except문으로 출력해줬어요 

    try:
        response = messaging.send(message)
        # Response is a message ID string.
        print('Successfully sent message:', response)
    except Exception as e:
        print('예외가 발생했습니다.', e)
728x90
반응형
댓글
  • 프로필사진 ch 여기서 자꾸 firebase_admin.exceptions.InvalidArgumentError: The registration token is not a valid FCM registration token
    이런 오류가 뜨는데 registration_token 여기 값에 웹구성에 웹푸시 인증서에 키쌍을 넣는 것이 맞나요?
    2020.11.01 22:45
  • 프로필사진 사용자 eungding 안녕하세요~~
    registration_token에는 클라이언트(ios, 안드로이드 앱)에서 알려준 FCM 토큰을 넣으셔야해요!!
    (내가 보낼 기기의 FCM토큰값을 넣어주면 되요)

    https://eunjin3786.tistory.com/280
    클라쪽 FCM토큰 구하는 포스팅인데 참고해주세용!
    2020.11.02 22:11 신고
  • 프로필사진 ch 네!! 저는 웹앱으로 받아서 헤맸던 것 같습니다! 해보겠습니다! 2020.11.04 19:59
  • 프로필사진 dnfla firebase_admin._messaging_utils.SenderIdMismatchError: SenderId mismatch
    계속 이런 오류가나는데 혹시 원인을 알 수 있을까요??
    2020.11.14 19:11
  • 프로필사진 사용자 eungding SENDER_ID_MISMATCH 인증 된 발신자 ID가 등록 토큰의 발신자 ID와 다릅니다. 이는 일반적으로 발신자와 대상 등록 토큰이 동일한 Firebase 프로젝트에 없음을 의미합니다.

    출처:
    https://firebase.google.com/docs/reference/admin/error-handling


    문서에 위와 같이 나와있는데,
    서버쪽과 클라쪽의 프로젝트 설정쪽을 확인해보시면 좋을 것 같아요!!
    2020.11.15 16:57 신고
댓글쓰기 폼