Documentation
Every language and framework
Capacitor, Ionic, Cordova, React Native, Flutter, native Swift, native Kotlin and the web. For each: whether the SDK covers it, what you write, and what you do yourself.
All eight of these work. What differs is whether you import a package or write two HTTP calls, and this page says which — for every one, on one screen, so that nobody has to conclude from silence that their language is unsupported.
| Language or framework | What we give you | What you write | What you do yourself |
|---|---|---|---|
| CapacitorSDK, and run in a real app | The package, and it is the platform it was built against. | Two lines: init, and a handler that routes on the link. | Nothing beyond your own routing. Universal links and App Links still need the platform setup every deep link needs, which is the same work for everybody. |
| IonicRuns on CapacitorSDK, and run in a real app | The same package. Ionic Angular, React and Vue are all covered by it. | The same two lines, in whichever framework you build the UI with. | Route the link through your own router — Angular’s Router, React Router or Vue Router. The SDK hands you the link; where it goes is your application’s business. |
| CordovaSDK, and run in a real app | The package, with a Cordova platform layer that reads links from ionic-plugin-deeplinks on both platforms, and from handleOpenURL for custom schemes. | The same two lines, plus two lines in index.html. | Add a link-delivery plugin — Cordova forwards neither an iOS user activity nor an Android Intent to the web view on its own — and the buffer in index.html above your bundle, because Cordova can announce a link before your JavaScript exists and nothing inside the SDK can recover a call made before it was there. For the install referrer, Android needs its own plugin as well. |
| React NativeSDK, not yet run in a real app | The package, with a platform layer that takes storage and Linking from you. | The two lines, plus a storage adapter and one global assignment. | Pass in AsyncStorage and Linking, and on Android the install referrer as well — assign react-native-play-install-referrer to globalThis.QubeRouteInstallReferrer, which the SDK reads from 0.2.4. We cannot import any of the three without making the package refuse to install in a Capacitor project.The link arrives through React Native’s own Linking module. |
| Web JavaScript and TypeScriptSDK, not yet run in a real app | The package. The page address is the link, so there is nothing to receive. | The two lines. | Nothing. localStorage is used automatically, and there is no deferred case on the web because there is no install. |
| Flutter and DartREST API — no package for this language | The REST API, which is what the package calls anyway. There is no Dart package. | Two HTTP calls with package:http, and the deferred sequence if you want it. | Receive the incoming URL, hold an install token between launches, and build the deferred first-launch handshake — that one is a sequence rather than an endpoint.The link arrives through app_links or uni_links, neither of them ours. |
| Native iOS — Swift and Objective-CREST API — no package for this language | The REST API, and the association file your app needs is already served. | Two URLSession calls, and the deferred sequence if you want it. | Handle the NSUserActivity your app already receives, keep an install token in the keychain or UserDefaults, and build the deferred handshake yourself.The link arrives through the continueUserActivity delegate method you already implement. |
| Native Android — Kotlin and JavaREST API — no package for this language | The REST API, and the Digital Asset Links file your app needs is already served. | Two HTTP calls, and the deferred sequence if you want it. | Read the intent data your activity already receives, keep an install token in SharedPreferences, and build the deferred handshake yourself.The link arrives through the Intent your launch activity already gets. |
What the three labels mean
- SDK, and run in a real app
- The package covers this, and it has been run inside a real application of this kind — on a physical iPhone and a physical Android handset, in a customer’s app rather than on a rig of ours. A link opens the app, the click is attributed, and on Android an install from Google Play carries the click through on the install referrer. The honest limit even here: that install came from an internal testing track rather than a public listing — see the readiness note below.
- SDK, not yet run in a real app
- The package covers this and is unit-tested against a simulation of the platform’s documented behaviour. That proves our decisions are right if the platform behaves as documented. It does not prove that it does. You would be the first, and we would rather tell you than let you find out.
- REST API — no package for this language
- There is no package you can import, and the product works: the REST API is what the package calls anyway, and it is documented, versioned and covered by the same compatibility guarantee. You write the calls.
The limit that applies to all of them
A tap has been settled on a physical device, on both iPhone and Android, in a customer’s app rather than on a rig of ours. A link opens the app and the click is attributed. What is proved by a running test, separately, is the file we serve, the matching behind it, and the whole web path end to end in a real browser.
Deferred attribution is confirmed on a handset as well — an install from Google Play carried the click through on the install referrer. The install came from an internal testing track rather than a public listing, which is the one part of that path we have not measured. That is not a caveat about your language, and it applies equally to Capacitor, which is the best-covered thing on this page.
If your language is not on this list
It still works, and the answer is the same as for Swift and Kotlin: the REST API is what the package calls anyway. Two POSTs with a publishable key resolve a link and record an event, in any language that can make an HTTP request.
If a package for your language would decide it for you, write to [email protected] and say so. What people ask for is what gets built, and we would rather hear it than guess.
Ask the documentation
It answers from these pages only, and links what it used. If the answer is not here it says so rather than guessing — then email [email protected].