Deep Links
源:Android Deep Links | iOS Universal Links
Deep Links 允许通过 URL 直接打开应用特定页面。本文展示如何跨平台处理深度链接。
平台差异对比
| 平台 | 原生 API | URL Scheme | 验证机制 |
|---|---|---|---|
| Android | Intent Filter | myapp:// | App Links(需域名验证) |
| iOS | Universal Links | https:// 优先 | Associated Domains |
| Desktop | - | - | 无标准支持 |
标准代码块
kotlin
data class DeepLink(
val scheme: String,
val host: String,
val path: String,
val params: Map<String, String>
)
expect object DeepLinkHandler {
fun handleDeepLink(url: String, callback: (DeepLink) -> Unit)
}kotlin
import android.content.Intent
import android.net.Uri
actual object DeepLinkHandler {
fun handleIntent(intent: Intent, callback: (DeepLink) -> Unit) {
intent.data?.let { uri ->
val deepLink = parseUri(uri)
callback(deepLink)
}
}
actual fun handleDeepLink(url: String, callback: (DeepLink) -> Unit) {
val uri = Uri.parse(url)
callback(parseUri(uri))
}
private fun parseUri(uri: Uri): DeepLink {
val params = mutableMapOf<String, String>()
uri.queryParameterNames.forEach { key ->
uri.getQueryParameter(key)?.let { value ->
params[key] = value
}
}
return DeepLink(
scheme = uri.scheme ?: "",
host = uri.host ?: "",
path = uri.path ?: "",
params = params
)
}
}AndroidManifest.xml 配置
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 配置
xml
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
</dict>
</array>