diff --git a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java index 35b3a059..045d7afc 100644 --- a/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java +++ b/android/src/main/java/com/onesignal/rnonesignalandroid/RNOneSignal.java @@ -65,6 +65,8 @@ of this software and associated documentation files (the "Software"), to deal import com.onesignal.notifications.INotificationLifecycleListener; import com.onesignal.notifications.INotificationWillDisplayEvent; import com.onesignal.notifications.IPermissionObserver; +import com.onesignal.notifications.internal.badges.impl.shortcutbadger.ShortcutBadgeException; +import com.onesignal.notifications.internal.badges.impl.shortcutbadger.ShortcutBadger; import com.onesignal.user.state.IUserStateObserver; import com.onesignal.user.state.UserChangedState; import com.onesignal.user.subscriptions.IPushSubscription; @@ -274,6 +276,15 @@ public void setPrivacyConsentRequired(Boolean required) { OneSignal.setConsentRequired(required); } + @ReactMethod + public void setBadgeCount(int count) { + try { + ShortcutBadger.applyCountOrThrow(mReactApplicationContext, count); + } catch (ShortcutBadgeException e) { + e.printStackTrace(); + } + } + // OneSignal.Debug namespace methods @ReactMethod public void setLogLevel(int logLevel) { diff --git a/ios/RCTOneSignal/RCTOneSignalEventEmitter.m b/ios/RCTOneSignal/RCTOneSignalEventEmitter.m index 93abb6fe..f6b375c9 100644 --- a/ios/RCTOneSignal/RCTOneSignalEventEmitter.m +++ b/ios/RCTOneSignal/RCTOneSignalEventEmitter.m @@ -244,6 +244,25 @@ + (void)sendEventWithName:(NSString *)name withBody:(NSDictionary *)body { [OneSignal setConsentRequired:required]; } +RCT_EXPORT_METHOD(setBadgeCount:(double)count) { + if (@available(iOS 16.0, macOS 10.13, macCatalyst 16.0, tvOS 16.0, visionOS 1.0, *)) { + UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; + [center setBadgeCount:count + withCompletionHandler:^(NSError *error) { + if (error) { + NSLog(@"OneSignal: Could not setBadgeCount: %@", error); + } + }]; + return; + } else { + // If count is 0, set to -1 instead to avoid notifications in tray being cleared + // this breaks in iOS 18, but at that point we're using the new setBadge API + NSInteger newCount = count == 0 ? -1 : count; + UIApplication *application = RCTSharedApplication(); + [application setApplicationIconBadgeNumber:newCount]; + } +} + // OneSignal.Debug namespace methods RCT_EXPORT_METHOD(setLogLevel : (int)logLevel) { [OneSignal.Debug setLogLevel:logLevel]; diff --git a/src/index.ts b/src/index.ts index 2fc85415..f3983a09 100644 --- a/src/index.ts +++ b/src/index.ts @@ -132,6 +132,15 @@ export namespace OneSignal { RNOneSignal.setPrivacyConsentGiven(granted); } + /** + * Ultility function to set badge count manually + */ + export function setBadgeCount(count: number) { + if (!isNativeModuleLoaded(RNOneSignal)) return; + + RNOneSignal.setBadgeCount(count); + } + export namespace Debug { /** * Enable logging to help debug if you run into an issue setting up OneSignal. @@ -956,4 +965,4 @@ export { export { default as OSNotification } from './OSNotification'; export type { InAppMessageClickResult } from './types/inAppMessage'; -export type { NotificationClickResult } from './types/notificationEvents'; +export type { NotificationClickResult } from './types/notificationEvents'; \ No newline at end of file