2025.05.30 - [◽️ Programming/T I L] - FCM을 활용해 푸시 알림 구현하기 (1/2)
FCM을 활용해 푸시 알림 구현하기 (1/2)
이번 프로젝트에서 맡은 역할 중 FCM을 활용한 알림 서비스 구현 Task가 있어 먼저 자세하게 FCM이 어떤건지.. 어떻게 구현하는건지.. 어떤 방식으로 구성되어있는지 한번 알아보려고 한다! 먼저 FCM
dongdida.tistory.com
Apple Notification이 어떤 방식으로 진행되는지 알아보자
일단 푸시 알림은 기존에 핸드폰을 사용하다보면 특정 이벤트가 발생했을때 이용자에게 이를 알릴 수 있는 형태로 서버에서 클라이언트로 직접 메세지를 전송하는 방식을 말한다! 앱이 실행되지 않아도 실시간으로 알람이 뜰 수 있게 한다는게 특징!
먼저 이 푸시 알림에는 다음과 같은 구성요소가 있다
- 클라이언트(앱) : 알림을 받는 앱
- 푸시 서버(FCM 등) : 알림을 중계해주는 서비스
- 앱 서버 : 푸시를 보낼 시점을 판단하고, 푸시 서버에 메시지를 요청하는 서버
그렇다면 먼저 APNs가 뭔지 알아야한다. APNs란 뭘까!
Apple Push Notification service의 약자로 앱 내 푸시 알람을 보낼 수 있도록 Apple에서 만들어 둔 알림 서비스라고 생각하면 된다!
아까 위에서 잠깐 얘기했던 것 처럼 앱에서 서버가 그냥 메세지를 보내면 되지 않을까 싶지만, 애플 정책 상 서버에서 다이렉트로 앱에 메시지를 보내지 못하게 하고 있고 중간에 APNs를 통해서 해당 메시지를 보낼 수 있도록 구축해놨다.
그래서 아래와 같은 느낌으로 내 앱에 푸시 메세지는 서버에서 보낼때 APNs를 거쳐 앱으로 메시지가 들어오게 되는 형태라는 점!
그렇다면 푸시 알람은 어떤 방식으로 동작하는지 알아보자!
동작 방식에 대해서 설명하기 전에 Device Token이라는 개념에 대해서 먼저 알아야하는데
APNs가 특정 디바이스를 식별하기 위해 발급하는 고유한 식별자! 라는 개념이라고 생각하면 된다.
- APNs는 이 토큰을 사용해서 해당 디바이스로 푸시 알림을 전송
이제 다시 돌아오면 App이 APNs에게 Device Token을 요청하고 해당 토큰을 전달 받으면 받은 토큰을 바탕으로 FCM에 전달한다!
그렇게 되면 서버에서는 이 디바이스 토큰을 바탕으로 APNs에 디바이스 토큰과 전달할 메시지를 보내게 되고 APNs에서는 해당 디바이스 토큰을 가진 디바이스에 서버에서 전달해준 데이터를 전달하게 되는 방식!
이렇게 데이터를 받게 되면 Background 상태일땐 OS에서 처리해서 메세지를 띄우게 되고 Foreground 상태에서는 AppDelegate에 정의해놓은 방식대로 App에 알림이 뜨게 된다!
그럼 간단하게 예제를 통해 플로우를 다시 확인해보자
AppDelegate 내 알림에 대한 권한 요청과 APNs 토큰을 FCM에 연결하도록 해야하고 FCM 토큰을 요청해야한다.
@main
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, MessagingDelegate {
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
FirebaseApp.configure()
// 알림 권한 요청
UNUserNotificationCenter.current().delegate = self
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, _ in
print("알림 권한: \\(granted)")
}
application.registerForRemoteNotifications()
Messaging.messaging().delegate = self
return true
}
// APNs 토큰을 FCM에 연결
func application(_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
Messaging.messaging().apnsToken = deviceToken
}
// FCM 토큰 받기 (서버에 보내야 함)
func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
print("FCM 토큰: \\(fcmToken ?? "")")
}
// 앱이 포그라운드일 때 알림 표시
func userNotificationCenter(_ center: UNUserNotificationCenter,
willPresent notification: UNNotification,
withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
completionHandler([.banner, .sound]) // 알림 띄우기
}
}
이렇게 오늘은 FCM을 활용한 Push Notification에 대해서 알아봤다!!!
바로 테스트 해봐야지
'◽️ Programming > T I L' 카테고리의 다른 글
MVI 아키텍처로 단방향 데이터 흐름 만들기 (1) | 2025.06.17 |
---|---|
FCM을 활용해 푸시 알림 구현하기 (1/2) (0) | 2025.05.30 |
모듈화에 대한 고민, 최적의 구조를 찾아야한다!! (0) | 2025.05.09 |
단방향 데이터 흐름이 왜 좋은데!? (0) | 2025.04.03 |
모듈화 아키텍처를 적용해 재사용성 높히기 (0) | 2025.03.27 |