Skip to content

Commit 1fe4fc1

Browse files
committed
Keep a previous badge count as well as current
* When a notification foreground display is cancelled, the badge count in that notification (if any) does not apply. We have to revert our cached badge count back to the previous. We store the previous as we cannot use a getter for badge count anymore.
1 parent 0f1ae55 commit 1fe4fc1

File tree

7 files changed

+25
-9
lines changed

7 files changed

+25
-9
lines changed

iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalBadgeHelpers.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@
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

iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalBadgeHelpers.m

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,23 @@
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

iOS_SDK/OneSignalSDK/OneSignalCore/Source/OneSignalCommonDefines.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,8 @@
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"

iOS_SDK/OneSignalSDK/OneSignalExtension/OneSignalExtensionBadgeHandler.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff 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 {

iOS_SDK/OneSignalSDK/OneSignalNotifications/Categories/UNUserNotificationCenter+OneSignalNotifications.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff 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

iOS_SDK/OneSignalSDK/OneSignalNotifications/OSNotification+OneSignal.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff 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);

iOS_SDK/OneSignalSDK/Source/OneSignal.m

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff 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

0 commit comments

Comments
 (0)