Deep linking
Skill launch52-ai/flutter-template/.claude/skills/deep-linking
Template for Flutter mobile applications.
npx -y skills add launch52-ai/flutter-template --skill deep-linkingAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 2 stars2 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Deep linking with Universal Links (iOS) and App Links (Android). Platform setup, domain verification, GoRouter integration, path-based routing. Use when implementing deep links, URL handling, or app-to-web navigation.
SKILL.md
5.6 KB, as published. Nobody here has run it
Deep Linking - Universal Links & App Links
Deep linking setup for iOS (Universal Links) and Android (App Links) with GoRouter integration.
When to Use This Skill
- Adding deep link support to a Flutter app
- Configuring Universal Links for iOS
- Configuring App Links for Android
- Handling custom URL schemes
- Integrating deep links with GoRouter
- User asks "add deep linking", "universal links", "app links", or "URL handling"
Questions to Ask
- Domain: What domain will host the deep links? (e.g.,
example.com) - Paths: Which paths should open the app? (e.g.,
/products/*,/users/*) - Custom scheme: Need a custom URL scheme fallback? (e.g.,
myapp://) - Environments: Multiple domains? (e.g., staging.example.com, example.com)
- Backend access: Can you host
.well-knownfiles on the server?
Reference Files
reference/router/deep_link_handler.dart- GoRouter deep link configtemplates/ios/Runner.entitlements- Associated Domainstemplates/android/android_manifest_deeplinks.xml- Intent filters
See: implementation-guide.md for complete setup.
Workflow
Phase 1: Domain Verification
- Create
apple-app-site-associationfile (see ios-guide.md) - Create
assetlinks.jsonfile (see android-guide.md) - Host files at
https://domain.com/.well-known/ - Verify HTTPS and correct MIME types
Phase 2: iOS Configuration
- Add Associated Domains capability in Xcode
- Add domain to
Runner.entitlements - Handle links in AppDelegate (if needed)
Phase 3: Android Configuration
- Add intent filters to
AndroidManifest.xml - Set
autoVerify="true"for App Links - Generate and add SHA-256 fingerprint to
assetlinks.json
Phase 4: GoRouter Integration
- Configure
GoRouterwith deep link paths - Add route parameter extraction
- Handle unknown deep links gracefully
- Test with
adbandxcruncommands
Core API
// GoRouter handles deep links automatically
GoRouter(routes: [
GoRoute(path: '/products/:id', builder: (context, state) =>
ProductScreen(productId: state.pathParameters['id']!)),
]);
// Manual: GoRouter.of(context).go(Uri.parse(deepLink).path);
URL Types
| Type | iOS | Android | Format |
|---|---|---|---|
| Universal/App Links | Yes | Yes | https://domain.com/path |
| Custom Scheme | Yes | Yes | myapp://path |
| Firebase Dynamic Links | Deprecated | Deprecated | Use Universal/App Links |
Domain Verification Files
iOS: apple-app-site-association
Host at: https://domain.com/.well-known/apple-app-site-association
{
"applinks": {
"apps": [],
"details": [{
"appID": "TEAM_ID.com.example.app",
"paths": ["/products/*", "/users/*"]
}]
}
}
Android: assetlinks.json
Host at: https://domain.com/.well-known/assetlinks.json
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.app",
"sha256_cert_fingerprints": ["SHA256_FINGERPRINT"]
}
}]
Platform Requirements
iOS
- Associated Domains capability enabled
- HTTPS domain with valid certificate
apple-app-site-associationfile accessible (no redirects)- MIME type:
application/json
Android
- Intent filters with
autoVerify="true" - SHA-256 fingerprints (debug, release, Play Store)
assetlinks.jsonfile accessible- MIME type:
application/json
Testing Commands
xcrun simctl openurl booted "https://example.com/products/123" # iOS
adb shell am start -a android.intent.action.VIEW -d "https://example.com/products/123" com.example.app
adb shell pm get-app-links com.example.app # Verify Android
curl -I https://example.com/.well-known/apple-app-site-association
Guides
| File | Content |
|---|---|
| ios-guide.md | Universal Links, Associated Domains, AASA file |
| android-guide.md | App Links, Intent Filters, Digital Asset Links |
| implementation-guide.md | GoRouter integration, path handling |
| checklist.md | Verification checklist |
Common Issues
| Issue | Cause | Solution |
|---|---|---|
| iOS link opens Safari | AASA not found | Check .well-known path and MIME type |
| Android shows app chooser | autoVerify failed | Verify assetlinks.json and SHA-256 |
| Path not matched | Wrong pattern | Check path patterns in AASA/router |
| Works in dev, not prod | Wrong fingerprint | Add release/Play Store SHA-256 |
Checklist
- Domain supports HTTPS with valid certificate
-
apple-app-site-associationhosted at.well-known/ -
assetlinks.jsonhosted at.well-known/ - iOS: Associated Domains capability added in Xcode
- iOS: Domain added to
Runner.entitlements - Android: Intent filters added to
AndroidManifest.xml - Android: All SHA-256 fingerprints in
assetlinks.json - GoRouter configured with deep link paths
- Deep links tested on both platforms
- Unknown paths handled gracefully
Related Skills
/core- GoRouter setup (run first)/push-notifications- Deep links from notifications/release- iOS capabilities, Android signing/testing- Deep link integration tests