Skill v1.0.1
currentAutomated scan100/1002 files
version: "1.0.1" name: deep-linking description: Generate deep linking infrastructure with URL schemes, Universal Links, and App Intents for Siri/Shortcuts. Use when handling custom URL schemes, Universal Links/Associated Domains, or routing to specific content from external sources. allowed-tools: [Read, Write, Edit, Glob, Grep, Bash, AskUserQuestion]
Deep Linking Generator
Generate deep linking infrastructure with URL schemes, Universal Links, and App Intents for Siri/Shortcuts.
When This Skill Activates
- User wants to handle custom URL schemes (myapp://)
- User mentions Universal Links or Associated Domains
- User wants Siri Shortcuts or App Intents
- User needs to navigate to specific content from external sources
Pre-Generation Checks
Before generating, verify:
- Existing Deep Link Handling
``bash # Check for existing URL handling grep -r "onOpenURL\|open.*url\|handleOpen" --include="*.swift" | head -5 ``
- URL Scheme in Info.plist
``bash # Check for CFBundleURLTypes find . -name "Info.plist" -exec grep -l "CFBundleURLSchemes" {} \; ``
- Associated Domains Entitlement
``bash find . -name "*.entitlements" -exec grep -l "associated-domains" {} \; ``
Configuration Questions
1. URL Scheme
- What custom URL scheme? (e.g.,
myapp) - This enables
myapp://path/to/contentlinks
2. Universal Links
- Yes - Handle HTTPS links (requires AASA file on server)
- No - Custom URL scheme only
3. App Intents / Siri Shortcuts
- Yes - Enable voice commands and Shortcuts app
- No - URL-based deep linking only
4. Link Types
- Profile:
/users/{id} - Content:
/items/{id} - Actions:
/actions/share,/actions/create - Custom routes based on app needs
Generated Files
Core Infrastructure
Sources/DeepLinking/├── DeepLinkRouter.swift # Central router├── DeepLink.swift # Route definitions└── UniversalLinkHandler.swift # Universal link processing
App Intents (Optional)
Sources/AppIntents/├── OpenContentIntent.swift # Open specific content├── AppShortcuts.swift # Shortcuts provider└── ContentEntity.swift # Entities for Spotlight/Siri
Server Files (Universal Links)
.well-known/└── apple-app-site-association # AASA file template
Key Features
Route Definitions
enum DeepLink: Equatable {case homecase profile(userId: String)case item(itemId: String)case settingscase action(ActionType)enum ActionType {case share(itemId: String)case create}}
URL Parsing
extension DeepLink {init?(url: URL) {guard let components = URLComponents(url: url, resolvingAgainstBaseURL: true) else {return nil}let pathComponents = components.path.split(separator: "/").map(String.init)switch pathComponents {case ["users", let userId]:self = .profile(userId: userId)case ["items", let itemId]:self = .item(itemId: itemId)case ["settings"]:self = .settingsdefault:self = .home}}}
SwiftUI Integration
@mainstruct MyApp: App {@State private var router = DeepLinkRouter()var body: some Scene {WindowGroup {ContentView().environment(router).onOpenURL { url inrouter.handle(url)}}}}
App Intents Integration
OpenIntent for Navigation
struct OpenItemIntent: OpenIntent {static let title: LocalizedStringResource = "Open Item"@Parameter(title: "Item")var target: ItemEntityfunc perform() async throws -> some IntentResult {await router.navigate(to: .item(itemId: target.id))return .result()}}
App Shortcuts
struct AppShortcuts: AppShortcutsProvider {static var appShortcuts: [AppShortcut] {AppShortcut(intent: OpenItemIntent(),phrases: ["Open \(\.$target) in \(.applicationName)","Show \(\.$target)"],shortTitle: "Open Item",systemImageName: "doc")}}
Required Capabilities
URL Scheme (Info.plist)
<key>CFBundleURLTypes</key><array><dict><key>CFBundleURLSchemes</key><array><string>myapp</string></array><key>CFBundleURLName</key><string>com.yourcompany.myapp</string></dict></array>
Universal Links (Entitlements)
<key>com.apple.developer.associated-domains</key><array><string>applinks:yourapp.com</string><string>applinks:www.yourapp.com</string></array>
Server Configuration (AASA)
Host at https://yourapp.com/.well-known/apple-app-site-association:
{"applinks": {"apps": [],"details": [{"appID": "TEAMID.com.yourcompany.yourapp","paths": ["/items/*","/users/*","/share/*"]}]}}
Integration Steps
1. Basic URL Handling
@mainstruct MyApp: App {var body: some Scene {WindowGroup {ContentView().onOpenURL { url inhandleDeepLink(url)}}}}
2. Universal Links (UIKit)
// In SceneDelegatefunc scene(_ scene: UIScene, continue userActivity: NSUserActivity) {guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,let url = userActivity.webpageURL else {return}handleUniversalLink(url)}
3. App Intents Setup
- Create entities for Spotlight indexing
- Implement OpenIntent for each content type
- Define AppShortcuts for Siri phrases
- Index entities with CSSearchableIndex
Testing
URL Schemes
# Simulatorxcrun simctl openurl booted "myapp://items/123"# Device# Open Safari and navigate to myapp://items/123
Universal Links
# Test AASA filecurl -I "https://yourapp.com/.well-known/apple-app-site-association"# Should return Content-Type: application/json# Validate with Apple# Use Apple's tool or Branch.io validator
App Intents
- Build and run on device
- Open Shortcuts app
- Your app's shortcuts should appear
- Test with Siri: "Hey Siri, [your phrase]"