[IOS] push notification 으로 전달 되는 값 바꾸는 방법, UNNotificationServiceExtension

iOS 앱에서 push로 전달되는 메시지의 내용을 앱에서 변경하려면, 앱에서 push notification의 내용을 수정하는 방법과 서버 측에서 push notification을 보낼 때 커스텀 데이터를 추가하여 앱에서 이를 활용하는 방법 두 가지가 있습니다.

  1. 앱에서 push notification의 내용을 수정하는 방법: iOS에서는 기본적으로 push notification의 내용은 서버에서 생성되고 전달되지만, 앱에서 push notification을 받기 전에 알림을 처리하는 UNUserNotificationCenterDelegate를 사용하여 알림을 수정할 수 있습니다. 이를 통해 받은 push notification의 내용을 변경하거나 특정 조건에 따라 처리를 추가할 수 있습니다.

    예를 들어, Foreground 상태에서 push notification을 받았을 때 아래와 같이 UNUserNotificationCenterDelegate를 구현하여 내용을 수정할 수 있습니다.

import UserNotifications

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    // ...

    // Foreground 상태에서 알림 도착 시 호출되는 메서드
    func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) {
        // push notification의 내용을 변경하고 처리할 작업 수행
        let content = notification.request.content.mutableCopy() as! UNMutableNotificationContent
        content.title = "변경된 제목"
        content.body = "변경된 내용"
        // 변경된 내용으로 새로운 알림을 구성합니다.
        let newNotification = UNNotificationRequest(identifier: notification.request.identifier, content: content, trigger: notification.trigger)
        // 새로운 알림을 발송합니다.
        UNUserNotificationCenter.current().add(newNotification) { (error) in
            // 알림 추가 완료 시의 처리
        }
    }

    // ...
}
  1. 서버 측에서 push notification에 커스텀 데이터 추가하기: 또 다른 방법은 서버에서 push notification을 보낼 때 커스텀 데이터를 추가하는 것입니다. 이렇게 하면 서버에서 push notification의 내용을 자유롭게 구성할 수 있으며, 앱에서는 커스텀 데이터를 읽어와서 원하는 방식으로 처리할 수 있습니다.

    예를 들어, 서버에서 JSON 형식의 커스텀 데이터를 추가하여 아래와 같이 push notification을 전송할 수 있습니다.


{
  "aps": {
    "alert": {
      "title": "Notification Title",
      "body": "Notification Body"
    },
    "sound": "default"
  },
  "custom_data_key": "Custom Data Value"
}

앱에서는 UNUserNotificationCenterDelegate를 통해 받은 push notification의 커스텀 데이터를 읽어올 수 있습니다.

import UserNotifications

class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate {

    // ...

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

        // 커스텀 데이터 읽어오기
        if let customData = userInfo["custom_data_key"] as? String {
            // 커스텀 데이터를 이용한 작업 수행
            print("받은 커스텀 데이터: \(customData)")
        }

        completionHandler()
    }

    // ...
}

서버에서 push notification에 커스텀 데이터를 추가하는 방법을 사용하면, 앱에서는 push notification을 받을 때 커스텀 데이터를 활용하여 원하는 작업을 수행할 수 있습니다.

UNNotificationServiceExtension를 사용하면, iOS에서 수신한 원격 알림의 내용을 변경하거나 추가 작업을 수행할 수 있습니다. UNNotificationServiceExtension은 기존의 원격 알림을 수정하여 처리하며, 이를 통해 푸시 알림에 추가 정보를 추가하거나 레이아웃을 변경할 수 있습니다.

아래는 UNNotificationServiceExtension를 사용하여 푸시 알림의 내용을 변경하는 간단한 예제입니다.

  1. Xcode에서 새로운 “Notification Service Extension” 타겟을 추가합니다.
  2. 생성된 NotificationService 클래스를 열고, didReceive(_:withContentHandler:) 메서드를 구현합니다.
import UserNotifications

class NotificationService: UNNotificationServiceExtension {
    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
        // 원본 알림의 내용
        let content = request.content.mutableCopy() as! UNMutableNotificationContent

        // 알림 내용 변경
        content.title = "새로운 알림 제목"
        content.body = "새로운 알림 내용"

        // 추가 작업 수행
        // ...

        // 변경된 내용으로 알림을 업데이트합니다.
        contentHandler(content)
    }

    override func serviceExtensionTimeWillExpire() {
        // 서비스의 제한 시간이 다 된 경우 호출됩니다.
        // 이 시점까지 변경된 내용으로 알림을 업데이트해야 합니다.
        super.serviceExtensionTimeWillExpire()
    }
}

위의 예제에서는 didReceive(_:withContentHandler:) 메서드를 구현하여 원본 알림의 내용을 변경하고 추가 작업을 수행한 뒤, 변경된 내용으로 알림을 업데이트하고 있습니다. 추가적으로 serviceExtensionTimeWillExpire() 메서드를 사용하여 서비스의 제한 시간이 다 된 경우에 대비하여 변경된 내용으로 알림을 업데이트할 수도 있습니다.

이렇게 UNNotificationServiceExtension을 사용하면 원격 알림의 내용을 변경하거나 추가 작업을 수행할 수 있으며, 수정된 내용으로 알림이 사용자에게 표시됩니다.