[IOS] push 를 background 상태일때와 foreground 상태일때 받는 방법
iOS에서 push notification을 받을 때, 앱의 상태에 따라 다르게 처리됩니다. iOS는 크게 세 가지 상태로 앱을 관리합니다.
- 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])
}
// ...
}
- 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()
}
// ...
}
- 앱이 종료된 상태: 앱이 종료된 상태에서도 push notification을 받을 수 있으며, 사용자가 알림을 탭하면 앱이 실행되어 처리될 수 있습니다. 위의 Background 상태에서의 예시 코드에서도 앱이 종료된 상태에서 push notification을 처리할 수 있습니다.
따라서 앱의 상태에 따라서 push notification을 처리하는 방식이 다르며, Foreground 상태에서는 직접 처리해야 하고, Background나 종료된 상태에서는 delegate 메서드를 사용하여 처리하게 됩니다.