diff --git a/Sources/EQNNotificationService/EQNNotificationService-Bridging-Header.h b/Sources/EQNNotificationService/EQNNotificationService-Bridging-Header.h index 1b2cb5d..d0986b4 100644 --- a/Sources/EQNNotificationService/EQNNotificationService-Bridging-Header.h +++ b/Sources/EQNNotificationService/EQNNotificationService-Bridging-Header.h @@ -2,3 +2,4 @@ // Use this file to import your target's public headers that you would like to expose to Swift. // +#import "NotificationService.h" diff --git a/Sources/EQNNotificationService/NotificationService+Extension.swift b/Sources/EQNNotificationService/NotificationService+Extension.swift new file mode 100644 index 0000000..7aab983 --- /dev/null +++ b/Sources/EQNNotificationService/NotificationService+Extension.swift @@ -0,0 +1,42 @@ +// +// NotificationService+Extension.swift +// EQNNotificationService +// +// Created by Andrea Busi on 28/05/22. +// Copyright © 2022 Earthquake Network. All rights reserved. +// + +import Foundation +import UserNotifications + + +extension NotificationService { + + @objc(removeNotificationsForType:completion:) + func removeNotifications( + for type: String?, + completion: @escaping() -> Void + ) { + guard let type = type else { + completion() + return + } + + let notificationCenter = UNUserNotificationCenter.current() + + notificationCenter.getDeliveredNotifications { notifications in + let sameTypeNotifications = notifications.filter { notification in + let payload = notification.request.content.userInfo + if let notificationType = payload["type"] as? String { + return notificationType == type + } + return false + } + + let identifiers = sameTypeNotifications.map { $0.request.identifier } + notificationCenter.removeDeliveredNotifications(withIdentifiers: identifiers) + + completion() + } + } +} diff --git a/Sources/EQNNotificationService/NotificationService.m b/Sources/EQNNotificationService/NotificationService.m index a8f021f..ba402e7 100644 --- a/Sources/EQNNotificationService/NotificationService.m +++ b/Sources/EQNNotificationService/NotificationService.m @@ -9,6 +9,8 @@ #import "NotificationService.h" #import "EQNAllertaSismica.h" #import "Costanti.h" +#import "EQNNotificationService-Swift.h" + @interface NotificationService () @@ -158,7 +160,10 @@ static NSString * const EQNSoundNotificationEQN = @"alert_sound.wav"; } } - [self contentComplete]; + // remove same type posted notification + [self removeNotificationsForType:notificationType completion:^{ + [self contentComplete]; + }];; } - (void)serviceExtensionTimeWillExpire diff --git a/Sources/Earthquake Network.xcodeproj/project.pbxproj b/Sources/Earthquake Network.xcodeproj/project.pbxproj index 37ed6a9..2fe6499 100644 --- a/Sources/Earthquake Network.xcodeproj/project.pbxproj +++ b/Sources/Earthquake Network.xcodeproj/project.pbxproj @@ -11,6 +11,7 @@ 651901B925F5358700CAFF20 /* EQNMapAnnotationSeismic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651901B825F5358700CAFF20 /* EQNMapAnnotationSeismic.swift */; }; 6525A82625E13FD4008FE0D0 /* SeismicNetworkAdvertiseTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6525A82525E13FD4008FE0D0 /* SeismicNetworkAdvertiseTableViewCell.swift */; }; 652C37BD26092B3C0068EC3B /* FiltersViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 652C37BC26092B3C0068EC3B /* FiltersViewModel.swift */; }; + 6531185928425B89006CBC29 /* NotificationService+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6531185828425B89006CBC29 /* NotificationService+Extension.swift */; }; 65355FFF25F38D3300BB57D2 /* SegnalazioniMapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65355FFE25F38D3300BB57D2 /* SegnalazioniMapViewController.swift */; }; 6535600425F398CD00BB57D2 /* Costanti+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6535600325F398CD00BB57D2 /* Costanti+Extensions.swift */; }; 653604E9262348FA00B2B651 /* EQNBaseMapFilter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 653604E8262348FA00B2B651 /* EQNBaseMapFilter.swift */; }; @@ -288,6 +289,7 @@ 651901B825F5358700CAFF20 /* EQNMapAnnotationSeismic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNMapAnnotationSeismic.swift; sourceTree = ""; }; 6525A82525E13FD4008FE0D0 /* SeismicNetworkAdvertiseTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeismicNetworkAdvertiseTableViewCell.swift; sourceTree = ""; }; 652C37BC26092B3C0068EC3B /* FiltersViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FiltersViewModel.swift; sourceTree = ""; }; + 6531185828425B89006CBC29 /* NotificationService+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NotificationService+Extension.swift"; sourceTree = ""; }; 65355FFE25F38D3300BB57D2 /* SegnalazioniMapViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegnalazioniMapViewController.swift; sourceTree = ""; }; 6535600325F398CD00BB57D2 /* Costanti+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Costanti+Extensions.swift"; sourceTree = ""; }; 653604E8262348FA00B2B651 /* EQNBaseMapFilter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNBaseMapFilter.swift; sourceTree = ""; }; @@ -660,6 +662,7 @@ 8C483CB521FDACD100259FD2 /* EQNNotificationService-Bridging-Header.h */, 8C4B0B7C21CACE3F00AED489 /* NotificationService.h */, 8C4B0B7D21CACE3F00AED489 /* NotificationService.m */, + 6531185828425B89006CBC29 /* NotificationService+Extension.swift */, DC30BC862534DBB30041B23B /* Icons */, 8C4B0B7F21CACE3F00AED489 /* Info.plist */, ); @@ -1526,6 +1529,7 @@ buildActionMask = 2147483647; files = ( DCDAB31925188BB3001AE40D /* EQNAllertaSismica.m in Sources */, + 6531185928425B89006CBC29 /* NotificationService+Extension.swift in Sources */, 8C4B0B7E21CACE3F00AED489 /* NotificationService.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0;