含#符号的Deep link无法跳转至APP对应页面如何解决
带#符号的Deep Link无法跳转的解决方法
问题根因
URL中的#是标准的fragment分隔符,你使用的https://example.com/#/auth链接结构拆分如下:
- 协议(scheme):https
- 域名(host):example.com
- 路径(path):/
- 片段(fragment):/auth
Android Intent Filter的path、pathPrefix、pathPattern属性仅会匹配路径部分,不会识别#后的片段内容,因此你之前配置的android:pathPrefix="/#/auth"无法命中目标链接,导致跳转失败。
调整方案
1. 修改Manifest配置
调整data标签的匹配规则,仅匹配域名和根路径即可:
<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="https" android:host="example.com" android:path="/"/> </intent-filter>
这里使用android:path="/"而非pathPrefix,可以精准匹配根路径,避免误拦截https://example.com/xxx这类其他路径的链接。
2. Activity中二次校验分发
在目标Activity的onCreate或onNewIntent方法中解析Uri的fragment字段,判断是否为目标路径后再执行对应逻辑:
// Kotlin 示例 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) intent.data?.let { uri -> when (uri.fragment) { "/auth" -> { // 匹配目标链接,跳转对应认证页面 goToAuthPage() } else -> { // 非目标链接,跳转浏览器打开,避免影响其他链接访问 openInBrowser(uri) finish() } } } }
// Java 示例 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Uri uri = getIntent().getData(); if (uri != null) { String fragment = uri.getFragment(); if ("/auth".equals(fragment)) { goToAuthPage(); } else { openInBrowser(uri); finish(); } } }
可选优化方案
如果可以调整Deep Link的格式,建议去掉#将链接修改为https://example.com/auth,此时只需要将Manifest配置修改为android:pathPrefix="/auth"即可,不需要额外的代码校验,兼容性更好。
内容的提问来源于stack exchange,提问作者Mahdi Javaheri
相关产品推荐
相关产品推荐

