[SwiftUI] Firebase의 CloudMessage 이용하기

Charlie·2022년 6월 14일
1

SwiftUI

목록 보기
2/4

프로젝트 중 프론트를 잠시 접어두고 백을 지원하기로 했다. Firebase를 이용하고 있는데 나는 알림 관련한 기능 구현을 맡았다.

원리



구현

Firebase

프로젝트 생성 및 앱 추가

Firebase에서 프로젝트를 만들고 앱을 추가하자. 공식 홈페이지에서 시키는 대로 진행하면 된다.
주의할 점은 GoogleService-Info 파일의 이름에 주의하자.

FCM과 APN 연결

프로젝트 설정 → 클라우드 메시징 으로 이동하여 Apple Developer에서 발급 받은 키 파일을 추가하고 키 ID, 팀 ID를 입력하여 FCM과 APN을 연결할 수 있다.

테스트 메시지 보내기

참여 → Messaging 에서 메시지를 보낼 수 있다. 알림의 제목, 내용을 적고 "테스트 메시지 전송" 버튼을 누르면 "FCM 등록 토큰 추가" 란에 콘솔창에 출력되는 토큰을 복사한 후 붙여 넣어 메시지를 전송할 수 있다.

Apple Developer

Apple Developer에서 로그인 후 Account를 클릭하고 Certificates, Identifiers & Profiles 로 이동하자.

키 발급

기존에 사용하던 p12 방식말고 p8 방식을 사용하자. p8 방식은 하나의 키로 모든 앱에 대하여 사용할 수 있으므로 한번만 발급 받으면 된다. 발급을 받고 다운로드 받을 수 있는 파일을 삭제하지 않게 주의하자. 발급 후 Key ID도 여기서 확인 가능하다.

Identifiers 추가

Identifiers 탭에서 + 버튼을 눌러 앱을 추가할 수 있다. 차례로 App IDs, App을 선택하고 Description 및 Bundle ID를 기입하자. 그리고 스크롤을 내려 "Push Notifications"를 체크해주자.

Xcode

SPM을 이용하여 패키지 추가

앱 추가를 하며 받은 URL을 이용하여 패키지를 추가해준다. Notification과 관련한 패키지는 Firebase Messaging이다.

Capabilities 추가

Project → Targets → Siging & Capabilites 에서 + 버튼을 눌러 "Push Notifications"를 추가하자.

AppDelegate 추가

앱 파일을 아래 코드와 같이 수정하면 된다.

import SwiftUI
import Firebase
import FirebaseMessaging


@main
struct TestApp: App {
    
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}


class AppDelegate: NSObject, UIApplicationDelegate {
    
    // 앱이 켜졌을때
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        
        // Use Firebase library to configure APIs
        // 파이어베이스 설정
        FirebaseApp.configure()
        
        // 원격 알림 등록
        if #available(iOS 10.0, *) {
            // For iOS 10 display notification (sent via APNS)
            UNUserNotificationCenter.current().delegate = self
            
            let authOptions: UNAuthorizationOptions = [.alert, .badge, .sound]
            UNUserNotificationCenter.current().requestAuthorization(
                options: authOptions,
                completionHandler: { _, _ in }
            )
        } else {
            let settings: UIUserNotificationSettings =
            UIUserNotificationSettings(types: [.alert, .badge, .sound], categories: nil)
            application.registerUserNotificationSettings(settings)
        }
        
        application.registerForRemoteNotifications()
        
        // 메세징 델리겟
        Messaging.messaging().delegate = self
        
        
        // 푸시 포그라운드 설정
        UNUserNotificationCenter.current().delegate = self
        
        return true
    }
    
    // fcm 토큰이 등록 되었을 때
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        Messaging.messaging().apnsToken = deviceToken
    }
    
}

extension AppDelegate : MessagingDelegate {
    
    // fcm 등록 토큰을 받았을 때
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String?) {
        print("AppDelegate - 파베 토큰을 받았다.")
        print("AppDelegate - Firebase registration token: \(String(describing: fcmToken))")
    }
}

extension AppDelegate : UNUserNotificationCenterDelegate {
    
    // 푸시메세지가 앱이 켜져 있을때 나올때
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        
        let userInfo = notification.request.content.userInfo
        
        print("willPresent: userInfo: ", userInfo)
        
        completionHandler([.banner, .sound, .badge])
    }
    
    // 푸시메세지를 받았을 때
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        let userInfo = response.notification.request.content.userInfo
        print("didReceive: userInfo: ", userInfo)
        completionHandler()
    }
    
}


Reference

Firebase 클라우드 메시징 공식 문서
취준생을 위한 스위프트UI 앱만들기 FCM 푸시 운영/개발 SwiftUI 3.0 fundamental Tutorial (2021) ios fcm push notification

profile
Hello

0개의 댓글