From 5c40c610f129d74857592b2eecddff6033089ee8 Mon Sep 17 00:00:00 2001 From: emawby Date: Thu, 26 Oct 2023 10:00:51 -0700 Subject: [PATCH 1/2] Fixing cached badge value if disable clearing is true --- .../OneSignalNotifications/OSNotificationsManager.m | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotificationsManager.m b/iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotificationsManager.m index 7635dae06..86bdc1e07 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotificationsManager.m +++ b/iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotificationsManager.m @@ -764,8 +764,11 @@ + (BOOL)clearBadgeCount:(BOOL)fromNotifOpened { else _disableBadgeClearing = NO; - if (_disableBadgeClearing) + if (_disableBadgeClearing) { + // The customer could have manually changed the badge value. We must ensure our cached value will match the current state. + [OneSignalUserDefaults.initShared saveIntegerForKey:ONESIGNAL_BADGE_KEY withValue:[UIApplication sharedApplication].applicationIconBadgeNumber]; return false; + } bool wasBadgeSet = [UIApplication sharedApplication].applicationIconBadgeNumber > 0; From 3da18b0875513b58303d5095745e8ea33a44bcd8 Mon Sep 17 00:00:00 2001 From: emawby Date: Thu, 26 Oct 2023 11:09:37 -0700 Subject: [PATCH 2/2] clearAll now also always removes badges If clearAll was called with disable badge clearing set to true then we would clear notifications but no the badge. This change makes it so that clearAll removes badges regardless of the disable badge clearing setting --- .../OneSignalNotifications/OSNotificationsManager.h | 2 +- .../OneSignalNotifications/OSNotificationsManager.m | 10 +++++----- iOS_SDK/OneSignalSDK/Source/OneSignal.m | 3 +-- iOS_SDK/OneSignalSDK/Source/OneSignalTracker.m | 2 +- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotificationsManager.h b/iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotificationsManager.h index cd973d8d6..81a5eaafb 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotificationsManager.h +++ b/iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotificationsManager.h @@ -114,7 +114,7 @@ NS_SWIFT_NAME(onClick(event:)); + (void)handleWillShowInForegroundForNotification:(OSNotification *_Nonnull)notification completion:(OSNotificationDisplayResponse _Nonnull)completion; + (void)handleNotificationActionWithUrl:(NSString* _Nullable)url actionID:(NSString* _Nonnull)actionID; -+ (BOOL)clearBadgeCount:(BOOL)fromNotifOpened; ++ (BOOL)clearBadgeCount:(BOOL)fromNotifOpened fromClearAll:(BOOL)fromClearAll; + (BOOL)receiveRemoteNotification:(UIApplication* _Nonnull)application UserInfo:(NSDictionary* _Nonnull)userInfo completionHandler:(void (^_Nonnull)(UIBackgroundFetchResult))completionHandler; + (void)notificationReceived:(NSDictionary* _Nonnull)messageDict wasOpened:(BOOL)opened; diff --git a/iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotificationsManager.m b/iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotificationsManager.m index 86bdc1e07..9a2ee252e 100644 --- a/iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotificationsManager.m +++ b/iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotificationsManager.m @@ -383,8 +383,8 @@ + (void)presentAppSettings { + (void)clearAll { [[UNUserNotificationCenter currentNotificationCenter] removeAllDeliveredNotifications]; - // TODO: Determine if we also need to call clearBadgeCount - [self clearBadgeCount:false]; + // removing delivered notifications doesn't update the badge count + [self clearBadgeCount:false fromClearAll:true]; } + (BOOL)registerForAPNsToken { @@ -686,7 +686,7 @@ + (void)handleNotificationOpened:(NSDictionary*)messageDict [self launchWebURL:notification.launchURL]; //TODO: where should this live? } - [self clearBadgeCount:true]; + [self clearBadgeCount:true fromClearAll:false]; NSString* actionID = NULL; if (actionType == OSNotificationActionTypeActionTaken) { @@ -755,7 +755,7 @@ + (void)displayWebView:(NSURL*)url { openUrlBlock(true); } -+ (BOOL)clearBadgeCount:(BOOL)fromNotifOpened { ++ (BOOL)clearBadgeCount:(BOOL)fromNotifOpened fromClearAll:(BOOL)fromClearAll { NSNumber *disableBadgeNumber = [[NSBundle mainBundle] objectForInfoDictionaryKey:ONESIGNAL_DISABLE_BADGE_CLEARING]; @@ -764,7 +764,7 @@ + (BOOL)clearBadgeCount:(BOOL)fromNotifOpened { else _disableBadgeClearing = NO; - if (_disableBadgeClearing) { + if (_disableBadgeClearing && !fromClearAll) { // The customer could have manually changed the badge value. We must ensure our cached value will match the current state. [OneSignalUserDefaults.initShared saveIntegerForKey:ONESIGNAL_BADGE_KEY withValue:[UIApplication sharedApplication].applicationIconBadgeNumber]; return false; diff --git a/iOS_SDK/OneSignalSDK/Source/OneSignal.m b/iOS_SDK/OneSignalSDK/Source/OneSignal.m index d135c4f71..69cb137b3 100755 --- a/iOS_SDK/OneSignalSDK/Source/OneSignal.m +++ b/iOS_SDK/OneSignalSDK/Source/OneSignal.m @@ -506,7 +506,7 @@ + (void)init { }]; */ - [OSNotificationsManager clearBadgeCount:false]; + [OSNotificationsManager clearBadgeCount:false fromClearAll:false]; [self startOutcomes]; [self startLocation]; [self startTrackIAP]; @@ -798,7 +798,6 @@ + (void)load { */ - (void)onesignalSetApplicationIconBadgeNumber:(NSInteger)badge { [OneSignalExtensionBadgeHandler updateCachedBadgeValue:badge]; - [self onesignalSetApplicationIconBadgeNumber:badge]; } diff --git a/iOS_SDK/OneSignalSDK/Source/OneSignalTracker.m b/iOS_SDK/OneSignalSDK/Source/OneSignalTracker.m index 323f79f29..76f794d01 100644 --- a/iOS_SDK/OneSignalSDK/Source/OneSignalTracker.m +++ b/iOS_SDK/OneSignalSDK/Source/OneSignalTracker.m @@ -114,7 +114,7 @@ + (void)applicationForegrounded { // [OneSignal receivedInAppMessageJson:nil]; } - [OSNotificationsManager clearBadgeCount:false]; + [OSNotificationsManager clearBadgeCount:false fromClearAll:false]; } + (void)applicationBackgrounded {