使用Navigation Component的Deep Link无法打开目标Fragment怎么办?
问题修复方案
一、解决系统不弹出应用打开选项的问题
- 首先确认你的
myproject.page.link域名对应的assetlinks.json文件已经正确部署,文件中需包含你应用的包名、正式及测试环境签名的SHA256指纹,路径为https://myproject.page.link/.well-known/assetlinks.json,可直接在浏览器访问确认是否可正常获取。 - 补充App Links自动验证配置,你可以选择两种方式实现:
- 直接在导航图的deepLink标签添加
app:autoVerify="true"属性,让自动生成的intent-filter包含自动验证配置 - 手动在MainActivity的清单配置中添加完整的intent-filter,代码如下:
<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:host="myproject.page.link" android:scheme="https" android:scheme="http" /> </intent-filter> - 直接在导航图的deepLink标签添加
- 测试时可以通过adb命令验证链接是否能匹配到你的应用:
adb shell am start -W -a android.intent.action.VIEW -d "https://myproject.page.link/i5sA" com.myproject,如果能直接拉起应用说明配置生效。
二、解决跳转后仅打开首页无法直达SecondFragment的问题
- 首先修复导航图中的ID匹配错误:你当前SecondFragment对应的节点id是
@+id/nav_library,但HomeFragment的跳转action中目标id写的是@id/secondFragment,两者不一致,请统一修改为相同id,示例修改如下:<fragment android:id="@+id/secondFragment" android:name="com.myproject.main.SecondFragment" android:label="@string/menu_library" tools:layout="@layout/fragment_library"> <deepLink android:id="@+id/deepLink" app:uri="https://myproject.page.link/*" app:autoVerify="true" /> </fragment> - 补充MainActivity的DeepLink处理逻辑:你需要在MainActivity的
onCreate和onNewIntent方法中,先解析Firebase动态短链得到真实目标链接,再交给NavController处理,示例代码如下:
核心逻辑说明:你点击的Firebase动态短链需要先通过Firebase SDK解析出配置的真实目标长链,再交给NavController匹配导航图中的deepLink规则,直接传递原始短链无法匹配到你配置的规则。// Kotlin 示例 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val navController = findNavController(R.id.nav_host_fragment) // 处理启动时的deepLink intent?.let { FirebaseDynamicLinks.getInstance() .getDynamicLink(it) .addOnSuccessListener { pendingDynamicLinkData -> pendingDynamicLinkData?.link?.let { deepLink -> navController.handleDeepLink(Intent().setData(deepLink)) } } } } override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) val navController = findNavController(R.id.nav_host_fragment) intent?.let { FirebaseDynamicLinks.getInstance() .getDynamicLink(it) .addOnSuccessListener { pendingDynamicLinkData -> pendingDynamicLinkData?.link?.let { deepLink -> navController.handleDeepLink(Intent().setData(deepLink)) } } } } - 如果你的动态链接目标长链不是
myproject.page.link域名下的地址,需要同步修改导航图中deepLink的uri规则匹配你的长链域名。
三、获取链接携带的参数
你在SecondFragment中可以通过arguments获取导航传入的参数,示例代码如下:
arguments?.let { args -> val paramValue = args.getString("你的参数名") }
内容的提问来源于stack exchange,提问作者Venkat
相关产品推荐
相关产品推荐

