Develop
FCM 알림 시스템 구현
너드나무
2022. 5. 9. 13:07
반응형
필요사항 정리
- 그룹 푸시 형태의 API 구성 (https://fcm.googleapis.com/fcm/notification 활용)
- FCM Token 테이블 구성
- FCM Token 생성 및 수정 (로그인 등) 시 POST /function/fcm 활용 Token 매칭 저장
- FCM Token 삭제 (로그아웃) 시 DELETE /function/fcm 활용 고객 식별 정보 매칭 삭제
FCM API 정리
# Push Group 생성
# 동일한 notification_key_name 생성 시 400 Error Return
# {"error":"notification_key already exists"}
notification_key = requests.post(
"https://fcm.googleapis.com/fcm/notification",
headers={
"Authorization": f"key={FCM_KEY}",
"Content-Type": "application/json",
"project_id": FCM_PROJECT_ID
},
json={
'operation': 'create',
"notification_key_name":notification_key_name, # 동일 name 생성 불가능
"registration_ids":[ # 1,000개씩 관리 필요
"FCM Token #1",
"FCM Token #N"
]
}
)
# Push Group 조회
notification_key = requests.get(
"https://fcm.googleapis.com/fcm/notification",
headers={
"Authorization": f"key={FCM_KEY}",
"Content-Type": "application/json",
"project_id": FCM_PROJECT_ID
},
params={
"notification_key_name":notification_key_name
}
)
# Push Group Token 추가
notification_key = requests.post(
"https://fcm.googleapis.com/fcm/notification",
headers={
"Authorization": f"key={FCM_KEY}",
"Content-Type": "application/json",
"project_id": FCM_PROJECT_ID
},
json={
'operation': 'add',
"notification_key_name":notification_key_name, # 동일 name 생성 불가능
"notification_key": notification_key,
"registration_ids":[ # 1,000개씩 관리 필요
"FCM Token #1",
"FCM Token #N"
]
}
)
# Push Group Token 삭제
notification_key = requests.post(
"https://fcm.googleapis.com/fcm/notification",
headers={
"Authorization": f"key={FCM_KEY}",
"Content-Type": "application/json",
"project_id": FCM_PROJECT_ID
},
json={
'operation': 'remove',
"notification_key_name":notification_key_name, # 동일 name 생성 불가능
"notification_key": notification_key,
"registration_ids":[ # 1,000개씩 관리 필요
"FCM Token #1",
"FCM Token #N"
]
}
)
# 200 성공 시 notification_key Return
# {
# "notification_key": "APA91bGHXQBB...9QgnYOEURwm0I3lmyqzk2TXQ"
# }
notification_key = json.loads(notification_key.text)['notification_key']
# Push 발송 (단일 발송과 동일)
fcm_request = requests.post(
"https://fcm.googleapis.com/fcm/send",
headers={
"Authorization": f"key={FCM_KEY}",
"Content-Type": "application/json"
},
json={
'to': notification_key,
"priority":"high",
"notification":{
"title":"그룹 푸시 테스트",
"body":"푸시 테스트 내용입니당"
}
}
)
# 200 성공 시, 전체 성공 및 일부 실패
# {
# "success": 2,
# "failure": 0
# }
# {
# "success":1,
# "failure":2, # 일부 실패 발생 시 Token Row 삭제 필요
# "failed_registration_ids":[
# "regId1",
# "regId2"
# ]
# }
구현 시나리오
- FCM Table 구성
- 대상 식별 정보
- FCM Token
- 마지막 저장시간
- 토큰 관리 체계
- 삭제된 토큰 제외처리 필요
- 만료된 토큰 제외처리 필요 (FCM Table 우선 Update 작업)
- 추가된 토큰 add 필요
- Mobile or Admin은 Backend 서버에 메시지 발송 요청을 보냄
- Backend 서버는 인가된 사용자 그룹인지 확인하고 message 구성
- Backend 서버 내부에서는 FCM에 해당 그룹에 속한 모든 기기에게 메세지 발송 요청
- FCM은 Messaging Group의 테이블로부터 Token 리스트 확인
- FCM은 해당 Mobile에 메세지 발송
- 그룹 푸시 이벤트 로직
- 이벤트 발생 API 발생 이후 푸시 이벤트 def notification 호출
- 인자값 : 그룹 id, 그룹 token List, notification Model
- if 그룹 token List > 1000: threading 적용
- notification key로 def send 호출
- error 발생 시 해당 fcm token 삭제 필요
- 이벤트 발생 API 발생 이후 푸시 이벤트 def notification 호출
- Token 삭제 로직
- 개별, 그룹 푸시 발송 시 faliure → token row delete
- 그룹 token 삭제 notification - remove (1)
- token table 삭제 (2)
- 오래된 토큰 기준 : 2달
- 개별, 그룹 푸시 발송 시 faliure → token row delete
- FCM Token DB 저장 시 유의사항
- 식별번호는 다른데 fcm token이 동일할 경우 (한 기기에서 다른 계정 접속 경우)
- 기존에 사용된 fcm token row는 삭제 → 식별번호 여러개 토큰 동일 방지
- 식별번호는 다른데 fcm token이 동일할 경우 (한 기기에서 다른 계정 접속 경우)
728x90
반응형