# FCM : 앱 푸시알림 기능 + 크로스 플랫폼 지원 + 리소스 낭비 최적화
본 실습은 클라우드 서버를 통해 앱 푸시를 보내기 위한 요청함수를 작성하는 시간을 가져보겠다.
1. Admin SDK
> 지난 시간에 받은 비공개 키(아래글 참고)
https://www-seok-com.tistory.com/62
해당 Admin sdk.json를 서버 프로젝트에 추가
2. Access_token
> google oauth2의 FCM Access 토큰값을 얻어온다.
import google.auth.transport.requests
from google.oauth2 import service_account
# 구글 OAuth2 FCM URL
SCOPES = ['https://www.googleapis.com/auth/firebase.messaging']
# 파이어베이스 admin JSON PATH
PATH = '/Users/seok/test/firebase_admin_sdk.json'
def get_access_token():
credentials = service_account.Credentials.from_service_account_file(
PATH, scopes=SCOPES)
request = google.auth.transport.requests.Request()
credentials.refresh(request)
return credentials.token
3. FCM Token
> 지난 시간에 Flutter > Server로 요청한 FCM토큰 값을 받아온다.
https://www-seok-com.tistory.com/63
> 보낼 메세지 내용을 전달
@app.post("/fcm_token")
async def send_fcm_message(FCMTokenModel: FCMTokenModel):
# FCM 메시지 데이터
message_data = {
"message": {
# 디바이스 토큰
"token": FCMTokenModel.fcm_token,
# 앱 푸시 내용
"notification": {
"title": "FCM 모햇",
"body": "매월드림모햇 고객님! 안녕하세요. 고수입니다.",
},
# 추가 데이터 전달 (커스텀 동작 트리거)
"data": {
"click_action": "FCM Test Click Action",
},
# android
"android": {
"notification": {
"click_action": "Android Click Action",
}
},
# ios
"apns": {
"payload": {
"aps": {
"category": "Message Category",
"content-available": 1
}
}
}
}
}
4. FCM 요청
> FCM Post 요청
# FCM 요청
response = requests.post(
url="https://fcm.googleapis.com/v1/projects/flutter-notify-522bb/messages:send",
headers={
"Authorization": "Bearer " + get_access_token(),
"Content-Type": "application/json"
},
json=message_data
)
# 응답 처리
if response.status_code == 200:
print("FCM 요청 성공!")
else:
print(f"FCM 요청 실패: {response.text}")
더보기
from fastapi import FastAPI, Request
import requests
from pydantic import BaseModel
import google.auth.transport.requests
from google.oauth2 import service_account
app = FastAPI()
# 구글 OAuth2 FCM URL
SCOPES = ['https://www.googleapis.com/auth/firebase.messaging']
# 파이어베이스 admin JSON PATH
PATH = '/Users/seok/test/firebase_admin_sdk.json'
class FCMTokenModel(BaseModel):
fcm_token: str
#---------------------------------- 액세스 토큰을 가져오는 함수 ----------------------------------#
def get_access_token():
credentials = service_account.Credentials.from_service_account_file(
PATH, scopes=SCOPES)
request = google.auth.transport.requests.Request()
credentials.refresh(request)
return credentials.token
#---------------------------------- FCM 요청 함수 ----------------------------------#
@app.post("/fcm_token")
async def send_fcm_message(FCMTokenModel: FCMTokenModel):
# FCM 메시지 데이터
message_data = {
"message": {
# 디바이스 토큰
"token": FCMTokenModel.fcm_token,
# 앱 푸시 내용
"notification": {
"title": "FCM 모햇",
"body": "매월드림모햇 고객님! 안녕하세요. 고수입니다.",
},
# 추가 데이터 전달 (커스텀 동작 트리거)
"data": {
"click_action": "FCM Test Click Action",
},
# android
"android": {
"notification": {
"click_action": "Android Click Action",
}
},
# ios
"apns": {
"payload": {
"aps": {
"category": "Message Category",
"content-available": 1
}
}
}
}
}
# FCM 요청
response = requests.post(
url="https://fcm.googleapis.com/v1/projects/flutter-notify-522bb/messages:send",
headers={
"Authorization": "Bearer " + get_access_token(),
"Content-Type": "application/json"
},
json=message_data
)
# 응답 처리
if response.status_code == 200:
print("FCM 요청 성공!")
else:
print(f"FCM 요청 실패: {response.text}")
5. 앱 푸시 메시지 확인
> 필자는 Flutter를 통해 App을 실행하면 바로 알람이 오게 작업하였다.
'FireBase' 카테고리의 다른 글
FCM (Firebase Cloud Messaging) (4) FCM Token 요청 (0) | 2024.04.23 |
---|---|
FCM (Firebase Cloud Messaging) (3) API (V1) (0) | 2024.04.23 |
FCM (Firebase Cloud Messaging) (2) Firebase 설정 (0) | 2024.04.23 |
FCM (Firebase Cloud Messaging) (1) 설정단계 (0) | 2024.04.23 |