프로젝트 중 프론트를 잠시 접어두고 백을 지원하기로 했다. Firebase를 이용하고 있는데 나는 알림 관련한 기능 구현을 맡았다.
Firebase에서 프로젝트를 만들고 앱을 추가하자. 공식 홈페이지에서 시키는 대로 진행하면 된다.
주의할 점은 GoogleService-Info 파일의 이름에 주의하자.
프로젝트 설정 → 클라우드 메시징 으로 이동하여 Apple Developer에서 발급 받은 키 파일을 추가하고 키 ID, 팀 ID를 입력하여 FCM과 APN을 연결할 수 있다.
참여 → Messaging 에서 메시지를 보낼 수 있다. 알림의 제목, 내용을 적고 "테스트 메시지 전송" 버튼을 누르면 "FCM 등록 토큰 추가" 란에 콘솔창에 출력되는 토큰을 복사한 후 붙여 넣어 메시지를 전송할 수 있다.
Apple Developer에서 로그인 후 Account를 클릭하고 Certificates, Identifiers & Profiles 로 이동하자.
기존에 사용하던 p12 방식말고 p8 방식을 사용하자. p8 방식은 하나의 키로 모든 앱에 대하여 사용할 수 있으므로 한번만 발급 받으면 된다. 발급을 받고 다운로드 받을 수 있는 파일을 삭제하지 않게 주의하자. 발급 후 Key ID도 여기서 확인 가능하다.
Identifiers 탭에서 + 버튼을 눌러 앱을 추가할 수 있다. 차례로 App IDs, App을 선택하고 Description 및 Bundle ID를 기입하자. 그리고 스크롤을 내려 "Push Notifications"를 체크해주자.
앱 추가를 하며 받은 URL을 이용하여 패키지를 추가해준다. Notification과 관련한 패키지는 Firebase Messaging이다.
Project → Targets → Siging & Capabilites 에서 + 버튼을 눌러 "Push Notifications"를 추가하자.
앱 파일을 아래 코드와 같이 수정하면 된다.
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()
}
}
Firebase 클라우드 메시징 공식 문서
취준생을 위한 스위프트UI 앱만들기 FCM 푸시 운영/개발 SwiftUI 3.0 fundamental Tutorial (2021) ios fcm push notification