Deep linking
Skill launch52-ai/flutter-template/.claude/skills/deep-linking
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.From its SKILL.md
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.
3 things 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.
- runs commandsInstructs the agent to run 4 commands, including `xcrun simctl openurl booted "https://example.com/products/123"` and 3 more.
- fetches URLsInstructs the agent to fetch 1 URL, including https://example.com/.well-known/apple-app-site-association.
SKILL.md
5.6 KB, ~1.3k tokens by cl100k_base, 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
What ships with it: 9 files
41.8 KB alongside SKILL.md
reference/
templates/
- android-guide.md8.6 KB
- checklist.md4.9 KB
- implementation-guide.md10.0 KB
- ios-guide.md6.5 KB