Skip to content

10.9.1

Choose a tag to compare

@marcocrupi marcocrupi released this 24 Oct 07:03
Immutable release. Only release title and notes can be modified.

Fixed

  • Android / initial-notification consumption (#88): fix the originally reported replay of the cold-start notification after a later tap or return through Recents. Coordinate sticky events, Activity Intents and persistent interaction identity so identifiable interactions are consumed once, regardless of which source is read first. New taps remain eligible even when the notification ID is reused.
  • Android / process-death recovery and ledger retention: prevent consumed identifiable taps and full-screen launches from reappearing when Android restores an Activity with a new Intent object. Correct the early #88 retention boundary that could revive an old consumed full-screen launch after many later claims, without discarding issued launches that have not yet been captured or consumed merely to bound that history. Supported identifiable restore paths recover unread interactions once; this does not persist every payload or remove the accepted N1 storage-growth risk.
  • Android / full-screen bootstrap: fix the additional, pre-existing delivery gap found on existing consumer Activities, including singleTask, where the new Intent was unavailable through getIntent() or lost while React Native was starting. Capture payload-bearing launches natively, even before ReactContext or the TurboModule exists, and restore the requested React component before cold consumer startup. No consumer onNewIntent override is required; this applies to full-screen actions carrying mainComponent.
  • Android / full-screen latest-wins: correct intermediate #88 candidates that returned the creation-time launch after a newer valid capture, including after process death before or after reading the replacement. Retire the replaced capture durably. Ordering follows the first valid capture of each interaction received by the app, not FIFO, notification issuance or PendingIntent send order; a notification that has not yet launched is not retired merely by a newer capture.
  • Android / persistence failures and concurrent reads: fix the initial #88 tap ledger reporting successful consumption after a failed persistence write, which allowed the same tap to replay after process death. Correct intermediate replacement handling that lost the latest valid full-screen payload or returned it while leaving its predecessor recoverable. Keep pending data for retry, including action/reply input, and return identifiable interactions only after the required consumption write succeeds. Remove only the consumed sticky event so a concurrent successor is not discarded. The narrow total-persistence-failure exception remains subject to the documented recovery limits.
  • Android / full-screen capture dispatch and routing: correct intermediate capture paths skipped by Android as hidden activities or lost through reuse of an unfinished capture task. Give each capture an independently dispatched, short-lived target; disable noHistory on that private target to prevent cancellation before onCreate, with explicit cleanup after dispatch. Restore distinct PendingIntent identities for different consumer Activities so same-ID launches do not overwrite another consumer's destination.
  • Android / full-screen lock screen: correct keyguard flashes and additional consumer stops introduced by intermediate capture receivers, including the API 26–28 compatibility gap. The final native capture path supports the consumer's wake/lock-screen presentation without exposing capture UI or making a consumer that lacks its own lock-screen configuration visible above the keyguard. These results are limited to the qualified configurations; Android permissions and system/OEM policy still determine actual full-screen presentation.
  • Android / full-screen Intent validation: correct intermediate paths that replaced a valid pending capture with a malformed notification payload or an unavailable consumer. Validate notification identity, launch kind and private routing before retirement; unknown, consumed or malformed interactions cannot displace the pending valid capture. Check that the explicit consumer belongs to the app and is resolvable before capture; missing consumers and consumers disabled after notification display cannot retire the valid pending launch.

PRESS, ACTION_PRESS, RemoteInput event handling, effective consumer launch flags/navigation and public APIs remain preserved compatibility behaviours, not additional fixes. Consumption is at-most-once within the documented limits, not exactly-once execution of application work; these Android corrections do not extend recovery guarantees to iOS.

Tests

  • Android / #88 host and review: 806/806 Android tests passed (39 classes, zero failures/errors/skips); independent final storage/contract and code re-reviews approved the candidate. These are completed qualification results, separate from device validation.
  • Android / #88 emulator matrix (API 26–36, selected levels): RN 0.85.3 Debug on API 26, 27, 28, 32, 33 and 36; RN 0.85.3 Release/R8 on API 31 and 34; RN 0.86.3 Debug on API 36. Covered full-screen warm/cold launches, latest-wins and selected recovery, tap, RemoteInput and dispatch-stress scenarios.
  • Android / #88 physical runtime (2026-10-24, candidate ff01a6ac): Pixel 9 Pro XL, Android 17/API 37; 35 qualified cases, RT-P1–RT-P8 PASS WITH NOTES overall (RT-P6 visual/lock-screen notes). Tested RN 0.85.3 Debug and Release/R8, and RN 0.86.3 Debug. A separate instrumented Debug fixture with byte-identical library input bytecode directly verified capture before ReactContext initialization. Qualification covers the tested configurations on one Pixel; it does not establish universal OEM behaviour. The accepted N1 risk of persistent full-screen allowlist growth remains open; the earlier 5,012-ID measurement was not rerun on this final binary.

Release validation

Release commit d0cbf7071cc5bff3bcda5b060f23a14cbf5c0cca: local validation passed 2,421 client tests, 275 Server SDK tests, 90 CLI tests and 806 Android tests (39 classes, zero failures/errors/skips). TypeScript, lint, native formatting and documentation generation passed; lint retains 69 warnings and zero errors. Release-tooling and CLI artifact-isolation checks passed.

All release-commit GitHub workflows passed: Code Quality Checks, Jest Tests, JUnit Tests.

The exact release tarball passed TypeScript consumer resolution (node, node16, bundler), blocked-internal-subpath checks and npm CLI installation/scaffolding checks. A fresh Yarn consumer passed CLI, Server SDK execution and public export resolution; all 400 installed package files match the tarball.

Post-publication verification: npm latest is 10.9.1, registry SHA-512 integrity matches the qualified tarball, and a fresh installation from npm matches all 400 files. CLI, Server SDK execution and public export resolution passed.

Tarball SHA-256: 2c161aeceee953b04a027942ef11cef1f7265dc98d74e88221ab3ff16b6deac3.

Physical runtime results above remain bound to the qualified ff01a6ac candidate and its recorded APKs. This release changes only the package version and documentation after that candidate; it does not claim a new device run. The accepted N1 persistent full-screen allowlist growth risk remains open. Existing tooling advisories remain documented in tooling security maintenance.


📦 react-native-notify-kit@10.9.1 on npm

Full comparison