> ## Documentation Index
> Fetch the complete documentation index at: https://cometchat-22654f5b-docs-platform-docs-release.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Remove Delivered Notifications

> Guide to removing delivered push notifications programmatically using Notification Service Extension.

<Accordion title="AI Integration Quick Reference">
  * **Requires:** UNNotificationServiceExtension target in your app
  * **Remove specific:** `UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers:)`
  * **Remove all:** `UNUserNotificationCenter.current().removeAllDeliveredNotifications()`
  * **Use case:** Clear notifications when user reads message in-app
  * **Related:** [Push Notifications](/notifications/push-overview) · [Increment Badge Count](/sdk/ios/increment-app-icon-badge-count)
</Accordion>

This guide helps you remove delivered notifications using **Notification Service Extension**.

For removing notifications you will need to add Notification Service in your project.

***

## UNNotificationServiceExtension

This service grabs the data from the push notification payload, the user can modify its content and display the customized data on to the push notification.

<Warning>
  If you already have Notification Service Extension then you can skip Step1.
</Warning>

***

### **Step 1: Add UNNotificationServiceExtension inside the app.**

1. Click on `File` --> `New` --> `Targets` --> `Application Extension` --> `Notification Service Extension`.

<Frame>
  <img src="https://mintcdn.com/cometchat-22654f5b-docs-platform-docs-release/zO0XA7KaW4No1wkH/images/98aad8b5-1623200467-6f2c5600ed652b7edc4ff060dae821ae.png?fit=max&auto=format&n=zO0XA7KaW4No1wkH&q=85&s=ce37f36c0764527ef7c924a2ff366556" width="729" height="525" data-path="images/98aad8b5-1623200467-6f2c5600ed652b7edc4ff060dae821ae.png" />
</Frame>

2. Add `Product Name` and click on `Finish`.

<Frame>
  <img src="https://mintcdn.com/cometchat-22654f5b-docs-platform-docs-release/Be6Mu14MqhiP8v4-/images/e7cb86a6-1623200471-91f4c42b9c543b4534a2d3751348b758.png?fit=max&auto=format&n=Be6Mu14MqhiP8v4-&q=85&s=f67f02eacb05b68c461141ed1f21c243" width="729" height="527" data-path="images/e7cb86a6-1623200471-91f4c42b9c543b4534a2d3751348b758.png" />
</Frame>

### **Step 2: Add CometChat SDK in your Notification Extension.**

Make sure you are adding the CometChat SDK in your Notification Extension. If you are using pods then your pod file should contain the following:

<Tabs>
  <Tab title="Swift">
    ```ruby theme={null}
    platform :ios, '11.0'
    use_frameworks!

    target 'MyApp' do
      pod 'CometChatSDK', '4.0.67'
    end

    target 'NotificationExtension' do
    	pod 'CometChatSDK', '4.0.67'
    end
    ```
  </Tab>
</Tabs>

### **Step 3: Add Code for removing Notifications.**

Once you have configured the Notification Service, add the below code in `didReceive(_:withContentHandler:)` method under `bestAttemptContent` condition. The below code shows how you can remove the notifications for `call` type messages since we need to show the latest call notification.

<Tabs>
  <Tab title="Swift">
    ```swift theme={null}
    import CometChatSDK

    override func didReceive(_ request: UNNotificationRequest, withContentHandler contentHandler: @escaping (UNNotificationContent) -> Void) {

      self.contentHandler = contentHandler
      bestAttemptContent = (request.content.mutableCopy() as? UNMutableNotificationContent)

      if let bestAttemptContent = bestAttemptContent {
                __ Modify the notification content here...
      var customID : String = ""
      if let userInfo = request.content.userInfo as? [String : Any], let messageObject = userInfo["message"], let str = messageObject as? String, let dict = str.stringTodictionary() {
        if let baseMessage = CometChat.processMessage(dict).0 {
          switch baseMessage.messageCategory {
            case .message: break
            case .action: break
            case .call:
              if let call = baseMessage as? Call {
                customID = call.sessionID!
              }
            case .custom: break
            @unknown default: break
          }
        }
      }

      UNUserNotificationCenter.current().getDeliveredNotifications { notifications in
        var id : String = ""
        let matching = notifications.first(where: { notify in
          if let existingUserInfo = request.content.userInfo as? [String : Any], let messageObject = existingUserInfo["message"], let str = messageObject as? String, let dict = str.stringTodictionary() {
          if let baseMessage = CometChat.processMessage(dict).0 {
            switch baseMessage.messageCategory {
              case .message: break
              case .action: break
              case .call:
                if let call = baseMessage as? Call {
                  id = call.sessionID!
                }

                case .custom: break
                @unknown default: break
                }
             }
           }
           return id == customID
          })

          if let matchExists = matching {
          UNUserNotificationCenter.current().removeDeliveredNotifications(
            withIdentifiers: [matchExists.request.identifier])
          }
      	}
    	}
    }
    ```
  </Tab>
</Tabs>

In the above code, we are removing the previous notification of the call message when the end call or unanswered call notification appears. We are removing the previous call notifications based on the call `sessionID`.

You can change the implementation as per your service. Once you added the code, add the completion handler in the main thread:

<Tabs>
  <Tab title="Swift">
    ```swift theme={null}
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
    	contentHandler(bestAttemptContent)
    }
    ```
  </Tab>
</Tabs>

***

## Next Steps

<CardGroup cols={2}>
  <Card title="Push Notifications" icon="bell" href="/notifications/push-overview">
    Set up push notifications for your iOS app
  </Card>

  <Card title="Increment Badge Count" icon="circle-plus" href="/sdk/ios/increment-app-icon-badge-count">
    Update app icon badge from push notifications
  </Card>

  <Card title="Mark Delivered from Push" icon="check" href="/sdk/ios/marking-delivered-with-push-notification">
    Mark messages as delivered via push notification
  </Card>

  <Card title="Background Updates" icon="mobile-screen" href="/sdk/ios/prepare-your-app-for-background-updates">
    Keep real-time connection alive in background
  </Card>
</CardGroup>
