You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin安卓开发中Firebase Dynamic Links如何携带自定义参数

问题根因

出现空白页的核心原因有两点:

  • AndroidManifest中写死了每一条地点路径的匹配规则,现有逻辑未对动态链接返回的Uri做路径解析
  • 动态链接唤起Activity时,地点参数存储在Uri路径中,不会自动写入Intent的extra字段,现有逻辑仅靠getStringExtra()读取参数,无法拿到有效值,页面无渲染数据就会显示空白

分步修复方案

1. 精简AndroidManifest路径匹配规则

删掉所有写死单个id的<data>标签,改用通配符匹配同分类下的所有id路径,后续新增地点不需要重复修改Manifest配置:

<activity
    android:name=".food.Category"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.DEFAULT"/>
        <category android:name="android.intent.category.BROWSABLE"/>
        <!-- 匹配Drinks/CoffeeShops下所有id路径 -->
        <data 
            android:host="myapp.page.link" 
            android:scheme="https" 
            android:pathPattern="/Drinks/CoffeeShops/.*/"/>
        <!-- 匹配Food/FastFood下所有id路径 -->
        <data 
            android:host="myapp.page.link" 
            android:scheme="https" 
            android:pathPattern="/Food/FastFood/.*/"/>
        <!-- 后续新增分类直接追加对应通配规则即可 -->
    </intent-filter>
</activity>

2. 补全onNewIntent回调处理

如果Activity启动模式配置为singleTask/singleTop,动态链接唤起时不会重新走onCreate生命周期,会触发onNewIntent回调,需要手动更新Intent后再检测动态链接:

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    setIntent(intent)
    checkForDynamicLinks()
}

3. 重写动态链接解析逻辑

拿到动态链接返回的deepLink后,直接解析Uri路径片段提取分类和id参数,复用原有页面渲染逻辑,不需要依赖Intent extra传值:

private fun checkForDynamicLinks() {
    FirebaseDynamicLinks.getInstance().getDynamicLink(intent)
        .addOnSuccessListener { pendingDynamicLinkData ->
            Log.i("Share", "We have a dynamic link!")
            val deepLink = pendingDynamicLinkData?.link ?: return@addOnSuccessListener
            
            Log.i("Share" , "Deep link Url: ${deepLink}")
            // 按斜杠分割路径,过滤空字符
            val pathSegments = deepLink.pathSegments.filter { it.isNotBlank() }
            // 路径格式校验:必须满足[一级分类, 二级分类, 地点id]的结构
            if (pathSegments.size < 3) return@addOnSuccessListener

            val primaryCategory = pathSegments[0]
            val secondaryCategory = pathSegments[1]
            val placeId = pathSegments[2]

            // 匹配分类,和原有extra参数逻辑对齐,直接触发页面渲染
            when {
                primaryCategory == "Drinks" && secondaryCategory == "CoffeeShops" -> {
                    // 直接复用原有拿到DrinksCoffeeShops参数后的加载逻辑,传入placeId即可
                    loadCoffeeShopDetail(placeId)
                }
                primaryCategory == "Food" && secondaryCategory == "FastFood" -> {
                    // 直接复用原有拿到FoodFastFood参数后的加载逻辑,传入placeId即可
                    loadFastFoodDetail(placeId)
                }
                // 其他分类匹配逻辑按相同规则补充
            }
        }
        .addOnFailureListener {
            Log.e("Share", "Retrieve dynamic link failed", it)
        }
}

4. 修复现有代码的显性错误

onOptionsItemSelected的分享逻辑存在变量名错误:前面定义的快餐id变量是foodFastFood,下方判断分支写的是fastFood.toIntOrNull(),会直接触发编译错误,改成对应变量名即可。

注意:当前生成动态链接时直接把myapp.page.link域名地址作为deepLink传入可以正常工作,如果后续遇到解析循环问题,可以把deepLink换成自定义scheme格式(比如myapp://Drinks/CoffeeShops/1/),同时在Manifest的intent-filter里加上对应scheme的匹配规则即可。


内容的提问来源于stack exchange,提问作者Qwip Business

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:21:29