티스토리 뷰
[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개의 기기에 동시에 메세지를 멀티캐스트 할 수 도 있다고 합니다 👍
그외에 일괄 메세지 보내기, 주제별 메세지 보내기 등도 있으니 문서를 참고해주세요!
[ 추가 ]
이 포스팅 쓸때는 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)
'🐍 > Django' 카테고리의 다른 글
[Heroku] Scheduler를 이용해서 반복 작업 돌리기 (0) | 2020.11.02 |
---|---|
[Django] Custom Management Command 만들기 (0) | 2020.10.27 |
[Django] 튜토리얼 part 6 - 정적 파일 (0) | 2020.02.29 |
[Django] 튜토리얼 part 5 (2) - 뷰 테스트 작성하기 (0) | 2020.02.22 |
[Django] 튜토리얼 part 5 (1) - 테스트 작성하기 (0) | 2020.02.20 |
- Total
- Today
- Yesterday
- drf custom error
- Flutter Spacer
- 장고 URL querystring
- Django Firebase Cloud Messaging
- flutter deep link
- Flutter 로딩
- Dart Factory
- METAL
- Sketch 누끼
- 플러터 얼럿
- flutter 앱 출시
- DRF APIException
- Watch App for iOS App vs Watch App
- 장고 Custom Management Command
- Flutter Text Gradient
- Django FCM
- 플러터 싱글톤
- PencilKit
- SerializerMethodField
- ipad multitasking
- github actions
- 구글 Geocoding API
- Django Heroku Scheduler
- Flutter getter setter
- flutter build mode
- cocoapod
- Flutter Clipboard
- flutter dynamic link
- ribs
- Python Type Hint
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |