[IOS] UNNotificationServiceExtension을 사용하여 앱이 포그라운드(Foreground) 또는 백그라운드(Background) 상태일 때 푸시 알림의 메시지를 다르게 표시 하는 방법

UNNotificationServiceExtension을 사용하여 앱이 포그라운드(Foreground) 또는 백그라운드(Background) 상태일 때 푸시 알림의 메시지를 다르게 표시할 수 있습니다. 포그라운드와 백그라운드에서 다르게 처리하는 방법은 다음과 같습니다:

  1. Foreground 상태에서의 처리: 포그라운드 상태에서 푸시 알림이 도착하면 didReceive(_:withContentHandler:) 메서드가 호출됩니다. 이 메서드 안에서 푸시 알림의 내용을 변경하고, 변경된 내용을 사용하여 사용자에게 알림을 표시할 수 있습니다.
    `override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        // 포그라운드에서의 처리 예시: 제목을 변경하고 내용을 그대로 유지
        let modifiedContent = request.content.mutableCopy() as! UNMutableNotificationContent
        modifiedContent.title = "포그라운드 제목"
    
        contentHandler(modifiedContent)
    }` 
  1. Background 상태에서의 처리: 백그라운드 상태에서 푸시 알림을 받을 때에는 사용자에게 직접적으로 표시되지 않습니다. 따라서 푸시 알림의 내용을 변경하거나 추가적인 처리를 하려면 백그라운드에서 수행되어야 하는 작업을 didReceive(_:withContentHandler:) 메서드 안에서 처리하는 것이 아닌, 해당 내용을 기반으로한 백그라운드 작업을 직접 관리해야 합니다.
    `override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        // 푸시 알림 내용을 변경하지 않고, 백그라운드 작업을 시작
        startBackgroundTask {
            // 백그라운드 작업이 완료되면 변경된 내용을 전달
            contentHandler(request.content)
        }
    }
    
    func startBackgroundTask(completion: @escaping () -> Void) {
        // 백그라운드 작업을 시작하고 완료 시 호출될 completion을 설정
        let taskId = UIApplication.shared.beginBackgroundTask {
            // 백그라운드 작업 종료
            UIApplication.shared.endBackgroundTask(taskId)
        }
        
        // 실제 백그라운드 작업 수행
        DispatchQueue.global().async {
            // 백그라운드 작업 처리
            
            // 작업이 완료되었음을 알림
            completion()
            
            // 백그라운드 작업 종료
            UIApplication.shared.endBackgroundTask(taskId)
        }
    }` 

백그라운드 작업을 수행하는 startBackgroundTask(completion:) 메서드를 사용하여 백그라운드에서 실행될 작업을 관리하고, 작업이 완료되면 해당 내용을 푸시 알림에 전달하는 방식으로 백그라운드 상태에서의 작업을 처리할 수 있습니다.