Implement deep linking and universal links
✓Works with OpenClaudeYou are a mobile app developer implementing deep linking and universal links for iOS and Android apps.
What to check first
- Verify your app has a registered domain (e.g.,
example.com) with HTTPS support - Check that you have
entitlementsfile configured for iOS (Xcode project settings) - Confirm Android
AndroidManifest.xmlexists and you can modify it - Ensure you have
assetlinks.jsongenerator tool or can manually create the JSON file
Steps
- Create
assetlinks.jsonin your Android project at/.well-known/assetlinks.jsonon your web server with your app's SHA256 fingerprint - Generate your Android app's SHA256 certificate fingerprint using
keytool -list -v -keystore your-keystore.jks - Add intent filters to
AndroidManifest.xmlfor each deep link pattern your app handles - Configure iOS associated domains in Xcode under Signing & Capabilities → Associated Domains
- Create
apple-app-site-association(AASA) file at/.well-known/apple-app-site-associationon your server - Implement URL routing logic in your app to parse deep links and navigate to correct screens
- Test deep links on physical devices or emulators using
adb shell am startorxcrun simctl openurl - Verify both platforms correctly handle link fallbacks when app is not installed
Code
// iOS: Handle deep links in SceneDelegate or AppDelegate
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
func scene(_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions) {
// Handle deep link when app launches
if let userActivity = connectionOptions.userActivities.first,
userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL {
handleDeepLink(url: url)
}
}
func scene(_ scene: UIScene,
continue userActivity: NSUserActivity) {
// Handle deep link when app is already running
if userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL {
handleDeepLink(url: url)
}
}
func handleDeepLink(url: URL) {
guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true) else {
return
}
// Parse path: example.com/products/12345
let pathComponents = components.path.split(separator: "/").map(String.init)
if pathComponents.count >= 2 && pathComponents[0] == "products" {
let productId = pathComponents[1]
navigateToProduct
Note: this example was truncated in the source. See the GitHub repo for the latest full version.
Common Pitfalls
- Treating this skill as a one-shot solution — most workflows need iteration and verification
- Skipping the verification steps — you don't know it worked until you measure
- Applying this skill without understanding the underlying problem — read the related docs first
When NOT to Use This Skill
- When a simpler manual approach would take less than 10 minutes
- On critical production systems without testing in staging first
- When you don't have permission or authorization to make these changes
How to Verify It Worked
- Run the verification steps documented above
- Compare the output against your expected baseline
- Check logs for any warnings or errors — silent failures are the worst kind
Production Considerations
- Test in staging before deploying to production
- Have a rollback plan — every change should be reversible
- Monitor the affected systems for at least 24 hours after the change
Related Mobile Skills
Other Claude Code skills in the same category — free to download.
React Native Screen
Create React Native screens with navigation
React Native Component
Build React Native UI components
Expo Setup
Set up Expo project with common configurations
Mobile Navigation
Set up React Navigation with typed routes
Push Notification
Implement push notifications (Expo/Firebase)
Offline Storage
Set up offline storage (AsyncStorage, MMKV)
Mobile Auth Flow
Create mobile authentication flow
App Store Prep
Prepare app for App Store/Play Store submission
Want a Mobile skill personalized to YOUR project?
This is a generic skill that works for everyone. Our AI can generate one tailored to your exact tech stack, naming conventions, folder structure, and coding patterns — with 3x more detail.