- FCM Mode: added top-level
subtitlesupport and AndroidcircularLargeIconsupport in the Server SDK wire payload and client reconstruction. - FCM Mode / Android: expanded the supported
BIG_TEXTstyle withtitleandsummary, andBIG_PICTUREwithtitle,summary, andlargeIcon(including explicitnullto hide the expanded large icon). Other notification fields and styles remain outside the FCM Mode contract. - FCM Mode / Android interactions: added explicit body-tap opt-out with
pressAction: null; body and action press actions now carrymainComponentandlaunchActivityFlagsalongsideidandlaunchActivity. Actions also carryiconand the supportedAndroidInputconfiguration;input: truerequests a standard direct reply. The_v: 1wire contract is unchanged.
- Android / foreground services:
stopForegroundService()no longer cold-starts aForegroundServicejust to deliver STOP when no instance is active. Repeated STOP calls are safe and idempotent; stopping a service that is neither active nor starting is a no-op. On Android 12+ (API 31+), a platformForegroundServiceStartNotAllowedExceptionin the defensive terminal STOP/null path is now non-fatal instead of being wrapped in a fatal error. This terminal denial handling does not suppress real START failures, unrelated errors, or configuration failures. Issue #77. - iOS / per-notification badges:
NotificationIOS.badgeCountnow rejects fractional and non-finite values. Valid numeric values must be finite non-negative integers; negative values remain invalid. For immediate and trigger notifications, an absent ornullbadgeCountleaves the current badge unchanged,0still clears it, and positive integers still set it. - FCM Mode / notification identity: preserved public
notification.idin the unchanged_v: 1payload and client reconstruction. Android display/replacement, readback, events, and cancel now use that ID instead of the FirebasemessageIdwhen it is supplied;buildFcmNotification()retains it. - FCM Mode / iOS identity: the NSE keeps the logical NotifyKit notification ID separate from the physical APNs request identifier. Readback, events, and cancel use the logical ID, including cancellation of multiple delivered requests associated with it. Payloads without an ID keep their path-specific legacy fallback.
- FCM Mode / APNs: validated the effective
apns-collapse-id(options.collapseKey ?? notification.id) against the 64-byte UTF-8 limit. Transport collapse remains independent of public notification identity and does not guarantee replacement after delivery. - FCM Mode / iOS: the Notification Service Extension now preserves Server SDK
notification.datain the delivered notification and event data while keeping APNs/FCM/NotifyKit metadata authoritative and legacyoptions.databehavior intact. - FCM Mode / iOS: the extension preserves positive and zero
aps.badgevalues and leaves an absent badge absent. Legacy/manual_v: 1notifee_options.ios.badgeCount: nullis now treated as an absent override instead of being passed to the native badge setter asNSNull, preserving the original APNs badge behavior. Numeric legacy overrides keep precedence overaps.badge; the public Server SDKoptions.iosBadgeCount?: numberstill rejectsnull. - FCM Mode / Android interactions: legacy
_v: 1input: falsenow means no reply; other malformed legacy inputs are rejected instead of silently dropped. The internal body-tap opt-out ID is rejected as a public or wirepressAction.id. - FCM Mode / Android interactions: malformed body and action
pressActionvalues are rejected instead of treating a malformed body value as absent. Present non-arrayactionsand malformed action entries are rejected, and everylaunchActivityFlagsvalue is validated.
- Android / foreground services: expanded lifecycle and race regression coverage for inactive/repeated STOP, START/STOP/new START, pending START/STOP ordering, and late runner completion, while retaining regression checks for defensive
SecurityExceptionhandling (#44) and same-ID notification updates (#75). - Android / foreground-service runtime: inactive/double STOP, START/STOP/new START, pending START ordering, and same-ID update/re-post/restart paths passed on Android 10/API 29 and Android 13/API 33 emulators and a physical Pixel 9 Pro XL running Android 17/API 37. The #77 background STOP scenario passed on API 33 and API 37; the #44 defensive
SecurityExceptionregression passed on API 37. Runtime qualification used native entrypoints equivalent to the library's Android bridge calls; the literal JavaScript/headless end-to-end path was not run. - iOS / per-notification badges: expanded validator, display, and timestamp/rolling trigger regression coverage for absent,
null, zero, positive finite integers, and invalid numeric rejection before native dispatch. Physical iPhone 16e / iOS 26.5 checks passed for immediate absent/null/0/positive and real timestamp triggernull/0/positive. Negative, fractional,NaN, and±Infinityinputs were qualified host-side only and were not sent to the device; rolling trigger device runtime was not run. - FCM Mode / iOS badges: added production NSE helper and badge-builder coverage for absent/legacy
nulloverrides and numeric precedence. On the same physical iPhone, the real APNs transport gate (T0) passed and B1–B8 passed 8/8 with the installed NSE: legacynullor absent with APNs absent/0/7, and legacy3/0overriding APNs7. Badge-zero withdrawal was classified as iOS/SpringBoard behavior. - FCM Mode / Batch 3: added Server SDK, client reconstruction, Android native, and iOS NSE/readback/cancel/event harness regression coverage for notification identity, distinct collapse keys, legacy
_v: 1fallbacks, and the effective APNs 64-byte UTF-8 limit. - FCM Mode / Batch 3 Android device: on a Pixel 9 Pro XL / Android 17 API 37, qualified same-N replacement with distinct M and C values, preservation of distinct N values sharing C when both arrived, readback/cancel and
PRESSby N,buildFcmNotification()identity, and the legacy no-N fallback. - FCM Mode / Batch 3 iOS device: on an iPhone 16e / iOS 26.5, qualified N=C and N≠C through the real NSE, foreground identity, readback and
PRESSby N, cancellation of multiple R values sharing N, collision safety, and the legacy no-N fallback to R. iOSACTION_PRESSdevice runtime was not run. - FCM Mode / transport collapse: an offline iOS device received only the second message after reconnection when both shared C. In a separate run, the NSE processed a second N=C push while Notification Center still showed the first push's content, confirming that transport collapse does not guarantee replacement after delivery.
- FCM Mode / Batch 2A: added Server SDK serialization and validation, client reconstruction, and Firebase Admin compatibility coverage, including
_v: 1, omitted fields, explicitcircularLargeIcon: false, andBIG_PICTURE.largeIcon: null. - FCM Mode / Android: qualified Batch 2A display on a physical Pixel 9 Pro XL running Android 17/API 37, including
subtitle, both circular icon settings, the absent default, both expanded styles, explicitBIG_PICTURE.largeIcon: null, and a legacy payload without the new fields. iOSsubtitledevice runtime was not run. - FCM Mode / Batch 2B: added Server SDK serialization/validation, client reconstruction, normal-validator, and Firebase Admin compatibility coverage for Android interactions. Physical Pixel 9 Pro XL / Android 17/API 37 checks passed for default body tap,
pressAction: null(contentIntent=null, no app opening orPRESS), configured press actions with launch flags,ACTION_PRESSwithout input, and direct replies (input: trueand configured choices). Actioniconpassed the data/native path, but was not visibly rendered in the shade; an alternatemainComponentwas not run on device. - FCM Mode / Android interactions: added host regression coverage across wire serialization, reconstruction, and normal validation for malformed interaction payloads; invalid payloads do not invoke the native display module.
- FCM Mode / iOS: replaced the synthetic NSE stand-in with shared Server SDK-to-NSE fixtures and a native harness that exercises the production extension helper.
This 10.7.2 maintenance update fixes stale state when long-lived Android foreground-service notifications are updated repeatedly with the same ID.
- Fixed same-ID updates retaining stale first-notification state, which could leave later re-post and timeout paths using obsolete content. The current foreground-service state now follows the latest update submitted to Android by a platform call that returned normally. Issue #75.
This 10.7.1 maintenance update fixes Android notification timestamp preservation in FCM Mode and the Server SDK.
- Fixed Android
showTimestampandtimestamphandling sobuildNotifyKitPayload()preserves both fields in_v: 1notifee_optionsthrough client reconstruction, enabling the existing Android timestamp display and sorting behavior for FCM Mode notifications. Issue #73.
This 10.7.0 update adds Expo CNG support for generating Android small notification icon resources from project-relative PNG files.
- Added
android.iconsconfig-plugin support for generating one or more density-specific Android small notification icon resources during CNG/prebuild. - Each configured resource name can be used with
notification.android.smallIcon. - The plugin writes an Android resource-shrinker keep rule for generated icons. Only
type: 'small'is supported.
This 10.6.0 update adds Android full-screen intent access reporting and fixes notification reliability across MessagingStyle person resolution, action validation, Fresco bitmap ownership, PendingIntent identity, and iOS Communication Notification avatar handling.
- Added
getNotificationSettings().android.fullScreenIntentreporting for the Android access required to use full-screen intents. - API < 29 reports
ENABLED, API 29-33 reflectsUSE_FULL_SCREEN_INTENT, and API 34+ reflects Android's full-screen intent special app access. ENABLEDdoes not guarantee that a particular notification will be presented full-screen.
- Fixed a failure path that could drop
MessagingStylenotifications whenPersonresolution timed out or an icon could not be loaded or created. - Recoverable
MessagingStyleperson failures now use an icon-less fallback that preserves the remainingPersonfields and allows notification construction to continue. - Fixed notification image handling so Fresco-owned bitmaps are copied before leaving
BaseBitmapDataSubscriber. - Fixed
ReceiverServicePendingIntentidentity collisions across app process restarts that could route action buttons or dismiss/delete intents from older live notifications to another notification's payload.
- Fixed validation in the React Native client and Server SDK so duplicate
pressAction.idvalues within a single notification'sandroid.actionsarray are rejected.
- Fixed valid
file://sender avatars so they display their image instead of a placeholder. - Materialized HTTPS group avatars before the communication intent is built in both direct and Notification Service Extension (NSE) paths.
- Added deterministic regression coverage for
MessagingStylePersontimeouts and icon failures, Fresco bitmap ownership, full-screen intent access reporting, andReceiverServicePendingIntentidentity. - Added a physical-device smoke harness covering a notification surviving a process restart, a second notification posted from the new process, real action-button presses, and real dismiss routing; the device scenarios were validated on a Pixel 9 Pro XL running Android 17/API 37.
- Added iOS harness coverage for avatar resolution and materialization in Communication Notifications, deadline and media-cutoff handling, and one-shot NSE completion.
This 10.5.0 update fixes Firebase Admin compatibility in the Server SDK payload builder while preserving the public TTL input in seconds.
- Fixed
buildNotifyKitPayload()returning Android fields in raw HTTP v1 form, which caused Firebase Admin to reject messages usingoptions.ttl. - Generated messages now use Firebase Admin-compatible millisecond TTL values, priority values, collapse-key naming, and routing types.
- Added local Firebase Admin compatibility coverage for TTL conversion, priority, collapse keys, token/topic/condition routing, APNs expiration, custom data, and non-enumerable payload metadata without credentials or network requests.
This 10.4.9 maintenance update fixes Android foreground event delivery during native event relay initialization and React context transitions.
- Registering
onForegroundEvent()now initializes the native event relay, preventing foreground events from being missed when no other native API has been called. - Pending notification events are requeued when the
ReactContextbecomes null or inactive after the flush snapshot, preventing permanent event loss while preserving FIFO ordering, the queue capacity of 10, and drop-oldest behavior.
This 10.4.8 update adds an FCM build-only helper so apps can inspect or customize a reconstructed FCM notification before displaying it manually.
- Added
buildFcmNotification(remoteMessage), a build-only counterpart tohandleFcmMessage(). - Reconstructs the FCM
Notificationwithout displaying it. - Allows apps to inspect or customize the notification before calling
displayNotification()manually.
This 10.4.7 maintenance update hardens the Android foreground-service STOP/null placeholder path on Android 14+ so defensive cleanup no longer reuses unsafe while-in-use foreground-service types when the app is backgrounded. Public APIs and the normal foreground-service START path are unchanged.
- Hardened the defensive foreground-service STOP/null placeholder on Android 14+ so it no longer reuses the full manifest-declared foreground-service type mask.
- Avoided reusing while-in-use types such as
microphoneorcamerafor the defensive STOP/null placeholder when a safer declared type such asshortServiceordataSyncis available. - Treated a defensive
SecurityExceptionin this STOP/null path as non-fatal.
- Added foreground-service regression coverage for the defensive STOP/null path, including Robolectric coverage for
microphone|dataSync,camera|dataSync,shortService|microphone,microphone-only, and defensiveSecurityExceptionhandling. - Added a smoke harness and script validated on a physical Pixel 9 Pro XL running Android 16/API 36 for the
microphone|dataSyncbackground STOP scenario.
This 10.4.6 maintenance update fixes a React Native New Architecture import-time crash in bridgeless apps by deferring NotifeeApiModule TurboModule resolution until the first native access. It also adds regression coverage and an iOS smoke scenario for early listener registration.
- Fixed an import-time crash in bridgeless apps by deferring
NotifeeApiModuleTurboModule resolution until the first native access. - Early imports, such as registering
notifee.onBackgroundEvent(...)inindex.js, no longer callTurboModuleRegistry.getEnforcing(...)during module evaluation. - Public APIs are unchanged.
- Added targeted
NotifeeNativeModulecoverage for constructor-safe lazy TurboModule resolution, idempotent native event listener setup, error propagation, and retry behavior after native emitter/listener setup failures. - Added a
listener-onlyiOS smoke scenario and non-terminating iOS device harness mode for validating early listener registration without invoking notification display APIs in the scenario.
This 10.4.5 maintenance update fixes Android background notification action routing and a stale React context recovery edge case in headless background tasks. It also clarifies Android scheduled trigger recovery and Expo CNG/prebuild behavior for local scheduled triggers.
- Kept Android 12+ notification actions without
launchActivityormainComponenton theReceiverServicepath instead of always routing them through the launch-activityPendingIntent.
- Fixed a
HeadlessTaskstaleReactContextedge case where the cached initialized state could remain true while the currentReactContextwas null. - Background tasks now treat that state as stale, restart the ReactHost initialization path, and drain queued tasks only after a valid
ReactContextis available.
- Clarified Android scheduled trigger reboot recovery, exact-alarm fallback behavior, and Expo CNG/prebuild manifest-merge behavior for local scheduled triggers.
- Added targeted
HeadlessTaskregression coverage for stale/nullReactContextrecovery. - Validated the no-launch notification action background path on a physical Pixel 9 Pro XL running Android 16.
This 10.4.4 maintenance update records Android Java guard, documentation, repository tooling, and test harness updates already validated on the maintenance branch. It does not change the public JavaScript API or notification runtime behavior.
- JDK 17 remains the minimum requirement for Android builds.
- JDK 17 and JDK 21 are the validated Android build baselines.
- JDK versions newer than the validated baselines are no longer blocked by NotifyKit before the consumer Gradle, Android Gradle Plugin, Kotlin, and React Native toolchain can evaluate compatibility.
- For Expo/EAS projects, newer JDK compatibility also depends on the consumer Expo/EAS Android toolchain.
- Clarified the Android JDK policy across installation, environment support, README, and package README documentation.
- Documented that Android builds require JDK 17 or newer, that JDK 17 and JDK 21 are the validated baselines, and that newer JDKs remain toolchain-dependent.
- Documented that JDK 8 and JDK 11 are not supported.
- Resolved the repository lockfile alert for xcode's transitive uuid dependency with a targeted Yarn resolution for
xcode/uuidtouuid11.1.1. xcoderemains at 3.0.1. The uuid advisory was not runtime-reachable through NotifyKit notification behavior in this repository usage, and this root lockfile fix does not automatically protect all npm consumers.- Updated the Expo smoke fixture from
expo~55.0.23 to ~55.0.26 so its Expo Metro chain resolvespostcssto patched 8.5.x. This fixture tooling fix does not add a PostCSS resolution and does not enter the publishedreact-native-notify-kitnpm package. - Updated the
wslockfile resolution used through@expo/clifrom 8.20.0 to 8.20.1, within the existing^8.12.1range. This did not changepackage.json, Expo SDK, React Native, Metro, or add awsresolution. - The PostCSS and ws alerts were through Expo smoke fixture tooling, not NotifyKit runtime notification issues.
- Moved the xcode-backed Expo config plugin tests to Jest's node environment so
xcoderesolvesuuidthrough the Node/CommonJS export path under the React Native Jest preset. - Made
scripts/test-ios-nse-helper.shexecutable; the script content is unchanged.
- Passed
yarn validate:all,yarn verify:ios-core,yarn smoke:expo:config,yarn tests_rn:test,yarn tests_rn:test-server,cd packages/cli && yarn test, the iOS delegate/local attachment/NSE helper harnesses,yarn test:core:android, andyarn e2e:cli-tarball. - Passed dependency/tooling checks for the advisory follow-ups:
yarn why postcss,yarn install --immutable,yarn why ws,yarn smoke:expo:config, andyarn validate:all.
- Expo prebuild, Android runtime smoke, real iOS builds, device smoke, NSE runtime, FCM/Firebase, EAS, release, publish, and tag workflows were not validated as part of this maintenance entry.
This 10.4.3 maintenance update realigns the library development target and bare React Native smoke app with React Native 0.85.3. It keeps the minimum supported React Native version at >=0.73.0 and remains New Architecture only.
- Updated the current development target to React Native 0.85.3 for the library and bare smoke app.
- Aligned bare smoke tooling with React Native 0.85.3, including
@react-native/*tooling and@react-native/jest-preset. - Aligned the bare smoke Android Gradle wrapper with the React Native 0.85.3 template.
- Refreshed the bare smoke iOS
Podfile.lockto React Native 0.85.3 pods, Hermes 250829098.0.10, and RNNotifee 10.4.2.
- Validated TypeScript checks, React Native Jest tests, server Jest tests, Android unit tests, iOS core generation verification, bare Android
assembleDebug, iOS pod install, and physical iPhone build/install. - Confirmed visible local notification display on a physical iPhone.
- Public JS API unchanged.
- Runtime notification behavior unchanged.
- Expo smoke remains on Expo SDK 55 / React Native 0.83.x and was not updated as part of this step.
- Expo React Native 0.85 validation remains a separate future track and was not part of this maintenance step.
- FCM, headless/background flows, EAS, and Expo smoke were not validated as part of this step.
- iOS tap/background/killed press flow is not claimed as fully validated by this step.
This 10.4.2 patch hardens Expo CNG iOS NotifyKitNSE generation and fixes an iOS precompiled-modules header visibility issue in RNNotifee. It does not change the public JavaScript API and does not change runtime notification behavior.
If your app uses Expo CNG and a generated NotifyKitNSE, upgrading to 10.4.2 avoids stale 1.0 extension version metadata and CocoaPods host/extension use_frameworks! mismatches.
10.4.2 also avoids a reported iOS precompiled-modules build failure where NotifeeApiModule.mm could not resolve NotifeeCore+UNUserNotificationCenter.h. The import now uses the same relative NotifeeCore path style as the existing NotifeeCore.h import. This is a compile-time-only fix.
The Expo smoke iOS fixture now uses ios.forceStaticLinking for RNFBApp and RNFBMessaging, because the fixture includes RNFirebase and uses ios.useFrameworks: "static". This avoids the local RNFirebase non-modular-header failure seen under precompiled Expo Modules.
- Fixed generated
NotifyKitNSEversion/build metadata so the extension mirrors the parent Expo app version/build inInfo.plistand Xcode build settings. - Existing generated
NotifyKitNSEtargets are normalized for version/build metadata and Podfile linkage instead of requiring manual deletion/regeneration. - Fixed
NotifyKitNSEPodfileuse_frameworks!inheritance so the extension matches the host target linkage, including static and dynamic frameworks. - Expo conditional
use_frameworks!Podfile lines are evaluated againstPodfile.properties.jsonandUSE_FRAMEWORKSinstead of being treated as always active. - Fixed an iOS precompiled-modules header visibility issue where
NotifeeApiModule.mmcould fail to resolveNotifeeCore+UNUserNotificationCenter.h.
- Validated locally with
EXPO_USE_PRECOMPILED_MODULES=1, clean iOS prebuild, CocoaPods install, and physical iPhone build/install. - Public JS API unchanged.
- NotifyKit runtime notification behavior unchanged.
- EAS iOS cloud build was not run as part of this validation and remains a separate gate requiring Apple credentials/provisioning.
This 10.4.1 patch fixes an iOS static-frameworks header visibility issue and records the latest Expo smoke fixture EAS validation work. It does not change the public JavaScript API.
- Fixed a static-frameworks header visibility issue where the public
NotifeeApiModule.hheader importedNotifeeCore.h. In clean Expo/EAS or CocoaPods builds using static frameworks, this could surface as'NotifeeCore.h' file not foundwhile compilingRNNotifee. - The
NotifeeCoredependency is now kept private to the implementation file instead of being exposed through the public API module header.
- Hardened the Expo smoke fixture for EAS validation by supporting Firebase file environment variables, enabling Corepack/Yarn 4 for the EAS development profile, making the dynamic Expo config compatible with the EAS config reader, and preserving the NotifyKit config plugin build output in the EAS archive.
- Validated Android EAS Build for the Expo smoke fixture, including Firebase file env secrets, NotifyKit config plugin resolution, RNFirebase config, Gradle build, and APK artifact generation.
- Android EAS validation was limited to the Expo smoke fixture and produced an APK artifact.
- The APK artifact was not used for a full runtime FCM smoke in that validation pass.
- EAS iOS cloud build was not part of this validation and remains a separate gate requiring Apple credentials/provisioning.
- Expo Go remains unsupported because NotifyKit requires native modules and native notification targets/capabilities.
- Existing iOS background JS
PRESSmarker and killed-state tap validation limits still apply.
Release focused on the first official Expo CNG integration for development builds across iOS and Android. This is support for Expo prebuild and development builds, not Expo Go.
- Added an official config plugin entry for
react-native-notify-kit. - iOS: the plugin can generate and wire the
NotifyKitNSENotification Service Extension during Expo prebuild, so Expo development builds can use the FCM Mode attachment/rich-notification path without manually creating the NSE in Xcode. - Android: the plugin can configure NotifyKit foreground service manifest requirements when explicitly opted in through
android.foregroundService.types. - The plugin supports
ios.notificationServiceExtension: trueand an object form withenabled,targetName, andbundleSuffix. - The Android foreground service config supports type-specific manifest permissions and requires
specialUseSubtypewhenspecialUseis selected. - Expo Go is not supported because NotifyKit requires native modules and native notification targets/capabilities.
- The Expo prebuild path now creates the NSE files, Xcode target, host app dependency,
.appexembed phase, bundle identifier, entitlements, and Podfile target. - The generated NSE Podfile target is isolated from the Expo host target to avoid inheriting host modules that do not belong in the extension.
- Static framework alignment was fixed for Expo projects using Firebase and
use_frameworks!. NotifeeExtensionHelperheader imports were adjusted soRNNotifeeCorecan compile inside the generated NSE under static-framework/header-map constraints.
- Android foreground service manifest configuration is available through the NotifyKit config plugin, but it is opt-in. Android remains no-op by default when
android.foregroundServiceis omitted. - The plugin writes
app.notifee.core.ForegroundService,android:foregroundServiceType,FOREGROUND_SERVICE, type-specificFOREGROUND_SERVICE_*permissions where Android defines them, and thespecialUsesubtype property when required. - The plugin does not configure Firebase, does not install RNFirebase, does not add
USE_EXACT_ALARM, does not addUSE_FULL_SCREEN_INTENT, and does not add Maven orextraMavenReposworkarounds. - Android FCM Mode in Expo remains data-only: RNFirebase receives the message and the app calls
notifee.handleFcmMessage(remoteMessage).
- Validated a real npm tarball install from a scratch fixture, plugin resolution from
node_modules, Expo config, iOS prebuild,pod install,xcodebuild,NotifyKitNSE.appexgeneration, and app embedding. - Validated Expo development build runtime smoke on iOS and Android.
- Validated iOS FCM Mode foreground delivery on a physical iPhone with a generated NSE, logical attachment metadata visible through
getDisplayedNotifications(), and observedNotifyKitNSEprocess. - Observed iOS visible FCM background delivery and tap-to-open, but the Expo smoke does not currently produce a reliable JS
PRESSmarker for iOS background tap routing. - Validated Android Expo config, Android prebuild,
expo run:android, base runtime, FCM token registration, foregroundandroid-expo-smoke, backgroundandroid-expo-smoke, visible notification display, and killed-state best-effort delivery without force-stop on a Pixel 9 Pro XL running Android 16 / SDK 36. - Validated Android RNFirebase data-only foreground and background paths through
SMOKE:FCM_ON_MESSAGE,SMOKE:FCM_FOREGROUND_HANDLE_OK,SMOKE:FOREGROUND_EVENT_DELIVERED,SMOKE:FCM_BACKGROUND_MESSAGE, andSMOKE:FCM_BACKGROUND_HANDLE_OK. - Validated Android foreground/background delivery and tap routing in the Expo smoke app on a Pixel 9 Pro XL, including background
SMOKE:BACKGROUND_EVENT_PRESSand optional foregroundSMOKE:FOREGROUND_EVENT_PRESS. - Validated the Android Expo foreground service config plugin with a real prebuild and a runtime
shortServicesmoke on a Pixel 9 Pro XL.
- Expo Go remains unsupported.
- Android background and killed-state data-only delivery depends on FCM priority, device state, Doze, and OEM policy. Force-stop is excluded.
- Android tap validation covers the Expo smoke app on a Pixel 9 Pro XL only. It is not a guarantee for every device, OEM state, or force-stop path.
- iOS JS
PRESSmarker validation for visible FCM background tap remains a follow-up. iOS killed state, visual lock-screen/banner attachment rendering, textual NSE log capture, and iOS RNFirebase data-only/client-handler validation were not completed as release gates for 10.4.0. - Android foreground service runtime validation covers
shortServiceonly. Other foreground service types were not runtime-validated, and Google Play foreground service policy compliance remains the app developer's responsibility. - The Expo smoke app was migrated to React Native Firebase modular APIs to remove the namespaced API deprecation warning from the smoke paths. This is smoke fixture cleanup only and does not change the public NotifyKit API or add a consumer requirement.
Patch release focused on iOS notification delegate reliability and generated iOS core packaging. It does not add a public API, change JavaScript payloads, or introduce a breaking change.
- Improved
UNUserNotificationCenterdelegate chaining reliability with an internal idempotent rechain path. This helps NotifyKit stay in the notification callback path when another SDK assigns itself as the notification center delegate after NotifyKit, while refreshing downstream selector flags and preserving downstream forwarding for non-NotifyKit notifications. - Preserved NotifyKit ownership for local, trigger, and FCM Mode notifications marked with
__notifee_notification, including whenhandleRemoteNotificationsis disabled for non-NotifyKit remote notifications. - Guarded downstream delegate completion handlers so duplicate downstream completion calls do not invoke the upstream completion more than once. No downstream completion timeout or fallback behavior is introduced.
- The delegate reliability fix does not use method swizzling and does not introduce a general delegate multiplexer.
- Regenerated and verified the generated package iOS core before packing.
- Added verification that
packages/react-native/ios/NotifeeCorematches the rootios/NotifeeCoresource of truth and that the npm tarball includes all 17 iOS core files.
- Added iOS delegate chaining harness coverage for current delegate capture, late delegate override, explicit rechain behavior, downstream forwarding, NotifyKit-owned ownership, selector flag refresh,
handleRemoteNotifications: false, FCM Mode ownership, and downstream completion one-shot behavior.
- iOS: hardened Notification Service Extension handling for FCM Mode payloads. The extension now accepts
notifee_optionsboth as the FCM Mode JSON string and as the legacy/manual APNs dictionary shape, with safe fallback for malformed or unexpected payloads. - iOS: guarded Notification Service Extension delivery against duplicate
contentHandlercalls during normal-completion / timeout races. - iOS: scoped Notification Service Extension helper state per request, reducing the risk of stale state when attachment completions arrive late.
- iOS: fixed
getNotificationCategories()readback for text input notification actions. - iOS: hardened the non-NSE local attachment downloader with explicit timeouts and safer filename-extension handling.
- Added ObjC harness coverage for NSE payload parsing/fallback and local attachment downloader behavior.
- Added iOS device smoke automation with callback-based PASS/FAIL results for local notifications, displayed-notification verification, FCM minimal delivery, and FCM iOS attachment delivery.
- Android: fixed a Kotlin compilation issue in
prewarmForegroundService()on some React Native/Kotlin toolchains, reported with React Native 0.77.3, where the directapp.notifee.core.WarmupHelperreference could fail withUnresolved reference 'app'. The bridge now importsWarmupHelperexplicitly. This is a compile-time fix only with no runtime behavior, public API, JavaScript payload, Gradle, or manifest changes.
- Android: internal Bundle/Parcelable reader modernization and deprecation cleanup. No public API, JavaScript payload, scheduling, Room, reboot recovery, foreground service, or PendingIntent behavior changes are intended.
- Android:
pressAction: nullnow fully disables notification body taps. The notification body no longer opens the app, emitsPRESS, or populatesgetInitialNotification()when the press action is explicitly opted out. Action buttons remain unaffected. - Android: fixed
getChannelGroup()delegation to use the channel group API instead of the channel API.
- Tests: expanded Android regression coverage around notification, channel, trigger parsing and manager scheduler paths.
- Tests: added Android unit and smoke coverage for
PRESS/ACTION_PRESSrouting,InitialNotificationEvent, Headless JS dispatch, action buttons withoutlaunchActivity,pressAction: null, and default notification body taps.
- Android:
getPowerManagerInfo().activitynow represents a known vendor-settings candidate rather than aPackageManager-prevalidated activity. - Android:
openPowerManagerSettings()now attempts vendor settings intents directly and safely falls back or no-ops when Android cannot resolve or start the intent.
- Android: guarded notification posting on Android 13+ when
POST_NOTIFICATIONSis not granted, avoiding uncontrolledSecurityExceptionfailures andDELIVEREDevents whennotify()is not called. - Android: removed the protected
BROADCAST_CLOSE_SYSTEM_DIALOGSpermission from the library manifest so it is no longer propagated to consumer apps. - Android: made the legacy
ACTION_CLOSE_SYSTEM_DIALOGSpath best-effort andSecurityException-safe on Android 11 and lower. - Android: removed the
ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSdirect-request path from the Oppo/ColorOS power-manager fallback. - Android: removed package-visibility queries from the power-manager settings helpers; vendor settings now open best-effort without requiring consumer apps to inherit
<queries>declarations. - Android: cleaned up owned lint warnings after the permission, policy, package-visibility, discouraged API, and obsolete SDK guard fixes.
- iOS: made the notification display application-state check app-extension-safe so
RNNotifeeCorecan compile inside a Notification Service Extension target. - CLI/iOS: updated
init-nsePodfile patching to avoid an Xcode build cycle between an embeddedNotifyKitNSE.appexand React Native Firebase's[RNFB] Core Configurationphase.
- Docs: made reference generation self-contained by generating
src/version.tsbefore TypeDoc. - Docs: guarded reference generation against running without Git metadata, preventing degraded
Defined inlinks. - Docs: upgraded TypeDoc reference tooling for TypeScript 5.9 compatibility.
- Docs: included previously missing referenced API types in the generated reference:
ModuleWithStaticsandWebNotificationSettings. - Docs: formatted manual MDX documentation pages.
- Tests: added an iOS/NSE hardware automation script for
init-nse,pod install, RNFB cycle checks, iOS builds, FCM scenario sending, logs, reports, and cleanup. - Tests: validated Android hardware E2E, including foreground/background FCM, killed rerun without force-stop, tap
PRESS, action buttons, and BigPicture notifications. - Tests: validated iOS/NSE hardware E2E on physical device, including foreground/background/killed FCM, NSE processing, attachment handling, and tap flow.
- Smoke app: cleaned up Android manifest lint warnings for redundant labels and data extraction rules.
- React Native:
TimestampTrigger.repeatIntervalfor calendar-based custom repeat intervals on timestamp triggers. Timestamp triggers now support custom repeat intervals such as every 2 days, every 2 weeks, and every 3 months from the selected start timestamp. - React Native:
RepeatFrequency.MONTHLYfor monthly timestamp trigger recurrence. Yearly recurrence is not supported. - iOS: custom repeat intervals are implemented with a bounded rolling schedule of one-shot local notifications, with top-up when the app becomes active, when the user interacts with a notification, or when a rolling notification is delivered in foreground.
- iOS: removed the legacy
UILocalNotificationlaunch-options fallback from the initial-notification path. Supported iOS versions use the modernUNUserNotificationCenterDelegate/UNNotificationResponsepath for notification taps andgetInitialNotification(). - iOS: migrated deprecated SiriKit call intent identifiers to Apple's unified
INStartCallIntentIdentifier. The publicIOSIntentIdentifier.START_CALLshould be used for notification category intent identifiers. LegacySTART_AUDIO_CALLandSTART_VIDEO_CALLvalues remain accepted for compatibility, but now map to the unified call intent identifier.getNotificationCategories()can returnSTART_CALLwhen reading back call intent categories from iOS. - iOS: deprecated announcement and notification-summary options are now treated as compatibility no-ops on supported iOS versions. Explicit announcement authorization requests are no longer needed because announcement authorization is included by iOS on supported versions, while notification summary arguments are ignored by iOS 15+. The JS fields remain available for backward compatibility and are marked as deprecated in the TypeScript reference.
- iOS:
foregroundPresentationOptions.alertis now implemented with the modern banner/list presentation options on supported iOS versions instead of calling the deprecatedUNNotificationPresentationOptionAlert. The JS option remains available for backward compatibility. - iOS behavior change: repeating
TimestampTriggernotifications now use a bounded rolling schedule of one-shot local notifications instead of a native repeatingUNCalendarNotificationTrigger. This makes custom repeat intervals (repeatInterval) andRepeatFrequency.MONTHLYpossible, respects the selected start timestamp, and rebalances the rolling pending-notification budget across active series. Apps that relied on iOS native repeating calendar triggers being scheduled indefinitely should review the new iOS rolling-window behavior: the library keeps upcoming occurrences scheduled and tops them up when the app becomes active, when the user interacts with a notification, or when a rolling notification is delivered in foreground. iOS does not wake an app merely because a local notification was delivered while the app is killed or suspended, so the rolling window cannot be extended indefinitely unless the app runs again. - Android: timestamp trigger recurrence now advances by
repeatFrequency * repeatIntervalusing calendar-aware scheduling. Existing triggers withoutrepeatIntervalkeep the previous behavior with interval1. - Tooling:
yarn gen:referencenow formats generated reference docs with Prettier so repeated runs are idempotent. The smoke app also has a dedicated Jest setup for a lightweight import/render gate, with owned iOS build warnings cleaned up.
- iOS: rolling timestamp triggers now rebalance the bounded pending-notification window across all active rolling series. This prevents earlier recurring triggers from consuming the entire iOS pending budget and blocking later triggers such as
DAILY + repeatInterval: 2,WEEKLY + repeatInterval: 2, andMONTHLY + repeatInterval: 3from coexisting. - Android: cleaned up owned build/lint warnings by modernizing Gradle assignment syntax, replacing deprecated React Native activity access in the Kotlin bridge, adding an explicit action guard to
RebootBroadcastReceiver, usingLocale.ROOTfor resource-name normalization, and removing the invalid smoke-appFOREGROUND_SERVICE_SHORT_SERVICEpermission.
- Android:
RepeatFrequency.MONTHLYis supported with AlarmManager. It is not supported withalarmManager: false, because WorkManager uses duration-based intervals and does not provide calendar-month recurrence semantics. - iOS: custom repeat intervals cannot be extended indefinitely while the app remains killed/suspended and the user never interacts with notifications, because iOS does not wake the app merely when a local notification is delivered.
-
Android:
ResourceUtils.getFallbackSmallIconId(Context)— new public static helper that returns a resource ID guaranteed to be valid for a smallIcon. Three-layer fallback:applicationInfo.icon→applicationInfo.logo→android.R.drawable.ic_dialog_info. Never returns0, never throws, catches any exception and falls through to the system default. Reusable from any code path that needs an emergency icon. -
Tests:
ResourceUtilsFallbackIconTest— six Robolectric + Mockito unit tests covering each of the three fallback tiers, the exception-swallow branch, the null-context branch, and a "never returns 0" invariant guard across all five paths.NotificationAndroidModelSmallIconFallbackTest— three Robolectric unit tests covering thegetSmallIcon()return contract when thesmallIconkey is missing, unresolvable, or empty. -
Tests:
validateTrigger.test.tscases covering the three new small-timestamp error paths and a regression guard for the existing "must be in the future" message on valid-but-past epoch-ms values. -
Tests: new instrumented
RebootRecoveryTestcase covering the non-repeating future TIMESTAMP happy path (trigger withrepeatFrequency: -1andtimestamp > nowmust survive a simulated reboot with its fire time preserved and theAlarmManagerPendingIntent re-registered at the original timestamp). Complements existing coverage of past-stale non-repeating (within/beyond grace) and DAILY/WEEKLY repeating paths. -
Docs: new "Small icon not showing in Android release builds" subsection in the Troubleshooting section of both root
README.mdandpackages/react-native/README.md, documenting the three common causes (asset only insrc/debug/res/, R8 resource shrinking, naming mismatch) with recipes for each. New bullet in the "Behavior changes from upstream" section covering the fallback. New row in the "Bugs Fixed from Upstream Notifee" table referencing upstream invertase/notifee#733. -
Docs: New README subsection under "Quick Start > Handle events" clarifying iOS event-handler routing — tap from foreground fires
onForegroundEvent, tap from background/killed firesonBackgroundEvent(because iOS reportsUIApplication.applicationState == Inactiveat the moment of the tap delivery, notActive). Resolves the confusion reported in upstream invertase/notifee#1155. New Troubleshooting subsection "Silent pushes and background fetch — handled by Firebase, not by this library" clarifying that the library does not hookapplication:didReceiveRemoteNotification:fetchCompletionHandler:and that silent-push JS execution in killed state is Firebase's responsibility, referencing upstream invertase/notifee#597. New callout at the top ofdocs/fcm-mode.mdxpointing users hitting upstream invertase/notifee#1133 ("onBackgroundEvent not triggered on iOS for remote notifications") to FCM Mode as the end-to-end resolution. Added explicit iOS tap-routing note (foreground/background) todocs/react-native/events.mdx; added SEO cross-reference to upstream invertase/notifee#1155 in the existingdocs/react-native/ios/interaction.mdx#foreground-vs-background-routingsection. Applied identically to rootREADME.mdandpackages/react-native/README.md. Motivation: upstream repo archived April 7, 2026; README/npm/docs-site SEO is now the only discovery path for users still blocked by these upstream issues.
-
Android: Behavior change — when
android.smallIcondoes not resolve to a valid resource ID at runtime (asset only insrc/debug/res/, R8 resource shrinking, naming mismatch), the library now falls back to the app's launcher icon instead of lettingNotificationCompat.Builder.build()throwIllegalArgumentException: Invalid notification (no valid small icon). The resolution failure is logged at levelw(previouslyd, invisible in release logcat) with the original icon name, the three typical causes, and a pointer to the README Troubleshooting section. The log stays internal to logcat —LogEventis not propagated to the JS layer (pre-existing architectural choice, unchanged here). Addresses the fragile code path behind upstream invertase/notifee#733. -
Android: removed spurious
BOOT_COMPLETEDintent-filter fromNotificationAlarmReceiverinAndroidManifest.xml. The receiver does not handle boot — reboot recovery is owned exclusively byRebootBroadcastReceiver(already present and correct). The removed filter previously caused no-op wakeups on every device boot with a null-extras Intent that early-returned atNotificationAlarmReceiver.java:43. No behavior change for notification delivery. -
TypeScript:
validateTriggernow produces targeted error messages whentrigger.timestampis suspiciously small (< 1e12 ms). Three cases are distinguished: day-of-month values (1–31) suggestdate.getDate()usage, values in the 1e9–1e12 range suggest seconds since epoch instead of milliseconds, and other small values produce a generic "too small" message. All three messages recommendDate.now()ordate.getTime(). Addresses upstream invertase/notifee#872. Previously these cases all emitted the generic "'trigger.timestamp' date must be in the future." which did not help users diagnose the root cause — a confusion between.getDate()/ seconds / milliseconds. -
Docs: Linked upstream Notifee issues #1079, #1226, and #1262 to the existing 9.2.0 architectural fix entry in the "Bugs Fixed from Upstream Notifee" table (previously marked
N/A (architectural)). All three are the same root cause — the pre-compiled AAR distributed via a bundled Maven repo atnode_modules/@notifee/react-native/android/libs/— and are all resolved by the single-module compile-from-source architecture introduced in 9.2.0. Added a new Troubleshooting subsection#### `Could not resolve app.notifee:core:+` — does not apply to this forkto capture direct Google searches for the error string. Applied identically to the rootREADME.mdandpackages/react-native/README.md. Motivation: the upstream repo was archived on April 7, 2026 and issue commenting is no longer possible, so README/npm SEO is now the only discovery path for users still blocked by these issues. -
Docs: Added two rows to the "Bugs Fixed from Upstream Notifee" table in both
README.mdandpackages/react-native/README.mdlinking upstream issues invertase/notifee#601, #1063, and #991 to the fork releases that resolved them (9.1.12 + 9.1.14 + 9.5.0 + 9.6.0 cumulative). Updated the "33 upstream bugs fixed" header counter to 35. Motivation: the upstream repo was archived on April 7, 2026, so README/npm SEO is now the only discovery path for users googling these issues.
- FCM Mode: end-to-end Firebase Cloud Messaging integration — a data-only Android payload plus an iOS alert + Notification Service Extension payload, built from a single server call. Introduces
notifee.handleFcmMessage(remoteMessage)(one-liner client handler),notifee.setFcmConfig(config)(optional startup config withdefaultChannelId,defaultPressAction,fallbackBehavior, andios.suppressForegroundBanner). See the FCM Mode guide for the full architecture. - Server SDK: new
react-native-notify-kit/serversubpath export — a zero-runtime-dependency Node.js / Firebase Cloud Functions helper that builds FCM HTTP v1 message payloads. Public API:buildNotifyKitPayload,buildIosApnsPayload,buildAndroidPayload,serializeNotifeeOptions. 100% unit-test coverage. - CLI
init-nse:npx react-native-notify-kit init-nsescaffolds an iOS Notification Service Extension target, patching.pbxprojandPodfileautomatically. Ships in the main package — no extra install. Supports--dry-run,--force,--target-name,--ios-path,--bundle-suffix. Atomic writes with rollback on failure. - Package exports:
packages/react-native/package.jsonnow declares a formalexportsmap. Public entries:.,./server,./jest-mock,./react-native.config.js,./package.json. - Docs: new docs/fcm-mode.mdx — comprehensive FCM Mode guide covering architecture, server SDK reference, client API reference, iOS NSE setup, Android specifics, payload schema, migration from the manual pattern, troubleshooting, and known limitations.
- Client:
handleFcmMessagefilters out iOS attachments with missing/emptyurlinstead of propagating to the validator. - Client:
reconstructNotificationemits aconsole.warnwhen a recognized Android style type (BIG_TEXT/BIG_PICTURE) is present but the required sub-field is missing. - Client:
setFcmConfigandhandleFcmMessagedeep-copy the nestediossub-object, preventing caller mutation. - CLI: Podfile patching rolls back atomically when it cannot locate the app target's closing
end. - CLI:
--bundle-suffixis validated against/^\.[A-Za-z0-9\-.]+$/. - CLI: bundle-ID detection is scoped to the app target's own
buildConfigurationList, not all targets globally. - CLI:
$(PRODUCT_NAME)/$(TARGET_NAME)variables are expanded when deriving the NSE bundle ID. - CLI: RNFB-style
INFOPLIST_FILEinput path is stripped from the host target after adding the NSE to avoid an Xcode build cycle. - CLI: Swift NSE template uses the correct
with:selector label when callingNotifeeExtensionHelper.populateNotificationContent. - iOS:
RNNotifeeCore.podspecdeclaresDEFINES_MODULE = YESso the NSE target canimport RNNotifeeCoreas a Swift module.
- android:
getDisplayedNotifications()now exposes custom keys fromNotification.extrasas a top-leveldatafield on the result, matching iOS behavior. Reserved keys (android.*,google.*,gcm.*,fcm.*,notifee*, plusfrom,collapse_key,message_type,message_id,aps,fcm_options) are filtered out. Note: this cannot surface customdatafor FCM-auto-displayed push notifications because FCM routes those fields exclusively to the tap-actionPendingIntent— use data-only messages andnotifee.displayNotification()for full control on Android. (upstream: invertase/notifee#393) - tests:
GetDisplayedNotificationsDataTest— 17 Robolectric tests covering the denylist filter, prefix precision, non-string value coercion, andfcm_optionsexact-match parity.
- android: fixed
ObjectAlreadyConsumedException: Map already consumedcrash inHeadlessTask.TaskConfigwhen the sameWritableMapinstance is reused across headless events.TaskConfig.initnow copies the map before mutating it. (upstream: invertase/notifee#266) - android:
RebootBroadcastReceiver,NotificationAlarmReceiver, andAlarmPermissionBroadcastReceivernow wrap their synchronous section in a try/catch/finally soPendingResult.finish()is always called, even when a failure occurs before the async callback is registered. (upstream: invertase/notifee#734) - android: stale non-repeating trigger notifications (timestamp in the past at reboot time) no longer become "zombie" alarms that re-fire on every reboot. Within a 24-hour grace period the trigger fires once and the Room row is deleted; beyond the grace period the row is deleted silently. (upstream: invertase/notifee#734)
- android: cold-start self-healing for scheduled alarms on OEM devices that suppress
BOOT_COMPLETED(Xiaomi MIUI, Oppo ColorOS, Huawei EMUI, Vivo FuntouchOS).InitProviderreadsSettings.Global.BOOT_COUNTon every app init and triggers a full alarm reschedule when a boot delta is detected. A process-wideAtomicBooleanrace guard prevents double-advancement when bothBOOT_COMPLETEDand the cold-start path race. (upstream: invertase/notifee#734) - android: regression tests for DAILY/WEEKLY/HOURLY trigger rescheduling, including DST spring-forward and fall-back edge cases. (upstream: invertase/notifee#839, #875)
- tooling:
scripts/smoke-test-734.sh— composable manual smoke-test harness for #734 covering build, Room DB dump, BOOT_COUNT reads, logcat capture, reboot, state wipe, and the destructiveRebootRecoveryTestsuite (gated behind--i-know). - docs: new "OEM Background Restrictions" and expanded "Foreground Service Setup (Android 14+)" sections in the READMEs, plus a new "AlarmType guide" covering
AlarmType.SET_ALARM_CLOCK— the strongest reliability guarantee Android exposes for a scheduled notification. (upstream: invertase/notifee#410, #655)
- android: resolved upstream issue invertase/notifee#549 —
cancelTriggerNotifications()andcreateTriggerNotification()JS Promises resolved before the underlying Room database write completed, causing a race where a cancel-then-create pattern could leave inconsistent state. All fiveWorkDataRepositorymutation methods now returnListenableFuture<Void>and are chained into the outer future at every call site. Empirical reproduction rate before fix: ~3.3% per attempt, <50 ms window. Post-fix: 0 inconsistencies across 150 attempts. - android: fixed a reboot-recovery data-loss bug surfaced by the read-only caller audit.
NotifeeAlarmManager.rescheduleNotification(invoked onBOOT_COMPLETED) fire-and-forgot theWorkDataRepository.update(...)that persists the next-fire timestamp for each recurring alarm. If Android killed the receiver's process before Room drained, the updated anchors were lost and the next reboot rescheduled from stale timestamps. The receiver now collects all per-entity update futures, combines them withFutures.allAsList, waits with an 8-secondFutures.withTimeoutANR safety net, then callspendingResult.finish(). - android: fixed an ordering bug in
NotificationManager.doScheduledWorkwherecompleter.set(Result.success())was called before the one-time trigger row was deleted from Room. The delete future now completes first. - android:
NotifeeAlarmManager.displayScheduledNotificationnow awaits the Room update / delete before callingBroadcastReceiver.PendingResult.finish(). - android:
WorkDataRepository.insertTriggerNotification(...)helper cleanup — explicitContextparameter, removing a fragile dependency onNotifeeInitProviderhaving populated the singleton before the first trigger creation.
- android: BEHAVIOR CHANGE — errors from
WorkDataRepositorymutations (e.g.SQLiteFullException, SQLite corruption, schema migration failures) now propagate as rejections on the JS Promises forcancelTriggerNotifications,cancelTriggerNotification,createTriggerNotification, andcancelAllNotifications(ids). Previously these exceptions were silently swallowed. - android: LATENCY CHANGE —
cancelTriggerNotifications()andcreateTriggerNotification()Promises now resolve only after the Room write has completed. On a warm database this adds roughly 5–15 ms on a Pixel 9 Pro XL.
- android:
WorkDataRepositoryFutureContractTest— JVM unit test (Mockito +CountDownLatch) verifying all five mutation methods return non-null futures that only complete after the underlying DAO call has returned. 13 tests. - android:
WorkDataRepositoryRaceTest— instrumented test underandroidTest/with 100-iteration race scenarios. Not wired into CI yet; run manually via./gradlew :react-native-notify-kit:connectedDebugAndroidTest. - tooling:
scripts/verify-549-fix.sh— automated 5-run harness verification script that writespost-fix-549-verification.mdwith a strict PASS/FAIL verdict. - tooling:
TriggerRaceTestScreen.tsxharness emits one compact JSON line per scenario plus a-DONEterminator.
- android: foreground service notifications on Android 12+ (API 31+) were subject to a system-imposed display delay of up to 10 seconds because the library never called
setForegroundServiceBehavior(FOREGROUND_SERVICE_IMMEDIATE). This is now set by default whenasForegroundService: true. Opt out viaforegroundServiceBehavior: AndroidForegroundServiceBehavior.DEFERRED. (upstream: invertase/notifee#272, invertase/notifee#1242) - android: ANR-proofed the foreground service STOP path. When a
ForegroundServiceinstance receives a STOP intent withoutstartForeground()having been called, the service now emits a minimal placeholder viastartForeground()beforestopSelf(), preventingForegroundServiceDidNotStartInTimeException. The placeholder is immediately torn down and not visible to the user. - android: reset stale
mCurrentNotification,mCurrentHashCode, andmCurrentForegroundServiceTypeon the foreground service NONE early return path (API 34+). - android: empty
foregroundServiceTypesarrays that bypass the TypeScript validator (e.g. trigger notifications restored from the Room database after a library upgrade) are now treated as absent at the native layer. - android:
ForegroundServicedefensive STOP path fails fast with a clear error message and documentation URL when the consumer's manifest is missing requiredforegroundServiceTypedeclarations on API 34+. - android:
ForegroundServiceNONE early return path honors Android's 5-secondstartForeground()contract via the same tracked-boolean defensive pattern as the STOP path. - android:
ForegroundService.stop()now logs a warning viaLogger.wwhenstartService()throwsIllegalStateExceptionand falls back tostopService(). - android:
getLights()andcancelAllNotificationsWithIds()preserve exception stack traces in their error logs. - typescript: numeric enum validators now correctly reject reverse-mapped string keys across all numeric enum types (
AndroidBadgeIconType,AndroidDefaults,AndroidFlags,AndroidGroupAlertBehavior,AndroidImportance,AndroidVisibility,AndroidForegroundServiceType,AndroidForegroundServiceBehavior,RepeatFrequency,AlarmType). Previously, strings likeimportance: "HIGH"passed validation but were silently ignored byBundle.getInt(). - tests:
setPlatformtest helper no longer fails silently on repeated calls within a single test block. - ios:
didReceiveNotificationResponse:withCompletionHandler:now calls the completion handler immediately after emitting the PRESS/ACTION_PRESS event, instead of delaying it by 15 seconds viadispatch_after. - ios:
requestPermission:propagates theNSErrorfromrequestAuthorizationWithOptions:completionHandler:to the JS promise. Previously the error was silently swallowed. - ios:
displayNotification:andcreateTriggerNotification:now capture and log errors fromcontentByUpdatingWithProvider:error:. On failure, the notification is displayed with the original content rather than potentially nil content. - ios:
getBadgeCount:calls the completion block with(nil, 0)when running in an app extension, preventing the JS promise from hanging. - ios: fixed a race in
NotifeeCoreDelegateHolder.didReceiveNotifeeCoreEvent:where a notification event could be silently dropped when the weak delegate reference was zeroed while thedelegateRespondsTobitfield still indicated it was available. Locked path now checks the resolved delegate for nil and falls back to buffering. - ios: added
@synchronized(self)guards around all access tohasListenersandpendingCoreEventsinNotifeeApiModule.mm. - ios: replaced placeholder
// update me with logiccomment on the emptymessaging_didReceiveRemoteNotification:handler with documentation explaining the intent. - ios: Notification Service Extension attachment downloads now cap the
NSURLSessionrequest and resource timeouts at 25 seconds, leaving a 5-second margin before the NSE budget expires.
- android: new
AndroidForegroundServiceBehaviorenum (DEFAULT,IMMEDIATE,DEFERRED) andforegroundServiceBehaviorproperty onNotificationAndroid. - android:
android.os.Traceinstrumentation on the foreground service notification path — custom trace sections visible in Perfetto traces. - android:
notifee.prewarmForegroundService()opt-in API for manual warmup control. Idempotent, safe to call multiple times. Resolves immediately as a no-op on iOS. - android: Baseline Profile shipped in the library AAR covering the foreground service notification cold-start path. AGP 8.3+ merges it automatically.
- android:
InitProvidernow pre-loads critical foreground service classes and pre-warms theINotificationManagerBinder proxy on a low-priority background thread during app startup. Opt out via<meta-data android:name="notifee_init_warmup_enabled" android:value="false" />. - android:
androidx.profileinstaller:profileinstaller:1.4.1is now a transitive (api) dependency of the library.
- android:
pressActionnow defaults to{ id: 'default', launchActivity: 'default' }when omitted. Previously, notifications without an explicitpressActiondisplayed correctly but tapping them did nothing. Apps that want a non-tappable notification can passpressAction: nullexplicitly. Implemented via a reserved sentinel id (__NOTIFEE_OPT_OUT__) at the TS→native boundary. - ios: BEHAVIOR CHANGE —
EventType.DELIVEREDis now emitted toonForegroundEventfor all Notifee-owned notifications displayed in foreground, not just trigger notifications. Previously thewillPresentNotification:guard suppressed DELIVERED for immediate-display notifications. Android already behaved this way, so this also closes a long-standing iOS/Android asymmetry. DELIVERED emission indisplayNotification:withBlock:is now gated to non-foreground states. Known limitation: trigger notifications firing in background/killed still do not emit DELIVERED on iOS (platform limitation).
- android: fixed
NotificationManager.displayNotification()producing a tap-less PendingIntent whenpressActionis absent from the notification bundle. Native path now synthesizes the default press action bundle. - ios: fixed potential loss of notification events at cold start when the RN bridge takes longer than 1 second to initialize. Replaced
dispatch_after(1 sec) + dispatch_oncewith an event-driven synchronous flush triggered whensetDelegate:installs a valid delegate. - ios: corrected error message in
validateIOSPermissionsfor thebadgefield (was'alert' badge a boolean value.).
- Removed unused
.buckconfig(Buck no longer used by RN since 0.74). - Removed unused
.flowconfig(project is TypeScript-only). - android: removed unused EventBus annotation processor and
eventBusIndexbuild option.
- ios: PRESS events from notification taps while the app was in background were incorrectly routed to
onForegroundEventinstead ofonBackgroundEvent. Three issues were addressed: a leftoverdispatch_after(1 second)from the TurboModule migration (9.1.0), an incorrect== UIApplicationStateBackgroundcheck (iOS reportsInactiveat the moment of tap — changed to!= UIApplicationStateActive), and a main-thread violation whereapplicationStatewas being read on a background thread. (#5)
- android: internal architecture change — collapsed the standalone NotifeeCore AAR into the React Native bridge as a single Android library module. The bundled local Maven repo at
packages/react-native/android/libs/and the frozen coordinateapp.notifee:core:202108261754are gone. Core Java sources now live atpackages/react-native/android/src/main/java/app/notifee/core/and are compiled from source. No public API changes. Migration from 9.1.x requires zero code changes.
- android:
FAIL_ON_PROJECT_REPOSrejection on React Native 0.74+. The library no longer injects a Maven repository into the consumer'srootProject.allprojects. - android: stale Gradle cache serving outdated bytecode after
yarn upgrade. With the frozen Maven coordinate gone, the bytecode is rebuilt from source on every consumer build.
- ios: fixed duplicate symbols linker error when using Notification Service Extension (
$NotifeeExtension = true) with static frameworks (use_frameworks! :linkage => :static). Addeds.exclude_filesin the$NotifeeExtensionbranch ofRNNotifee.podspecsoNotifeeExtensionHelper.{h,m}is compiled only byRNNotifeeCore.
- Updated README (root and npm) to reflect upstream archival: the original
invertase/notifeerepository was officially archived on April 7, 2026, and its README now recommendsreact-native-notify-kitas a community-maintained drop-in replacement.
- ios:
willPresentNotification:fallback no longer silently drops foreground notifications when no originalUNUserNotificationCenterDelegatewas captured. Previously the fallback path calledcompletionHandler(UNNotificationPresentationOptionNone), which told iOS to display nothing. It now returns the platform default presentation options (banner, sound, list, badge on iOS 14+). Affects apps usingreact-native-notify-kitwithout a library that also sets aUNUserNotificationCenterdelegate — e.g. apps without@react-native-firebase/messaging, or apps using a different push provider. Apps using RN Firebase are unaffected. - ios: resolved upstream issue invertase/notifee#828 — "All notifications are dismissed when the app is opened". Verified on a real device with four FCM pushes sent in sequence; all four remained after app tap and backgrounding.
- android:
pressAction.launchActivitynow defaults to'default'at the native layer whenpressAction.id === 'default'andlaunchActivityis not explicitly set. Closes a gap where native code paths bypassing the JS validator (trigger notifications restored from Room after reboot, headless tasks, future bridge changes) could reach native withlaunchActivityunset. No user-facing behavior change for apps using the standard JS API. - android: fixed a pre-existing upstream bug in
NotificationPendingIntentwhere String comparisons on line 155-157 used!=(reference equality) instead of.equals(). Dormant before this release because the null guard above always short-circuited — surfaced by the new native-layer default forlaunchActivity.
-
android: fixed
AbstractMethodErroronRoomDatabase.createOpenHelperwhen consumer apps resolvedandroidx.room:room-runtime< 2.6.0. Root cause: the core AAR's Maven POM was empty (published via rawartifact()instead offrom(components.release)), so Room and all other core dependencies were invisible to Gradle dependency resolution. The fix:- Core AAR publishes a proper POM via
from(components.release)withandroid.publishing.singleVariant("release"), exposing Room 2.8.4 and all runtime dependencies. - React Native bridge module declares
room-runtime:2.8.4,sqlite:2.6.2, andsqlite-framework:2.6.2asapidependencies. - Fixed
frescoincorrectly scoped asapiin corebuild.gradle— changed toimplementation. - Aligned
guava(33.3.1 → 33.5.0) andwork-runtime(2.8.0 → 2.11.1) versions between core and bridge.
Note for consumers with custom dependency pinning: the core AAR POM now exposes its runtime dependencies. If you have
resolutionStrategy.forceorstrictlyconstraints on any of these, verify compatibility after upgrading. - Core AAR publishes a proper POM via
- Softened tone in "Why this fork" README section.
- Added Trademark Notice section to README.
- Synced npm README with changelog formatting updates.
- android: update Room 2.5.0 → 2.8.4, WorkManager 2.8.0 → 2.11.1, Guava 33.3.1 → 33.5.0.
- android: cleaned up ProGuard rules — removed redundant entries, consolidated keep rules, suppressed pre-existing build warnings with targeted
@SuppressWarningsannotations. - android: fixed raw
Classtype usage inNotificationManager(nowClass<?>). - ios: align NotifeeCore Xcode project deployment target from iOS 10.0 to iOS 15.1, matching the podspec.
- android: fixed ProGuard keep rules using
{ <init>(...); }(constructor-only) instead of{ *; }(all members) — classes annotated with@Keepor@KeepForSdkcould have non-constructor members stripped by R8. - android: fixed WakeLock leak in
PowerManagerUtils.lightUpScreenIfNeeded—acquire()without timeout orrelease()prevented the device from sleeping; now usesacquire(3000L). - android: fixed potential NPE in
NotificationAndroidModel.getDefaultswhen thedefaultsarray is present but empty. - android: added
-keeppackagenames app.notifee.core.**to ProGuard rules to prevent-repackageclassesfrom relocatingInitProviderand sub-package classes. - android: fixed missing
returnafter null context check inIntentUtils.startActivityOnUiThread.
- android:
ongoingnow defaults totruewhenasForegroundService: trueandongoingis not explicitly set. Prevents foreground service notifications from being dismissed on Android 13, matching pre-Android 13 behavior. (upstream: invertase/notifee#1248) - android: on Android 14+, foreground service notifications are automatically re-posted when dismissed by the user. Android 14 ignores
FLAG_ONGOING_EVENTfor most foreground service types (exceptmediaPlayback,phoneCall, and enterprise DPC); the library detects the dismissal and immediately re-displays the notification. (upstream: invertase/notifee#1248)
- android: fixed DST (daylight saving time) shifting repeating notifications by ±1 hour — replaced fixed-millisecond arithmetic with
Calendar.add(). (upstream: invertase/notifee#875) - android: fixed repeating trigger timestamp not persisted to database after recalculation — after reboot, notifications could fire at stale times.
- android: BREAKING — removed hardcoded
foregroundServiceType="shortService"from the library'sAndroidManifest.xml. Apps usingasForegroundService: trueon Android 14+ must now declare their ownforegroundServiceTypeonapp.notifee.core.ForegroundServicein their app manifest. See the "Foreground Service Setup" section in the README for migration instructions. (upstream: invertase/notifee#1108)
- android: implemented
onTimeout(int)(API 34) andonTimeout(int, int)(API 35+) inForegroundServiceto gracefully stop the service when Android's foreground service timeout fires. Previously the missing handler caused an ANR crash when usingshortService. (upstream: invertase/notifee#703) - android: added early abort with clear error logging when
foregroundServiceTypeis not declared on Android 14+, preventing Android's crypticMissingForegroundServiceTypeExceptioncrash. - android: fixed bitwise
&used instead of logical&&inForegroundService.onStartCommand()null check. - android: replaced deprecated
stopForeground(boolean)withstopForeground(STOP_FOREGROUND_REMOVE)on API 33+ via compat helper. - android: added
synchronizedblocks aroundForegroundServicestatic field cleanup to prevent races between the STOP handler, headless task completion callback, andonTimeout()paths. - android:
ForegroundService.onTimeout()now emits aTYPE_FG_TIMEOUT(9) event viaEventBuswith the notification data,startId, andfgsType— previously the service died silently with no event reaching JS.
- android: changed default AlarmType from
SET_EXACTtoSET_EXACT_AND_ALLOW_WHILE_IDLEfor better Doze mode compatibility. (upstream: invertase/notifee#961) - android: AlarmManager is now the default backend for trigger notifications instead of WorkManager, ensuring reliable delivery when the app is killed. Developers can opt out with
alarmManager: falsein the trigger config. (upstream: invertase/notifee#961)
- fixed
getNotificationSettings()returningDENIEDinstead ofNOT_DETERMINEDon Android 13+ before the user has responded to thePOST_NOTIFICATIONSpermission dialog — now usesSharedPreferencesto track whetherrequestPermission()has been called. (upstream: invertase/notifee#1237) - fixed trigger notifications not firing on Android 14-15 when app is killed — added
goAsync()toNotificationAlarmReceiver,RebootBroadcastReceiver, andAlarmPermissionBroadcastReceiver. (upstream: invertase/notifee#1100) - fixed
ContextHoldernot initialized inNotificationAlarmReceiver, causing potentialNullPointerExceptionon OEM Android 14+ implementations. - fixed
SCHEDULE_EXACT_ALARMpermission denial silently dropping scheduled alarms — now falls back to inexact alarm viasetAndAllowWhileIdlewith a warning log. - added
SecurityExceptioncatch aroundAlarmManagerscheduling — if exact alarm permission is revoked between check and call, falls back to inexact alarm instead of crashing. - fixed potential NPE in alarm scheduling when
PendingIntentcreation fails. - fixed
getInitialNotification()returningnullwhen notification has nopressActionconfigured —InitialNotificationEventsticky event is now posted regardless. (upstream: invertase/notifee#1128) - added event buffering in
NotifeeReactUtilsto prevent foreground press events from being silently dropped when the React instance is not yet ready. (upstream: invertase/notifee#1279) - fixed
AlarmType.SETusingRTCinstead ofRTC_WAKEUP, which prevented the device from waking to show the notification. (upstream: invertase/notifee#961)
- fixed
getInitialNotification()returningnullon cold start due to deprecatedUIApplicationLaunchOptionsLocalNotificationKeycheck. (upstream: invertase/notifee#1128) - added
setNotificationConfig({ ios: { handleRemoteNotifications: false } })opt-out flag to prevent Notifee from intercepting remote notification tap handlers — restoresonNotificationOpenedApp()andgetInitialNotification()for React Native Firebase Messaging. (upstream: invertase/notifee#912) - fixed
completionHandlernot being called on notification dismiss path indidReceiveNotificationResponse:, preventing potential handler leaks. - fixed
completionHandlernot being called inwillPresentNotification:fallback path when no original delegate is available. - added missing
returnafter forwarding to_originalDelegateindidReceiveNotificationResponse:.
- fixed Maven metadata checksums for published Android artifacts.
- added compatibility section to README documenting supported React Native versions.
- fixed Maven metadata checksums for published Android artifacts.
- aligned package LICENSE with root repository LICENSE.
- Renamed package from
@notifee/react-nativetoreact-native-notify-kitacross all source, configs, and documentation. - android: replaced deprecated Kotlin APIs with current equivalents —
currentActivity→getCurrentActivity(),TurboReactPackage→BaseReactPackage,hasActiveCatalystInstance()→hasActiveReactInstance(). - Moved Jest tests from
tests_react_native/intopackages/react-native/__tests__/. - Renamed
tests_react_native_new/toapps/smoke/. - Simplified GitHub Actions CI by removing stale workflows.
- Removed
--provenanceflag frompublishConfigto allow localnpm publish. - Excluded test files from root
tsconfig.jsonand fixed lint formatting.
- Removed
notifee_platform_interfacepackage and its associated tests and dependencies (Flutter support dropped).
Initial fork release targeting React Native 0.84 with TurboModule (JSI) architecture.
- android: migrated React Native bridge from legacy NativeModule to Kotlin TurboModule with JSI bindings.
- ios: migrated React Native bridge from legacy NativeModule to TurboModule with JSI bindings.
- Added React Native 0.84 smoke-test app with updated Jest configuration.
9.1.8 (2024-12-20)
- android: prevent headless task double-invocation (a799167)
9.1.7 (2024-12-17)
- ios: copy iOS NotifeeCore library more carefully during build (68f230f)
9.1.6 (2024-12-17)
- android: remove semantic-release test commit (0b4ecdf)
9.1.5 (2024-12-17)
- android: semantic-release test commit (cf5c7a9)
- fix(android): fix another new architecture issue via elimination of race condition between headlessJS task and react-native background startup that resulted in null ReactContext (#1176)
- fix(android): preserve new-arch classnames used in backwards-compat logic (#1149 special credit to @mbpictures)
This fixes Notifee when used in react-native 0.76 in new architecture + release mode when used in an android background headlessJS context
This the minimum version that supports upcoming react-native 0.76 by default.
Older notifee versions will only work if you disable disable New Architecture / disable bridgless mode
- fix(android): forward-port getReactContext to new arch bridgeless mode (#1127 Thanks @Eclipses-Saros!)
- fix(jest): add missing createChannels method to official mock definitions (#1123)
- docs(android): clarify foregroundServiceType AndroidManifest example
- fix(android): add guava transitive dep to module deps (#1116)
Notifee no longer uses the GMS libraries and thus should be compatible with open source distribution channels like F-Droid now. Thanks @meypod!
- feat(android): Remove all gms usages and use guava instead (#510)
- test(ci, ios): simplify simulator / app interaction
- test(ci, ios): try more powerful runner, possible de-flake
- test(ci, ios): allow more time for e2e test
- fix(ios): use new icon badge APIs / correctly clear badge
- test(ci): use current path to ccache
- test(ci, ios): increase yarn install timeout to stop flakes
- test(ios): commit current pod lockfile
- style(lint, ios): fix various lint warnings
- style(lint): clean up warnings from
yarn validate:all:js - test(ci): use iPhone 16 now, 15 does not exist for Xcode 16
- test(ci): use hashFiles with specific paths vs globs
- docs: fix typo "AlarmManger" to "AlarmManager" (#1101)
- fix(android): rn74 compatibility support invalidate alongside deprecated onCatalystInstanceDestroy
improperly released, 9.0.2 released immediately after
BREAKING CHANGES!
Android 14+ requires two changes to avoid crashes or Play Store rejection
-
The USE_FULL_SCREEN_INTENT permission is not longer included by default as most apps do not need it. If you need it you must now manually add the permission to AndroidManifest.xml
-
Foreground Service Types are a strict requirement for Android 14 and require Play Store approval. You must use compileSdk 34 or higher for this release. If you need foreground service types you will need to specify the exact foreground service type permissions in your AndroidManifest.xml and you must replace the service definition in AndroidManifest.xml and you must use the new optional foregroundServiceTypes parameter in the foreground service API call
Thanks to all the contributors that proposed these fixes so that Notifee continues to work well on Android 14 - handling the platform security changes as Google makes new releases is not easy, and they always change the Nofitication API surface API. Notifee would not work without the community contributions.
Note, v8.0.0 was published 2 years ago as an alpha on npmjs.com but is unused. However, the version number was consumed by that alpha publish so we have skipped to v9.
- fix(android)!: Remove USE_FULL_SCREEN_INTENT permission from package manifest for Android 14 compat (#1027)
- feat(android)!: allow adding foreground service types dynamically
- feat(android): add Android 15 FOREGROUND_SERVICE_TYPE_MEDIA_PROCESSING
- fix(types): add cancelAllNotifications optional android tag property (#1087)
- build(android): minimal set of changes for compileSdk 34
- test(lint): check native code formatting in CI
- style(lint): result of auto-formatting
yarn format:all - style(lint): constrain formatting globs, add formatting check run scripts
- docs(android): note apps must now manually add USE_FULL_SCREEN_INTENT if needed
Unreleased
alpha publish from 2022, never made non-alpha, never in use, but version number consumed
- feat: group support to communication push #1017
- fix(iOS): Allow the original delegate to handle non-Notifee notifications first #985
- fix: Remove EventSubcriptionVendor type usage as it's removed in RN0.73 #1001
- fix(android): fix an issue when using inexact alarms #981
- style(lint): fix lint errors from previous commits #1073 q- test(ci, ios): ios build behaving strangely - tune timeouts
- test(example): minimum changes to get example working
- test(ci): remove log compression pre-artifact upload
- test(ci): use codecov action vs bash uploader
- test(ci, ios): switch to macos-14 / apple silicon, iPhone 14
- test(ci, android): use ubuntu+nested-virt+reactive-circus for emulator tests
- test(ci): forward port from GITHUB_OUTPUT vs set-output
- test(ci): bump actions to current versions
- test(ci): use github built-in concurrency controls
- style(lint): ignore pubspec.lock files when looking for changes
- test(android): two alarm manager tests hanging
- build(deps, ios): Podfile.lock version bumps in test app
- build(deps): yarn includes information about itself in package.json
- docs(CONTRIBUTING): auto tag for gh release, point to repo for changelog
- Fix packaging error / missing
dist/version.js#934
- [Android]: Fix compatibility with android-gradle-plugin 8 (reat-native 0.73+) #907
- Dev and Test: lots of CI and test updates so all checks are green again and current versions of developer tools work while developing in the repository
- [Android]: Adds the ability to create all types of alarms with Android, affects the
TimestampTriggerAlarmManagerAPI type and deprecates propertyallowWhileIdle(Addresses issue #655))). - [iOS]: Fixes an issue where the UI thread was getting blocked when creating a notification with attachments (Fixes #234))).
- [Android/iOS]: BREAKING CHANGE: For Expo, there is no config plugin anymore, please remove the plugin from
app.config.js(See issue #799 for more info).
- [iOS]: Adds image caching for the avatar for Communication Notifications (PR #742))).
- [Android]: Fixes an issue with foreground
PRESSevent being treated as a background event (Fixes #621). - [Android]: Fixes an issue where the event details of a notification were incorrect and were from another notification (Fixes #637 and #651).
- No changes, used to force
npmregistry to update for the previous version to appear.
- [Android]: Fixes an issue with interval triggers firing immediately (Fixes #696).
- [Android]: Fixes an issue with progress notification with
indeterminateset totrue(Fixes #682). - [Android]: Android flag
Flag_NO_CLEARis now supported but can get the same behaviour withongoingset totrue(Fixes #674). - [Android/iOS]: Fixes a ts error with latest React Native version 0.71+ (Fixes #708).
- [Android]: Fixes an issue where if
autoCancelis set tofalse, for Android actions this was ignored for Android 12 and above (Fixes #697). - [Android]: Remove unused android dependenecy
okhttp3which was reported to have been causing a problem (Fixes #699).
- [Android]: Updates the Android EventBus dependency to comply with the Google Play Store requirements (Fixes #668).
- [Android]: Fixes an issue when setting a custom launchActivity to ensure the correct activity is launched when a notification is pressed when app is closed (Fixes #646).
- [Android]: Fixes an issue with Android
lightswhen parsing colors as strings for trigger notifications (Fixes #618). - [Android]: Fixes an issue with jest mock where some mocks were not returning the correct type (Fixes #636).
- [Android]: Adds a new
TYPE_FG_ALREADY_EXISTevent type for foreground services (PR #634). - [iOS]: Removes a debug console.log statement that was commited to the main branch (PR #617).
- [Android]: Fixes an issue for Android 11 and lower to ensure notification drawer is closed when a quick action is pressed. (Fixes #614).
- [Android]: Fixes an issue where the initial notification was not set if the app opened via a quick action (PR #605).
- [Android]: Fixes an issue for Android 12 with quick actions when the app is in the background (Fixes #404).
- [Android]: Prevents a NullPointerException to occur when a background service is triggered (Fixes #592).
- [iOS]: Supports communication notifications on iOS (PR #526).
- [Android]: Fixes an issue when calling requestPermissions for Android 12 or lower (Fixes #555).
- [Android]: Fixes an issue that was introduced in v6.0.0 to support targetSdkVersion 33 (Fixes #547).
- [Android]: Fixes an issue that was introduced in v6.0.0 (Fixes #528).
-
[iOS]: BREAKING CHANGE: Notifee now handles response events (PRESSED, ACTION_PRESSED, DISMISSED) for remote notifications on iOS (PR #236).
- This allows quick actions from remote notifications to be supported without the need of a NSE [Learn More]
onNotificationOpenedAppandgetInitialNotificationfromRNFB Messagingwill no longer trigger as notifee will handle the event. Should not require any code changes to theseRNFBevent handlers, as events on Android will continue to work as normal
- [Android] BREAKING CHANGE: Added support for requesting permission on Android 13 via
requestPermission, the minimum compileSdkVersion required has increased to 33. And, to support this feature, the targetSdkVersion must also be increased to 33.
- [iOS]: Adds new
interruptionLevelproperty toNotificationIOSwhich provides the option to display time-sensitive notifications (Fixes #287).
- [Android]: Adds new
loopSoundandflagsproperties toNotificationAndroidto support custom flags and to loop the sound when a push notification is displayed (Fixes #454).
- [Android]: Fixes a compile issue for monorepos where sometimes
app.notifee:core:+cannot be found (Fixes #350). - [iOS]: Adds new
listandbanneroptions toIOSForegroundPresentationOptionson iOS. These new options should be used as a replacement for thealertoption which is now deprecated in notifee; notifee will fallback to using Apple'sUNNotificationPresentationOptionAlertoption for iOS 13 when eitherbannerorlistis set to true. There are no breaking changes, but we encourage you to update your project as soon as you can if you set customIOSForegroundPresentationOptions. To learn more, view the Foreground Notifications documentation (Enhancement #382).
- [Android]: Fixes an issue when creating a one-time trigger notifications with AlarmManager (Fixes #445).
- [Android]: Fixes an issue when recreating the trigger notifications after a reboot with AlarmManager (Fixes #422).
- [Android]: Fixes an issue around displaying a heads-up notification on Xiaomi devices by adding the permission
ACCESS_NOTIFICATION_POLICYto theAndroidManifest(Fixes #296).
- [Android]: Elimates the need to add the local maven repository manually to your project (PR #414).
- [Android]: Implements support to light up the screen when a notification is displayed. Introduces a new property
lightUpScreenon theNotificationAndroidinterface (PR #403).
- [Android]: Allows
repeatFrequencyto be set to -1 when creating notifications (Fixes #384). - [Android]: Fixes an issue with rescheduling notifications with alarm manager (Fixes #384).
- [Android]: Fixes a build issue introduced in version 5.2.0 (PR #384).
- [Android]: Fixes a compiling issue for some project configurations with error message "Project with path ':app' could not be found in project ':notifee_react-native'" (Fixes #288).
- [Android]: Fixes an issue where the current version of Notifee does not build when using an expo managed app with the expo plugin (Fixes #314).
- [Web]: Basic support for react-native-web - notifications do not work on web yet, but the package is now compatible with web (PR #369)
- [Android]: Introduces new APIs to help manage Android 12 limitations when creating trigger notifications:
canScheduleExactAlarmsopenAlarmPermissionSettings
And, the ability to check if your app has permissions to create trigger notifications by calling getNotificationSettings().
To learn more, see Triggers documentation for Android.
- [Android]: Fixes an issue when canceling trigger notifications created via AlarmManager to prevent "Maximum limit of concurrent alarms 500 reached for uid" error being thrown (Fixes #349).
- [iOS]: Fixes an issue with
NotificationSettingsreturning the wrong property name forauthorizationStatuson iOS (Fixes #333).
- [Android]: Fixes an issue where quick actions always opens the app on Android 12 (Fixes #315).
- [Android]: Fixes an issue where a quick action with an id of
defaultfailed to open the app.
- [Android/iOS] BREAKING CHANGE: Added support for checking permissions on Android which introduces a breaking change to
requestPermissionandgetNotificationSettingsAPIs.
Both APIs have been updated to return an object of type NotificationSettings, in replace of NotificationSettingsIOS.
NotificationSettings consists of two properties authorizationStatus and ios, where ios is a nested object of type NotificationSettingsIOS.
To learn more, see Permissions documentation for iOS, and Android.
- [Android]: Add support to set
largeIconforAndroidStyle.BIGPICTUREto null (Fixes #270) - [Android]: Fixes an issue with Android 12 when tapping on a notification (Fixes #250)
- [Android]: Fixes an issue when an action is pressed where the notification drawer would remain open with the notification (Fixes #268)
- [Android]: Fixes an issue with repeating trigger notifications where the next notification was scheduled at the incorrect time, causing the notification to infinitely display (Fixes #252).
- [Android]: BREAKING CHANGE : the minimum compileSdkVersion required has increased to 31, to fix an issue with Android 12 where the app will crash due to a missing Intent immutability flag (Fixes #238). You do not need to alter targetSdkVersion or anything else - but you must increase compileSdkVersion to 31. Please note, JDK11 is strongly recommended when using compile or target sdk 31. Please note, we do not correctly handle the new "exact alarm" Android 12 restrictions so we recommend staying on targetSdkVersion 30 for now.
- [Android]: Fixes an issue with buildtools to support gradle plugin 4.2+ (Fixes #211)
- [iOS]: Fixes an issue that was introduced in the previous patch when calling
setBadgeCountwith 0 (Fixes #212)
- [iOS]: Fix iOS API availability guards, and all compile warnings (Fixes #204)
- [Android]: Include support for expo managed projects [Learn More]]
- [Android]: Adds support for Android 12
- [Android]: Fixes an issue where the wrong quick action was triggered when fired in quick succession (Fixes #121)
- [Android]: Fixes an issue where notifications created by FCM were not being removed from the notification tray when cancelled (Fixes #120)
- [iOS]: Compiled module no longer depends on a XCFramework, as part of the migration to fully open source the library. [Learn More]
- [Android]: BREAKING CHANGE - the minimum SDK version has been updated from 16 to 20, providing backwards notification compatibility up to Android 4.4W.
- [Android]: Fixes an issue with
getDisplayedNotificationswhere the id returned is not the original notification id. (Fixes #381) - [Android]: Fixes an issue with displaying a notification with
android.tag(Fixes #382) - [Android]: Introduces support to cancel a notification with a
tag - Removed licensing validation and related code - Notifee is now free and fully open source. [Learn More]
- [Android]: BREAKING CHANGE - you must add a new maven local repository to your
android/build.gradlefile. (Fixes #151). See step #2 in the installation guide
- [Android]: Fixes an issue where
getInitialNotificationwas sometimes throwing an error leading to a crash if activity was null. (Fixes #374)
- [Android]: Fixes an issue where the initial notification wasn't being populated for full-screen actions.
- [iOS]: Introduces a new method signature for
NotifeeExtensionHelper.populateNotificationContentwhere therequestis passed down as well as thebestAttemptContent. View the Remote Notification Support documentation for more information. - [iOS]: Adds a note in the reference documentation that
getInitialNotification()for iOS is deprecated in favour ofonForegroundEvent.
- [Android]: Fixes an issue on Android to prevent
cancelDisplayedNotificationscancelling trigger notifications. (Fixes #349)
- [Android/iOS]: Introduces the following APIs:
getDisplayedNotificationsgetTriggerNotificationsisChannelBlockedisChannelCreatedcancelAllNotifications(ids)cancelDisplayedNotifications(ids)cancelTriggerNotifications(ids)
- BREAKING: Fixes an issue when setting a custom sound on a notification channel (Fixes #341). Sounds now must be specified without the file extension, previously it was optional. If you were using custom sounds on Android>7 prior to this, you will need to create a new notification channel or the reference to your custom sound on the channel will likely not survive app updates. We apologize for the inconvenience
- [Android]: Fixes an issue where an error is thrown when the intent was null in rare cases for foreground service events.
- [Android]: Fixes an issue where an error is thrown when using trigger notifications with AlarmManager on Android 8 & 7
- [Android]: Support Alarm Manager for trigger notifications.
- [iOS]: Xcode 12.4 and above is now supported
- [Android/iOS]: Fix npm bundle to exclude example app
- [Android/iOS]: Include support for jest tests by including a
jest-mock.jsfile. - [Android]: Add an extra safety check to prevent app from crashing if a
launchActivityproperty is set to an invalid activity class.
- [Android/iOS]: Allows title, body, and subtitle to be set to undefined in addition to string values to prevent an empty space on Android.
- [Android/iOS]: Updated validation to only throw an error for platform-specific properties if the app is running the same platform (Feature enhancement #297).
- [iOS]: Xcode 12.5 is required on iOS.
- [Android]: Fixed an issue with jwt gradle build dependency.
- [Android]: Implemented support for
notifee.hideNotificationDrawer(Feature enhancement #200).
- [Android]: Added support for
fullScreenActiononNotificationAndroid(Feature enhancement #45).
- [Android]: Fixed an issue where sometimes the app would throw an exception when the user changes the notification blocked state for either a channel or the entire application (Fixes #237).
- [Android]: Fixed an issue where sometimes the foreground service failed to stop when calling
resolvedue to an issue with hot reloading. It can be stopped bynotifee.stopForegroundService(). To learn more, view the Foreground Service documentation.
- [Android]: Fixed an issue with Notifee's build script where sometimes an error would occur that the target variant task already existed.
- [iOS]: Includes a Notification Service Extension Helper to take advantage of Notifee with remote notifications. To learn more, view the Remote Notification Support documentation.
- [iOS]: Enforce v1.10+ of CocoaPods (Fixes #230).
- [Android]: Includes a solution to fix an error due to a potential race condition that occurs when the user changes the notification blocked state for either a channel or the entire application (Fixes #237).
- [Android]: Implemented support for
circularLargeIcononNotificationAndroid(Feature enhancement #199). - [iOS]: Prevent badge count from clearing notifications from the tray when it reaches 0 (Fixes #214).
- NOTE: Version bump.
- [Android]: Fixed an issue with license validation on Android 6 (Fixes #87)
- [iOS]: Added support for Apple Silicon (arm64) and Mac Catalyst builds (Fixes #162, #215)
- [Android]: Added additional logs to help with debugging license validation issues.
- [Android/iOS]: Fixed an issue where sometimes the
NotifeeApiModulewould fail to resolvethis.nativedue to the context changing.
- [Android]: Fixed an issue where sometimes the
largeIconwouldn't show when the app is closed. - [Android/iOS]: Fixed an issue to show a more descriptive warning if the background event handler isn't set via
onBackgroundEvent.
- [Android]: Implemented additional support to help with background restrictions on Android, includes two new methods
getPowerManagerInfoandopenPowerManagerSettings. - [Android]: Fixed an issue with subtitle where the default value was causing two dots on some devices.
- [Android/iOS]: Added support to cancel either a displayed or a trigger notification.
- [Android]: Fixed an issue where
isBatteryOptimizationEnabledwas returning the result as an object instead of a boolean. - [Android]: Fixed an issue where
openBatteryOptimizationSettingswas sometimes throwing an exception for Samsung and Oppo phones on Android versions 6.0. - [iOS]: Fixed an issue when a notification is pressed while the app is in the background on iOS 14, which sometimes would cause the app to crash.
- [Android]: Fixed an issue where trigger notifications created with v0.12.x and below would cause the app to crash when upgrading to v0.13.x.
- [iOS]: Added support to handle remote urls for Attachments.
- [iOS]: Added iOS support for
repeatFrequencyonTimestampTrigger. See Triggers.
- [Android]: Added support for
repeatFrequencyonTimestampTriggerto be able to create hourly, daily or weekly trigger notifications. See Triggers. - [Android]: Implemented support to help with background restrictions on Android, includes two methods
isBatteryOptimizationEnabledandopenBatteryOptimizationSettings. See Background Restrictions. - [Android]: Fixed an issue when creating a trigger notification, where sometimes the input data would reach the maximum number of bytes allowed.
- [Android]: Fixed an issue where
pressActionwith thedefaultid failed to open the app when the notification was pressed. - [Android]: Fixed an issue with gradle plugin 4.1 and
Build.VERSION_NAMEwhich prevented the app from building.
- [iOS]: Fixed an issue where the
DELIVEREDforeground event wasn't being sent for trigger notifications. - [iOS]: Fixed an issue with the iOS module that sent events before the JS bundle was ready.
- [iOS]: Fixed an issue with the iOS module that prevented the library from compiling.
- [Android]:
lightColorandsoundare now returned when callinggetChannelorgetChannels. - BREAKING:
TimeTriggerhas been removed, in favour ofTimestampTriggerandIntervalTrigger. - [iOS]: Trigger Notifications are now supported on
iOS. See Triggers.
- [Android]: Fixed an issue with
cancelNotificationfor trigger notifications. - [Android]: Fixed an issue with remote verification on devices less than or equal to 20
- [iOS]: Call original delegate when intercepting notification response on iOS
- [Android]: Add support for Trigger Notifications on Android. See Triggers.
- [Android]: Fixed an issue with
getChannelsandgetChannelGroupswhere the methods were throwing an error - [iOS]: Fixed an issue with iOS 14 where sometimes the app would freeze briefly when receiving an push notification
- [Android]: Fixed an issue with sounds for Android versions < 8.0 (API level 26)
- [Android]: Fixed an issue with
notifee.config.jsonwhere sometimes the script could not find the 'app' gradle project automatically.
- [iOS]: Add support for iOS
onBackgroundEvent. - [iOS]: Pool JS events until RN Bridge is ready.
- [Android]: Allow multiple
onBackgroundEventobservers when inside a foreground service task.
- [iOS]: Add support for iOS notification attachments. See iOS Attachments.
- [iOS]: Fixed an issue where notifications would sometimes not appear in the foreground.
- [Android]: Fixed an issue where the Headless task key was incorrect for the foreground service task.update
- [Android]: Implemented support for
launchActivityFlags- allowing you to customise the launch behaviour of your activities.- See
AndroidLaunchActivityFlagfor supported flags.
- See
- [Android]: Fixed an issue with Android proguard rules that may have prevented the library from being used when minified.
- [Android]:
notifee.config.jsonnow supports specifying options for build flavours & types.- See this comment comment for an example.
- [TypeScript]: Reworked type definitions to fix minor definition issues.
- BREAKING:
Importancehas now been renamed toAndroidImportanceand is no longer supported oniOS(replaced withforegroundPresentationOptions). - [iOS]: Implemented support for
ios.foregroundPresentationOptionsto control foreground notification behaviour on iOS- See the iOS appearance guide for more information.
- [Android]: Fixed an issue where creating multiple
channelorchannelGroupswould fail to create. - [Android]:
requestPermissionnow correctly resolves a dummy instance ofIOSNotificationSettings(previouslynullon Android) for cross-platform compatibility. - [Android]:
largeIcon&picture(from big picture style) now supports React Native asset loading, e.g.largeIcon: require('./image.png').
Versions 0.0.1 through 0.5.1 were published to npm between 2020-01-27 and 2020-05-08 as private / early-access iterations and never received public release notes. Notifee was publicly launched with 0.6.0 on 2020-06-07 — that is why the history on this page starts there.
For the authoritative record of those early publications, see the npm version list on the package registry. Neither the upstream invertase/notifee repository nor this fork carries release notes for that window; no GitHub releases or git tags exist for versions older than 3.0.1.
