File tree Expand file tree Collapse file tree 7 files changed +25
-9
lines changed Expand file tree Collapse file tree 7 files changed +25
-9
lines changed Original file line number Diff line number Diff line change 2828#import < Foundation/Foundation.h>
2929
3030@interface OneSignalBadgeHelpers : NSObject
31- + (void )updateCachedBadgeValue : (NSInteger )value ;
31+ + (void )updateCachedBadgeValue : (NSInteger )value usePreviousBadgeCount : ( BOOL ) usePrevious ;
3232@end
Original file line number Diff line number Diff line change 3030#import " OneSignalCommonDefines.h"
3131
3232@implementation OneSignalBadgeHelpers
33- + (void )updateCachedBadgeValue : (NSInteger )value {
33+
34+ /* *
35+ Store a previous badge count so that we can revert to this cached value when a notification display is cancelled.
36+ When `usePreviousBadgeCount` is `true`, the `value` passed to this method will be unused.
37+ */
38+ + (void )updateCachedBadgeValue : (NSInteger )value usePreviousBadgeCount : (BOOL )usePrevious {
3439 // Since badge logic can be executed in an extension, we need to use app groups to get
3540 // a shared NSUserDefaults from the app group suite name
36- [OneSignalUserDefaults.initShared saveIntegerForKey: ONESIGNAL_BADGE_KEY withValue: value];
41+ if (usePrevious) {
42+ // Keep the PREVIOUS_ONESIGNAL_BADGE_KEY value unchanged
43+ NSInteger previousBadgeCount = [OneSignalUserDefaults.initShared getSavedIntegerForKey: PREVIOUS_ONESIGNAL_BADGE_KEY defaultValue: 0 ];
44+ [OneSignalUserDefaults.initShared saveIntegerForKey: ONESIGNAL_BADGE_KEY withValue: previousBadgeCount];
45+ } else {
46+ NSInteger previousBadgeCount = [OneSignalUserDefaults.initShared getSavedIntegerForKey: ONESIGNAL_BADGE_KEY defaultValue: 0 ];
47+ [OneSignalUserDefaults.initShared saveIntegerForKey: PREVIOUS_ONESIGNAL_BADGE_KEY withValue: previousBadgeCount];
48+ [OneSignalUserDefaults.initShared saveIntegerForKey: ONESIGNAL_BADGE_KEY withValue: value];
49+ }
3750}
51+
3852@end
Original file line number Diff line number Diff line change 159159#define ONESIGNAL_DISABLE_BADGE_CLEARING @" OneSignal_disable_badge_clearing"
160160#define ONESIGNAL_APP_GROUP_NAME_KEY @" OneSignal_app_groups_key"
161161#define ONESIGNAL_BADGE_KEY @" onesignalBadgeCount"
162+ // / Store the previous badge count to read for a cancelled notification display event
163+ #define PREVIOUS_ONESIGNAL_BADGE_KEY @" previousOnesignalBadgeCount"
162164
163165// Firebase
164166#define ONESIGNAL_FB_ENABLE_FIREBASE @" OS_ENABLE_FIREBASE_ANALYTICS"
Original file line number Diff line number Diff line change @@ -35,7 +35,7 @@ + (void)handleBadgeCountWithNotificationRequest:(UNNotificationRequest *)request
3535 // make sure the OneSignal cached value is updated to this value
3636 if (!notification.badgeIncrement ) {
3737 if (notification.hasBadge )
38- [OneSignalBadgeHelpers updateCachedBadgeValue: notification.badge];
38+ [OneSignalBadgeHelpers updateCachedBadgeValue: notification.badge usePreviousBadgeCount: false ];
3939
4040 return ;
4141 }
@@ -50,7 +50,7 @@ + (void)handleBadgeCountWithNotificationRequest:(UNNotificationRequest *)request
5050
5151 replacementContent.badge = @(currentValue);
5252
53- [OneSignalBadgeHelpers updateCachedBadgeValue: currentValue];
53+ [OneSignalBadgeHelpers updateCachedBadgeValue: currentValue usePreviousBadgeCount: false ];
5454}
5555
5656+ (NSInteger )currentCachedBadgeValue {
Original file line number Diff line number Diff line change @@ -179,7 +179,7 @@ - (void)onesignalGetNotificationSettingsWithCompletionHandler:(void(^)(UNNotific
179179 necessary as there is no equivalent "getBadgeCount" method available.
180180 */
181181- (void )onesignalSetBadgeCount : (NSInteger )badge withCompletionHandler : (void (^)(NSError *error))completionHandler {
182- [OneSignalBadgeHelpers updateCachedBadgeValue: badge];
182+ [OneSignalBadgeHelpers updateCachedBadgeValue: badge usePreviousBadgeCount: false ];
183183 [self onesignalSetBadgeCount: badge withCompletionHandler: completionHandler];
184184}
185185
Original file line number Diff line number Diff line change @@ -76,8 +76,8 @@ - (void)complete:(OSDisplayableNotification *)notification {
7676 reset the badge count to the value prior to receipt of this notif
7777 */
7878 if (!notification) {
79- NSInteger previousBadgeCount = [UIApplication sharedApplication ]. applicationIconBadgeNumber ;
80- [OneSignalBadgeHelpers updateCachedBadgeValue: previousBadgeCount ];
79+ // The badge count value of -99 will not be used, the previous badge count will be set
80+ [OneSignalBadgeHelpers updateCachedBadgeValue: - 99 usePreviousBadgeCount: true ];
8181 }
8282 if (_completion) {
8383 _completion (notification);
Original file line number Diff line number Diff line change @@ -809,7 +809,7 @@ + (void)load {
809809 We swizzle the 'setApplicationIconBadgeNumber()' to intercept these calls so we always know the latest count
810810*/
811811- (void )onesignalSetApplicationIconBadgeNumber : (NSInteger )badge {
812- [OneSignalBadgeHelpers updateCachedBadgeValue: badge];
812+ [OneSignalBadgeHelpers updateCachedBadgeValue: badge usePreviousBadgeCount: false ];
813813 [self onesignalSetApplicationIconBadgeNumber: badge];
814814}
815815
You can’t perform that action at this time.
0 commit comments