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
相关产品推荐
相关产品推荐

