Add deep linking to your Flutter app with a single SDK. Works on iOS and Android with full support for deferred deep linking, install attribution, and custom domains.
flutter pub add ulinkimport 'package:ulink/ulink.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await ULink.configure(apiKey: 'your-api-key');
runApp(MyApp());
}class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
// Handle links when app is opened
ULink.instance.onLink((link) {
final path = link.path;
final params = link.parameters;
// Route user to correct content
Navigator.pushNamed(context, path, arguments: params);
});
// Check for deferred deep link (post-install)
ULink.instance.getInitialLink().then((link) {
if (link != null) {
// Handle the link that brought user here
}
});
}
}Add the Associated Domains entitlement in Xcode:
applinks:yourapp.ulink.lyULink automatically hosts your AASA file. No additional server configuration needed.
Add intent-filters to AndroidManifest.xml:
<activity ...>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:scheme="https"
android:host="yourapp.ulink.ly" />
</intent-filter>
</activity>ULink automatically hosts your assetlinks.json file for App Links verification.
Deferred deep linking preserves link context through the app install flow. When a user clicks a link, installs your app, and opens it—they land exactly where you intended.
// Check for deferred deep link on first launch
final deferredLink = await ULink.instance.getInitialLink();
if (deferredLink != null) {
// User came from a link before installing
final referralCode = deferredLink.parameters['ref'];
final productId = deferredLink.parameters['product'];
// Credit referral, navigate to product, etc.
}Create a free account and get your API key. Most teams are live in under 30 minutes.