[IOS] push 를 background 상태일때와 foreground 상태일때 받는 방법

iOS에서 push notification을 받을 때, 앱의 상태에 따라 다르게 처리됩니다. iOS는 크게 세 가지 상태로 앱을 관리합니다.

  1. Foreground 상태: 앱이 현재 화면에 표시되고 있을 때를 말합니다. 사용자가 앱을 직접 사용 중이거나 앱 내에서 액티브한 상태입니다. 이 상태에서 push notification이 도착하면, 알림이 자동으로 표시되지 않습니다. 대신, 앱 내에서 직접 push notification을 처리할 수 있습니다. UNUserNotificationCenter를 사용하여 notification을 받아 처리할 수 있습니다.
import UserNotifications

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // UserNotificationCenter의 delegate를 설정하여 Foreground 상태에서도 알림을 처리할 수 있도록 합니다.
        UNUserNotificationCenter.current().delegate = self
        return true
    }

    // Foreground 상태에서 알림 도착 시 호출되는 메서드
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        // 알림을 받았을 때 처리를 원하는 대로 구현합니다.
        // completionHandler()를 호출하여 알림 배너를 표시할지 여부를 지정할 수 있습니다.
        completionHandler([.banner, .sound, .badge])
    }

    // ...
}
  1. Background 상태: 앱이 백그라운드에서 실행 중일 때를 말합니다. 사용자가 앱을 완전히 종료한 상태거나 다른 앱을 사용하고 있는 상태입니다. Background 상태에서 push notification이 도착하면, 시스템은 notification을 처리하고, 알림을 보여줄 수 있습니다. 이때 앱은 didReceiveRemoteNotification 또는 userNotificationCenter(_:didReceive:withCompletionHandler:) 메서드가 호출됩니다.
import UserNotifications

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // UserNotificationCenter의 delegate를 설정하여 Background 상태에서도 알림을 처리할 수 있도록 합니다.
        UNUserNotificationCenter.current().delegate = self

        // 앱이 처음 실행될 때 push notification 정보를 확인합니다.
        if let notification = launchOptions?[.remoteNotification] as? [String: AnyObject] {
            handleNotification(notification)
        }
        return true
    }

    // Background 상태에서 알림 도착 시 호출되는 메서드
    func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) {
        let userInfo = response.notification.request.content.userInfo
        handleNotification(userInfo)
        completionHandler()
    }

    // ...
}
  1. 앱이 종료된 상태: 앱이 종료된 상태에서도 push notification을 받을 수 있으며, 사용자가 알림을 탭하면 앱이 실행되어 처리될 수 있습니다. 위의 Background 상태에서의 예시 코드에서도 앱이 종료된 상태에서 push notification을 처리할 수 있습니다.

따라서 앱의 상태에 따라서 push notification을 처리하는 방식이 다르며, Foreground 상태에서는 직접 처리해야 하고, Background나 종료된 상태에서는 delegate 메서드를 사용하여 처리하게 됩니다.