UNNotificationServiceExtension


n/a.結論
**ターゲットとしてUNNotificationServiceExtensionを追加し、**didReceive(:withContentHandler:)内でプッシュアプリケーションをカスタマイズできます.

UNNotificationServiceExtension


An object that modifies the content of a remote notification before it’s delivered to the user.
→ユーザーに送信する前に、リモート通知の内容を変更するオブジェクトを支援します.
  • このオブジェクトは、ユーザーに送信する前にコンテンツを変更するのに役立ちます.
  • は、オブジェクト自体のUIを表示または表示しない.ただし、特定のタイプの通知をユーザー・デバイスに送信すると、対応する操作が行われます.
  • は、暗号化されたデータがある場合、データを復号したり、通知に関連する画像をダウンロードしたりするのに役立ちます.
  • このオブジェクトを作成または使用する必要はありません.Xcodeテンプレートにターゲットを追加するように実施します.
  • をカスタマイズする場合は、didReceive(_:witContentHandler)メソッドで実装できます.
  • didReceive(_:withContentHandler:)


  • このメソッドを使用する条件)
  • アプリケーションは、リモート通知を受信するように構成されている必要があります.
  • は、メソッドを呼び出すためにmutable-contentの値を1に設定するように要求することを通知する.

  • このメソッドを使用すると、通知を変更できますが、タスクを実行する時間は限られています.

  • 限られた時間内に完了できない場合、システムはserviceExtensionTimeWillExpire()メソッドを呼び出す.

  • 上記の方法は、変更したいコンテンツを最後に処理する機会です.

  • 限られた時間内に未処理のコンテンツを処理したくない場合は、コンテンツを表示するだけです.(カスタマイズされていないコンテンツのみが表示されることを示します)
  • インプリメンテーション


  • XcodeにNotificationServiceExtensionを追加する
  • https://developer.apple.com/documentation/usernotifications/modifying_content_in_newly_delivered_notifications
  • https://rhammer.tistory.com/270
  • NotificationServiceExtension Targetを追加し、FCMを使用する場合は、Frameworks and LibrariesにFirebase Messageが追加されていることを確認します.


  • カスタム名からなるUNNotificationServiceExtensionのオブジェクトにコードを記述します.
    (以下のコードはFirebase FCMに基づく)
    import UserNotifications
    import FirebaseMessaging
    
    class NotificationService: UNNotificationServiceExtension {
    
        var contentHandler: ((UNNotificationContent) -> Void)?
        var bestAttemptContent: UNMutableNotificationContent?
    
        override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {
            self.contentHandler = contentHandler
            bestAttemptContent = request.content.mutableCopy() as? UNMutableNotificationContent
            guard let bestAttemptContent = bestAttemptContent else { return }
    
    				/* title과 body 커스텀 */
            bestAttemptContent.title = "[Modified]" + bestAttemptContent.title
            bestAttemptContent.body = "[Modified]" + bestAttemptContent.body
    
            FIRMessagingExtensionHelper().populateNotificationContent(
                bestAttemptContent,
                withContentHandler: contentHandler)
        }
    
        
        override func serviceExtensionTimeWillExpire() {
            // Called just before the extension will be terminated by the system.
            // Use this as an opportunity to deliver your "best attempt" at modified content, otherwise the original push payload will be used.
            if let contentHandler = contentHandler, let bestAttemptContent =  bestAttemptContent {
                contentHandler(bestAttemptContent)
            }
        }
    }