[글 작성 중] Firebase 클라우드 메시지 시작하기

Firebase에서 제공하는 푸쉬를 적용해보자.
Pod을 사용할 것이며, 해당 가이드 링크는 참고링크(하단)에 적어놓았다.
https://firebase.google.com/docs/cloud-messaging/ios/client?authuser=0

Firebase에서 프로젝트를 설정하고, 푸쉬를 사용하기 위한 방법입니다.
프로젝트 설정등은 firebase 가이드를 따라 하는 방식을 권장합니다.
따라서 firebase를 XCode에 적용하고, 푸쉬가 오는것까지 확인하는 것을 목표로 작성된 문서입니다.

다음과 같이 Pod을 설정하고 설치한다.
Pod 설정은 가이드 문서를 참고하여 각자의 환경에 맞추어 설정한다.

# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'


target 'SampleRxSwift' do
  # Comment the next line if you don't want to use dynamic frameworks
  use_frameworks!


  # Pods for SampleRxSwift
  #pod 'RxSwift', '6.0.0-rc.1'
  #pod 'RxCocoa', '6.0.0-rc.1'
  # Add the Firebase pod for Google Analytics
  pod 'Firebase/Analytics'
  # Add the pod for Firebase Cloud Messaging
  pod 'Firebase/Messaging'




  target 'SampleRxSwiftTests' do
    inherit! :search_paths
    # Pods for testing


    # Add the Firebase pod for Google Analytics
    pod 'Firebase/Analytics'
    # Add the pod for Firebase Cloud Messaging
    pod 'Firebase/Messaging'


  end


  target 'SampleRxSwiftUITests' do
    # Pods for testing
    # Add the Firebase pod for Google Analytics
    pod 'Firebase/Analytics'
    # Add the pod for Firebase Cloud Messaging
    pod 'Firebase/Messaging'


  end


end

Pod 설치 및 사용법은 아래 링크를 참고. 또는 가이드 문서를 참고
http://magpiebros.com/wordpress/category/dev-story/ios-개발-이야기/cocoapods/

앱 실행부, AppDelegate 정당한 위치에 아래와 같은 같은 코드를 삽입한다.

class AppDelegate: UIResponder, UIApplicationDelegate, MessagingDelegate {
    
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        print("[AppDelegate] didFinishLaunchingWithOptions")
        FirebaseApp.configure()
        firebaseRegisterForRemoteNotifications(application)


        // 메시지 대리자 설정
        Messaging.messaging().delegate = self
        
        return true
    }

FCM관련 추가

// MARK:- FCM
extension AppDelegate {
    func getFCMToken() {
        print("[AppDelegate] getFCMToken")

        Messaging.messaging().token { token, error in
            if let error = error {
                print("Error fetching FCM registration token: \(error)")
            } else if let token = token {
                print("FCM registration token: \(token)")
                //            self.fcmRegTokenMessage.text  = "Remote FCM registration token: \(token)"
            }
        }
    }
    
    func messaging(_ messaging: Messaging, didReceiveRegistrationToken fcmToken: String) {
        print("[AppDelegate] 파이어베이스 토큰: \(fcmToken)")
    }
    
    func firebaseRegisterForRemoteNotifications(_ application: UIApplication) {
        print("[AppDelegate] firebaseRegisterForRemoteNotifications")
        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()
    }
}

APNS 설정

// MARK:- APNS
extension AppDelegate {
    func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
        print("[AppDelegate] 토큰 받음", deviceToken.description)
        Messaging.messaging().apnsToken = deviceToken
    }
    
    
    // 호출되지 않음. iOS 10 미만?
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any]) {
        print("[AppDelegate] didReceiveRemoteNotification - 알람 옴")
        // If you are receiving a notification message while your app is in the background,
        // this callback will not be fired till the user taps on the notification launching the application.
        // TODO: Handle data of notification
        
        // With swizzling disabled you must let Messaging know about the message, for Analytics
        // Messaging.messaging().appDidReceiveMessage(userInfo)
        
        // Print message ID.
        //      if let messageID = userInfo[gcmMessageIDKey] {
        //        print("Message ID: \(messageID)")
        //      }
        
        // Print full message.
        print(userInfo)
    }
    
    // 호출되지 않음. iOS 10 미만?
    func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                     fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
        print("[AppDelegate] didReceiveRemoteNotification - fetchCompletionHandler - 알람 옴")
        // If you are receiving a notification message while your app is in the background,
        // this callback will not be fired till the user taps on the notification launching the application.
        // TODO: Handle data of notification
        
        // With swizzling disabled you must let Messaging know about the message, for Analytics
        // Messaging.messaging().appDidReceiveMessage(userInfo)
        
        // Print message ID.
        //      if let messageID = userInfo[gcmMessageIDKey] {
        //        print("Message ID: \(messageID)")
        //      }
        
        // Print full message.
        print(userInfo)
        
        completionHandler(UIBackgroundFetchResult.newData)
    }
}


//
@available(iOS 10, *) 
extension AppDelegate : UNUserNotificationCenterDelegate {
    
    // Receive displayed notifications for iOS 10 devices.
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                willPresent notification: UNNotification,
                                withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        print("[AppDelegate] UNUserNotificationCenterDelegate")

        let userInfo = notification.request.content.userInfo
        
        // With swizzling disabled you must let Messaging know about the message, for Analytics
        // Messaging.messaging().appDidReceiveMessage(userInfo)
        
        // Print message ID.
        //    if let messageID = userInfo[gcmMessageIDKey] {
        //      print("Message ID: \(messageID)")
        //    }
        
        // Print full message.
        print(userInfo)
        
        // Change this to your preferred presentation option
        completionHandler([[.alert, .sound]])
    }
    
    func userNotificationCenter(_ center: UNUserNotificationCenter,
                                didReceive response: UNNotificationResponse,
                                withCompletionHandler completionHandler: @escaping () -> Void) {
        print("[AppDelegate] UNUserNotificationCenterDelegate")

        let userInfo = response.notification.request.content.userInfo
        // Print message ID.
        //    if let messageID = userInfo[gcmMessageIDKey] {
        //      print("Message ID: \(messageID)")
        //    }
        
        // With swizzling disabled you must let Messaging know about the message, for Analytics
        // Messaging.messaging().appDidReceiveMessage(userInfo)
        
        // Print full message.
        print(userInfo)
        
        completionHandler()
    }
}

이렇게 코드만 적어놓는것은 역시 도움이 되지 않는 글을 작성해 놓은것 같아 씁쓸한 마음이 남는다. 이것보다 좀더 도움도 되고 발전도 할 수 있는 글을 작성할 수 있도록 고민해보아야 겠다.

  • 참고 링크
  • https://firebase.google.com/docs/cloud-messaging/ios/client?authuser=0

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다