Migration to v2
Two paths lead to @swmansion/react-native-detour@2.0.0. Pick the one that matches your current version:
- still on
0.x: start from From 0.x - already on
1.0.1: start from From 1.0.1
From 0.x
Section titled “From 0.x”Changes from 0.x
Section titled “Changes from 0.x”| Area | In 0.x | In 2.0.0 |
|---|---|---|
| Config key | Legacy API_KEY form in older integrations | apiKey |
| Link data in context | linkRoute / legacy fields | link object (route, pathname, params, url, type) |
| Link-source control | No explicit mode in older flows | linkProcessingMode: 'all' | 'web-only' | 'deferred-only' |
| Device fingerprint dependencies | react-native-device-info | expo-constants + expo-device |
| Expo Web behavior | Not explicitly guarded | DetourProvider disabled on web (no-op context) |
1. Update dependencies
Section titled “1. Update dependencies”Remove old dependency:
npm uninstall react-native-device-infoInstall current peer dependencies:
npm install expo-localization expo-clipboard expo-constants expo-device @react-native-async-storage/async-storage expo-applicationIf you use Yarn/PNPM/Bun, use equivalent commands from Installation.
2. Update config shape
Section titled “2. Update config shape”// before (legacy)const config = { API_KEY: process.env.EXPO_PUBLIC_DETOUR_API_KEY, appID: process.env.EXPO_PUBLIC_DETOUR_APP_ID,};
// afterconst config = { apiKey: process.env.EXPO_PUBLIC_DETOUR_API_KEY, appID: process.env.EXPO_PUBLIC_DETOUR_APP_ID, linkProcessingMode: 'all',};3. Update context usage
Section titled “3. Update context usage”// before (legacy route string)const { isLinkProcessed, linkRoute, clearLink } = useDetourContext();if (isLinkProcessed && linkRoute) { router.replace(linkRoute); clearLink();}
// afterconst { isLinkProcessed, link, clearLink } = useDetourContext();if (isLinkProcessed && link) { router.replace({ pathname: link.pathname, params: link.params }); clearLink();}4. Choose a link processing mode
Section titled “4. Choose a link processing mode”'all'(default) — deferred + Universal/App + scheme links'web-only'— deferred + Universal/App links, no scheme links'deferred-only'— deferred only (recommended if Expo Router+native-intent.tsxhandles runtime links)
From 1.0.1
Section titled “From 1.0.1”Changes from 1.0.1
Section titled “Changes from 1.0.1”| Area | In 1.0.1 | In 2.0.0 |
|---|---|---|
| Device fingerprint dependencies | react-native-device-info | expo-constants + expo-device |
| Peer dependency install command | Included react-native-device-info | Uses Expo modules only (no react-native-device-info) |
| Expo Web behavior | Not explicitly guarded | DetourProvider is disabled on web (no-op context + one dev warning) |
Update dependencies
Section titled “Update dependencies”- Remove old dependency:
npm uninstall react-native-device-info- Install current peer dependencies:
npm install expo-localization expo-clipboard expo-constants expo-device @react-native-async-storage/async-storage expo-applicationIf you use Yarn/PNPM/Bun, use equivalent commands from Installation.
Web behavior
Section titled “Web behavior”In 2.0.0, DetourProvider does not initialize on Expo Web. It returns a no-op context instead:
isLinkProcessed: truelink: nullclearLink: () => {}
This keeps the app tree stable and avoids a partial initialization on a platform the SDK does not support.
Validation checklist
Section titled “Validation checklist”Whichever path you took, confirm that:
- The iOS and Android deferred flow still resolves the route and its parameters.
- Runtime Universal/App Links still resolve according to
linkProcessingMode. - Expo Web no longer attempts Detour processing, and the app renders without provider errors.
- Exactly one
DetourProvideris mounted in the app root.