如何在Jetpack Navigation中启用不带斜杠"/"的DeepLink
这个问题的核心其实和Android系统的Intent Filter匹配逻辑直接相关,Jetpack Navigation的DeepLink规则是完全遵循这套逻辑的,咱们一步步拆解:
为什么带斜杠的规则能触发应用选择?
当你配置<deepLink app:uri="www.example.com/" />时,Jetpack Navigation会为你的应用生成对应的Intent Filter,其中指定了:
- Host为
www.example.com - Path精确匹配
/
而你用adb调用的https://www.example.com/,系统解析后它的路径部分就是/,完全符合这个Intent Filter的条件,所以系统会认为你的应用可以处理这个链接,弹出选择对话框。
为什么不带斜杠的规则不行?
如果你的规则是<deepLink app:uri="www.example.com" />,对应的Intent Filter的Path是空字符串。但这里有个关键:当你访问https://www.example.com(末尾无斜杠)时,Android系统会自动将其路径解析为/(根路径),而不是空字符串。这就导致你的DeepLink规则和实际的URI路径不匹配,系统找不到你的应用能处理这个链接,只能默认用浏览器打开。
有没有Jetpack Navigation原生方式支持不带斜杠的DeepLink?
Jetpack Navigation没有提供单个规则同时匹配空路径和/的原生开关,但可以通过以下两种原生方式实现需求:
1. 添加多个DeepLink规则
直接在导航图中同时配置两个规则,覆盖两种情况:
<deepLink app:uri="www.example.com" /> <deepLink app:uri="www.example.com/" />
这样不管链接末尾有没有斜杠,系统都能匹配到对应的Intent Filter,触发你的应用。
2. 使用路径通配符匹配
如果你想更灵活(比如同时匹配根路径和所有子路径),可以使用pathPattern风格的规则:
<deepLink app:uri="www.example.com/.*" />
这个规则会匹配www.example.com下所有路径(包括根路径/和无斜杠的情况),不过要注意它也会匹配www.example.com/page这类子路径,如果你只需要根路径,第一种方法更精准。
另外建议最好在规则中加上scheme(比如https://),避免匹配到其他scheme的链接:
<deepLink app:uri="https://www.example.com" /> <deepLink app:uri="https://www.example.com/" />
内容的提问来源于stack exchange,提问作者user3576118

