All notable changes to @ulinkly/react-native will be documented in this file.
- Bump the pinned native iOS SDK to
ULinkSDK1.2.0. Android is unaffected.- Deep links are no longer lost on iOS when they arrive while the SDK is still starting up. A host launched by a universal link hands the link to the SDK moments after initialization begins, and link resolution rejected anything arriving before bootstrap finished — the error was swallowed into a log line, so the launch link was dropped silently.
- A bootstrap that failed at cold start now always reaches a terminal state, so later links fail fast instead of waiting for a completion that never comes.
- Note: the CocoaPods constraint was
~> 1.1.1, which resolves to>= 1.1.1, < 1.2.0— iOS hosts could not pick up 1.2.0 until this bump.
- Bump the pinned native Android SDK from
ly.ulink:ulink-sdk:1.1.4to1.2.0. iOS is unaffected.- Deep links are no longer lost when they arrive while the SDK is still starting up. A link reaching the SDK before bootstrap finished was rejected outright, and because the intent had already been marked as handled nothing retried it — so cold starts launched by tapping a link, the most common case, dropped the link. Measured on a device: intent processed 0.9s after process start, bootstrap completed 2.2s later, listener never fired.
- The deferred-link check had the same race. It runs once per install, so losing it lost the install's attribution permanently.
- A failure while the SDK was setting up could leave bootstrap in a non-terminal state, parking every later deep link for the life of the process.
- Shutting the SDK down is no longer reported as a deep-link failure, and no longer silently stops delivery to the log stream.
- Disposing the SDK now actually ends the active session; the request was previously cancelled before it was sent.
- Re-initialising after disposing returns a working instance instead of the disposed one, whose background work silently did nothing.
- Bump the pinned native Android SDK from
ly.ulink:ulink-sdk:1.1.0to1.1.4, picking up four releases of Android-only fixes. iOS is unaffected.- Correct
X-ULink-Client-Versionin backend telemetry; the 1.1.0 artifact reported1.0.11on every call (1.1.1). - Dynamic links are no longer emitted twice when the app is already installed (1.1.2).
- The deferred-match endpoint honours the configured
baseUrlinstead of always callinghttps://api.ulink.ly(1.1.3). - The "retry bootstrap on next foreground" recovery is now reachable, so a single transient network error at cold start no longer leaves the SDK degraded for the whole process lifetime (1.1.3).
- Transient pre-send network failures (DNS, connect, no route) are retried with exponential backoff; failures that may already have reached the server, such as read timeouts, are deliberately not retried so sessions and installations cannot be duplicated (1.1.4).
- The deferred-link check is re-attempted once bootstrap recovers, serialized against overlapping foregrounds, and retried until the request completes (1.1.4).
- Correct
Initial release.
- Expo Module bridging the native iOS (
ULinkSDK ~> 1.1.1) and Android (ly.ulink:ulink-sdk:1.1.0) SDKs via the Expo Modules API. - Full Flutter SDK parity: dynamic links, deferred deep linking, sessions, installation/reinstall detection, and persistent-device-ID MAU dedup.
- Event-based link delivery (
onDynamicLink,onUnifiedLink,onReinstallDetected,onLog) via native Combine (iOS) and SharedFlow (Android) streams. - Async
initialize()with native-side pending queue — method calls and incoming links arriving before init resolves are buffered and flushed after init completes. - iOS AppDelegate subscriber (Universal Links + custom schemes) shipped as an Expo Module AppDelegate extension — no manual
AppDelegateedits required. - Android intent capture (
OnNewIntent) withenableDeepLinkIntegration=falseto prevent double-handling by the native SDK. - Expo config plugin (
["@ulinkly/react-native", { "scheme": "...", "domains": ["..."] }]) that automatesInfo.plistURL types, Associated Domains entitlement, and Android<intent-filter>setup duringexpo prebuild. - Supports bare React Native and Expo (dev client / prebuild). Not supported in Expo Go.
- Supports both New (Fabric/TurboModule) and Old RN architectures automatically via the Expo Modules API.