😁 작성자: 황서경
🍞 작성자의 한마디: 푸시알림 재밌다
레코드림 팀이 구현해야 하는 푸시알림은 "사용자가 설정한 시간"에 푸시알림을 보내는 것이었습니다.
그래서 무조건 스케줄러를 사용해야 했고, node-schedule과 agenda 중 어떤 스케줄러를 사용할 지에 대해 고민했습니다.
agenda는 서버가 중단되어도 예약된 작업을 수행할 수 있기에 성능 면에서 더 좋은 스케줄러였지만,
제한된 앱잼 시간 내에 구현해야했기 때문에 상대적으로 레퍼런스가 더 많이 나오는 node-shedule로 구현하였고, 릴리즈 시에 agenda를 쓰기로 결정했습니다.
사용 기술: fcm + agenda
2. 프로젝트 설정 -> 서비스 계정 으로 들어가서 "새 비공개 키 생성"을 클릭하여 비공개 키를 다운받습니다.
3. 이제 이 등록된 프로젝트 안에 안드로이드, iOS 앱을 등록해야 합니다. 저희는 안드로이드, iOS 앱 모두에 푸시알림이 도착해야 하기 때문이에요!
만약 아이폰에만 알림이 오게 하고 싶다면, 클라 쪽에서 iOS 앱만 등록하시면 됩니다.
~ 2개의 앱이 등록된 화면입니다 ~
4. 개발하시고 있는 폴더 안에 다운받은 비공개 키 파일 (.json) 파일을 넣어줍니다.
레코드림은 config 폴더 안에 넣어주었습니다. 중요한 점은 해당 파일은 꼭 .gitignore에 추가해서 github에 올라가지 않도록 해야하는 것입니다.
5. mongoDB와 firebase를 연결해줍니다.
6. FCM 메시지를 설정하는 기본 코드는 아래와 같습니다.
푸시알림을 보낼 때의 title과 body는 따로 파일을 만들어서 불러왔습니다.
7. 푸시알림을 보내는 기본 코드는 다음과 같습니다.
지금까지의 코드로만 돌리면 실시간 푸시알림 전송만 가능합니다.
그러나, 레코드림에서는 "사용자가 설정한 시간"에 맞추어서 푸시알림을 보내야 하기 때문에 node-shedule을 사용해보겠습니다.
8. 먼저 node-shedule을 설치해 줍니다.
npm install node-schedule
또한, 레코드림에서는 푸시알림을 보내는 시간을 반드시 string 타입으로 보내야 했기 때문에 시간 string 타입을 int로 바꾸는 과정이 필요했습니다.
string으로 받은 시간을 Date로 바꾸는 코드는 아래와 같습니다.
동일한 FCM 토큰을 가지는 기기가 하나이기 때문에 device[0].time 을 사용할 수 있었습니다.
또한 시간으로 들어오는 형식이 "AM 09:23"과 같은 형식이였기 때문에 공백과 ":"를 기준으로 string을 잘라주었습니다.
node-schedule은 24시간제 이지만 (0~23), 레코드림에서 시간을 설정하는 부분은 12시간제로 사용하기 때문에 이것들은 계산하여 처리해주었습니다
12시 47분에 푸시알림이 도착한 모습입니다.
지금까지 FCM과 node-schedule을 사용하여 "사용자가 설정한 시간"에 푸시알림을 보내는 방법에 대해 알아봤습니다.
감사합니다 :)
안녕하세요 포스트 잘 봤습니다. 헌데 궁금한 점이 만약 사용자가 해당 알림 전송을 설정해 두고, 시간을 변경하거나 알람을 취소하려면 어떻게 해야할까요??