Use when migrating Android deep links (intent filters, App Links, Navigation deep links, Firebase Dynamic Links) to iOS Universal Links, URL Schemes, SwiftUI .onOpenURL, and Firebase Dynamic Links
4e:T41e5,
Android supports deep linking through intent filters, verified App Links (Digital Asset Links), Navigation Component deep links, and Firebase Dynamic Links. iOS provides equivalent functionality through Universal Links (apple-app-site-association), custom URL Schemes, SwiftUI's .onOpenURL modifier, and Firebase Dynamic Links. This skill covers the full migration of deep linking infrastructure, verification setup, link handling, routing, and testing strategies.
| Android | iOS |
|---|---|
Intent filter <data> with scheme/host/path | URL Scheme (custom) or Universal Link |
App Links (verified, autoVerify="true") | Universal Links (AASA file) |
assetlinks.json on server | apple-app-site-association on server |
NavDeepLink in Navigation Component | .onOpenURL + router |
Intent.getData() / intent.data | URL from onOpenURL or NSUserActivity |
| Firebase Dynamic Links | Firebase Dynamic Links (iOS SDK) |
PendingDynamicLinkData | DynamicLink |
| Deferred deep links (Play Install Referrer) | Deferred deep links (Firebase / clipboard) |
TaskStackBuilder for synthetic back stack | Build NavigationPath manually |
Android (AndroidManifest.xml):
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="myapp" android:host="open" />
</intent-filter>
</activity>
iOS (Info.plist):
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.myapp.scheme</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
</dict>
</array>
iOS (handling in SwiftUI App):
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.onOpenURL { url in
// url == myapp://open/path?query=value
DeepLinkRouter.shared.handle(url)
}
}
}
}
Android (App Links - AndroidManifest.xml):
<activity android:name=".MainActivity">
<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="www.example.com"
android:pathPrefix="/items" />
</intent-filter>
</activity>
Android (Server - /.well-known/assetlinks.json):
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.example.myapp",
"sha256_cert_fingerprints": ["AA:BB:CC:..."]
}
}]
iOS (Associated Domains entitlement):
# In Signing & Capabilities, add Associated Domains: