SwiftUI

[SwiftUI] Remote Notification (2) FCM 서비스 사용하여 원격 알림 구현

하이D:) 2023. 8. 22. 16:12

이전에 작성했던 원격 알림에 대한 글을 바탕으로 FCM 서비스를 통해 원하는 알림을 기기로 전달하는 과정을 구현해보고자 한다. Local Notification 과 Remote Notification의 기본 동작 방식과 개념에 대해서는 이전 블로그 글을 읽어보는 것을 추천한다.

 

알림 관련 이전 글

[SwiftUI] Local Notification 앱의 로컬알림 기능 구현

[SwiftUI] Notification | 알림설정확인 getNotificationSettings Provisional Authorization

[SwiftUI] Remote Notification 원격 알림 (1)

 

 

#🥨 왜 FCM 을 사용하는가?

앱에서 알림 기능을 구현할 때 FCM을 사용하는 이유는 다음과 같다.

 

1. 크로스 플랫폼 메시징 솔루션

푸시 알림을 보내기 위해서 iOS, Android 플랫폼 별로 개별해야하는 불편함이 있었다면, FCM 교차 플랫폼 메시지 솔루션이기 때문에 FCM 을 사용하면 플랫폼에 종속되지 않고 푸시 알림을 전송할 있다.

2. 다양한 알림 형태 

FCM 단순한 푸시 알림뿐만 아니라 데이터 메시지와 알림 메시지 다양한 메시지 유형을 지원한다.

3. 쉬운 알림 설정과 관리

FCM은 Firebase Console을 통해 더 쉽게 알림을 설정하고 관리할 수 있다.

4. 다양한 타깃팅 옵션

FCM은 앱 사용자 그룹을 다양한 방식으로 타깃팅할 수 있는 기능을 제공한다. 특정 사용자 그룹에게만 알림을 보낼 수 있으므로 더 많은 커스터마이징 된 알림 전송이 가능하다.

5. 통계와 분석 제공

FCM 알림의 전송 사용자의 반응에 대한 통계와 분석 기능을 제공하며, 이를 통해 알림 전송의 성공률을 모니터링하고 사용자의 행동에 대한 인사이트를 얻을 수 있다.

 

 

#🥨 FCM 의 동작 원리

iOS앱에서 FCM 서비스를 활용하여 원격 알림을 구현하는 경우 FCM 이 Provider 역할을 하게 되어 iOS 앱에 대한 푸시 알림을 처리하고 APNs과 통신하여 iOS 기기로 알림을 전송한다.

다음과 같은 흐름으로 원격 알림이 전송되게 된다.

 

1. 개발자는 FCM을 설정하고 iOS 앱에 Firebase SDK를 설치, 통합

2. 개발자는 Firebase Console을 통해 원격 알림 메시지를 작성하고 타깃팅설정을 구성

3. FCM 서버는 이 알림 메시지를 받아서 처리하고 해당 메시지를 APNs로 전달하여 FCM SDK를 통해 iOS 기기로 푸시 메시지를 전송

4. iOS앱은 Firebase SDK를 통해 FCM 메시지를 처리할 준비, FCM SDK는 받은 푸시 메시지를 iOS 기기에 전달하고 iOS 기기는 알림을 화면에 표시하거나 사용자에게 알림을 제공

 

 

#🥨 구현 과정

Firebase 사용하기 위해 세팅해야 하는 것들은 아래 링크에서 쉽게 진행할 수 있다. 나는 이전 블로그 글에서 원격 알림 관련하여 구현해 놓은 코드를 기반으로 진행할 것이기 때문에 remote notification에 잘 모르겠다면 이전 글을 읽고 오는 것을 추천한다.

Push Notifications Part 1

Push Notifications Part 2

Push Notifications Part 3

 

1. 패키지 설치 (https://github.com/firebase/firebase-ios-sdk.git)

설치할 때 FirebaseMessaging와 FirebaseAnalytics 항목이 선택되도록 한다.

 

 

2. APNs 인증키 생성

앱 사용자에게 알림을 보내려면 APNs Authentication key를 생성해야 한다. 애플 디벨로퍼 페이지에서 account > Certificates, Identifiers & Profiles > Keys 에서 새로운 키를 만든다. 기존에 만들어놓은 APNs key 가 있다면 그 키를 사용하면 된다.

3. 파이어베이스에 프로젝트&앱 추가

파이어베이스에 프로젝트 생성해부고 알림이 필요한 앱을 추가시킨다. 앱을 Firebase에 추가하는 과정에서 .plist 구성 파일을 프로젝트에 추가시켜 주는 등 간단한 작업을 해준다. 

 

 

4. 초기화 코드 및 필요한 코드 추가

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {

    FirebaseApp.configure()

    Messaging.messaging().delegate = self
    
    ...
    
    return true
}
extension AppDelegate: MessagingDelegate {
    //토큰의 갱신을 모니터링한다.일반적으로 앱 시작 시 등록 토큰을 사용하여 이 메서드를 한 번 호출
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {

      let deviceToken:[String: String] = ["token": fcmToken ?? ""]
        print("Device token: ", deviceToken) // This token can be used for testing notifications on FCM
    }
}

 

5. Firebase 프로젝트에서 인증키 추가 

프로젝트 설정으로 들어가서 인증키를 추가시켜준다. 인증서 혹은 인증키의 파일과 정보를 입력하면되는데 우리는 이전에 만들어준(2번과정) 인증키 .p8파일을 사용해줄 것이기 때문에 인증키에 대한 정보를 등록해주면된다.

 

#🥨 테스트 알림 보내기

이런 과정을 거치고 프로젝트를 기기에서 실행시켜 주면 터미널에 디바이스 토큰이 찍힌다. 이 토큰을 사용해서 FCM 에서 메시지 보내기 테스트를 해볼 수 있다.

 

 

 

#🥨 여러 기기에 알림 보내기

메시지 보내기 테스트 해보는 과정까지는 터미널에 찍힌 토큰을 직접 복사 붙여 넣기 해주기 때문에 APN 토큰을 FCM 토큰으로 맵핑해줄 필요가 없는데 실제 프로젝트에서 사용하는 것 처럼 여러 기기로 알림을 보내기 위해서는 APN에서 부여받은 디바이스 토큰을 FCM 토큰으로 맵핑해주어야한다.

UIApplication 싱글톤의 registerForRemoteNotifications 메서드 통해 APNs 디바이스 등록을 성공했을 실행되는 application(_:didRegisterForRemoteNotificationsWithDeviceToken:)메서드에서 해당 코드를 추가해주어야 한다.

    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
	
    ...
        Messaging.messaging().apnsToken = deviceToken
        
    }

 

위의 코드를 추가해 준 뒤 테스트 알림을 생성했던 것처럼 캠페인생성에서 알림에 대한 정보를 적고, [검토]를 눌러주면 캠페인이 생성되고 알림이 전송되게 된다. (상황에 따라 설정한 시간에서 3분 이상 걸리는 경우도 있었다.) 알림이 전송되고 FCM Console에서 해당 캠페인을 확인해 보면 기기에 전송완료 되었다는 것을 확인할 수 있다.