# WarpLink SDK 1.1.0: One Callback, Guaranteed Matches, Rebuilt Networking

> WarpLink SDK 1.1.0 for iOS, Android, and React Native: one onLink callback for every link, a matchGuaranteed flag, automatic retries, and campaign parameters.

_Last updated: 2026-10-26_

> **TL;DR:** WarpLink SDK 1.1.0 is available today for iOS, Android, and React Native. One `onLink` callback receives every link, a new `matchGuaranteed` flag tells you when a match is deterministic, networking is rebuilt with automatic retries, and campaign parameters arrive with every resolved link. Most apps upgrade by changing one version number. The [upgrade guide](https://warplink.app/docs/changelog#upgrading) has the steps.

WarpLink is link infrastructure for mobile teams: deep linking, install attribution, and real-time analytics in one SDK. Version 1.1.0 ships for all three SDKs on the same day.

## One Callback for Every Link

Pass `onLink` to `configure()` and the SDK routes every link to it: cold start, warm start, and deferred deep links after an install. Configuring the SDK also starts the deferred deep link check, which is the request that attributes the install. `deepLink.isDeferred` tells you which kind of link arrived.

```tsx
import { WarpLink } from '@warplink/react-native';

WarpLink.configure({
  apiKey: 'wl_live_yoursdkkeyhere000000000000000000',
  onLink: ({ deepLink, error }) => {
    if (error || !deepLink) return;
    // Fired for taps and deferred installs. Check deepLink.isDeferred.
    navigateTo(deepLink.destination);
  },
});
```

The native SDKs take the same shape. On iOS, `WarpLinkAppDelegate` and `WarpLinkSceneDelegate` forward Universal Links for you. If you keep your own delegate, `WarpLink.open(_:)` and `WarpLink.continue(_:)` do the same in one line each, with no method swizzling. On Android, cold start is automatic and warm start is one call to `WarpLink.onNewIntent(intent)`.

Each automatic step can be switched off, and the manual methods remain, so an app that routes links itself can keep doing so.

## Know When a Match Is Guaranteed

Every resolved link carries `matchGuaranteed`. It is `true` only for a deterministic match: a Universal Link or App Link tap, or the Play Install Referrer. It is `false` for a probabilistic match made from device signals.

Use `matchGuaranteed` to pick the destination for each link, and keep sign-in and personal data on your own authentication.

```swift
WarpLink.configure(
    apiKey: "wl_live_yoursdkkeyhere000000000000000000",
    options: WarpLinkOptions(onLink: { result in
        guard case .success(let deepLink) = result, let deepLink else { return }
        if deepLink.matchGuaranteed {
            // Deterministic, so safe to route toward sign-in.
            navigateToSignIn(for: deepLink)
        }
        navigate(to: deepLink)
    })
)
```

## Campaign Parameters Arrive With the Link

The query string on a tapped link travels into the resolved link. `destination` and `deepLinkUrl` carry the link's UTM and custom parameters, and `customParams` holds the full parameter set. A campaign tag you put on a link reaches the screen it opens, so your in-app analytics can read the same source, medium, and campaign as the click.

For the full pattern, see [How to Pass UTM Parameters Through Deep Links Into Your App](https://warplink.app/blog/pass-utm-parameters-through-deep-links).

## Networking Rebuilt for Weak Connections

Request handling in the iOS and Android SDKs is rebuilt around a dedicated retry layer. The React Native SDK uses the same native code on each platform.

When a link resolve or the deferred check meets a dropped or flaky connection, or a server error, the SDK tries again. It makes up to three attempts, each with its own time limit, within about 12 seconds in total. On a weak connection, the second attempt usually delivers, in about eight seconds.

Every attempt for one tap carries the same identifier, so a retried tap records one click in your analytics. A refusal, such as a missing or expired link, is never retried, because trying again cannot change the answer.

On iOS, a tap that arrives after a long stay in the background retries on a fresh connection. In React Native, one tap is still one `onLink` event, and if every attempt fails, the error arrives once as `E_NETWORK_ERROR`.

## Smaller Additions

- **Is this URL yours?** `WarpLink.isWarpLinkURL(_:)` on iOS and `WarpLink.isWarpLinkUri(uri)` on Android answer synchronously, with no network call. Use them when your app forwards every incoming URL and needs to decide which ones belong to WarpLink.
- **Declare your link domains.** Set `linkDomains` in code, a `WarpLinkDomains` array in `Info.plist` on iOS, or an `app.warplink.DOMAINS` manifest entry on Android, so the SDK knows which custom domains are yours. The SDK also learns your verified domains from the server.
- **Typed Swift models.** `WarpLinkDeepLink` conforms to `Codable`, `Sendable`, and `Equatable`, and `customParams` uses a typed `JSONValue`.
- **API key status on iOS.** `WarpLink.isApiKeyValid` reports the server's verdict on your key. An invalid or revoked key also logs a warning, even with debug logging off.
- **Awaitable setup in React Native.** `configure()` returns a `Promise<void>`.
- **Native SDKs included.** `@warplink/react-native` 1.1.0 builds against the 1.1.0 iOS and Android SDKs.

## How to Upgrade

Most apps upgrade by changing one version number, in Swift Package Manager on iOS, Gradle on Android, or npm on React Native, and rebuilding.

On iOS, check one thing first. `customParams` values are typed `JSONValue`, so code that casts a value out of the dictionary switches to a typed accessor. Replace `customParams["id"] as? String` with `customParams["id"]?.stringValue`.

The [upgrade guide](https://warplink.app/docs/changelog#upgrading) has the exact dependency line for each platform. The [iOS](https://warplink.app/docs/sdks/ios), [Android](https://warplink.app/docs/sdks/android), and [React Native](https://warplink.app/docs/sdks/react-native) setup guides cover `onLink`, link domains, and `matchGuaranteed` in full, and the [SDKs page](https://warplink.app/sdks) is the one-screen comparison of what each package ships.

## Frequently Asked Questions

**How do I upgrade to WarpLink SDK 1.1.0?**
Change the SDK version to 1.1.0 in Swift Package Manager, Gradle, or npm, then rebuild. Most apps need no other change. On iOS, code that casts a value out of `customParams`, such as `customParams["id"] as? String`, switches to the typed accessor `customParams["id"]?.stringValue`. The [upgrade guide](https://warplink.app/docs/changelog#upgrading) lists the exact dependency line for each platform.

**Do I have to use the onLink callback?**
No. The manual methods remain in 1.1.0, and each automatic step can be switched off in the SDK options, so an app that routes links itself can keep doing so.

**What does matchGuaranteed mean?**
`matchGuaranteed` is `true` only for a deterministic match: a Universal Link or App Link tap, or the Play Install Referrer. It is `false` for a probabilistic match made from device signals. Use it to pick a destination, and keep sign-in and personal data on your own authentication.

## Related Guides

- **Carry campaign data into the app:** [How to Pass UTM Parameters Through Deep Links Into Your App](https://warplink.app/blog/pass-utm-parameters-through-deep-links) shows how link parameters reach the screen they open.
- **The install side on iOS:** [Deferred Deep Linking on iOS](https://warplink.app/blog/deferred-deep-linking-ios) walks through the match cascade in Swift.
- **The next release:** [WarpLink SDK 1.2.0](https://warplink.app/blog/warplink-sdk-1-2-0) adds referral links that survive the install.
- **Before you ship the upgrade:** [How to Test Deep Links: simctl and adb Commands, Plus a Pre-Launch Checklist](https://warplink.app/blog/how-to-test-deep-links) has the simulator and device commands.
