Android深度链接配置中如何匹配URL的Fragment部分?
Android深度链接匹配URL Fragment的解决方案
Android系统的intent-filter不支持直接匹配URL的Fragment部分(即#后面的内容)。因为Fragment属于客户端侧的路由参数,不会被发送到服务器,Android在解析Intent的Data时也会自动忽略这部分内容,所以你用pathAdvancedPattern去匹配#开头的规则是无效的。
要实现你需要的“仅打开特定Fragment路由”的需求,可以按以下步骤处理:
1. 配置基础的深度链接Intent Filter
先配置一个能匹配目标域名所有HTTPS链接的Intent Filter,确保App能接收到该域名的深度链接请求:
<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:scheme="https" android:host="example.com" /> </intent-filter>
这里的autoVerify依然可以正常生效,因为它只验证scheme和host,不涉及Fragment部分。
2. 在App内手动校验Fragment路由
当App通过深度链接启动时,在入口Activity的onCreate或onNewIntent方法中,手动提取并校验Fragment内容:
Uri deepLinkUri = getIntent().getData(); if (deepLinkUri != null) { String fragment = deepLinkUri.getFragment(); // 校验Fragment是否符合白名单规则 if (fragment != null && fragment.startsWith("/whitelisted/")) { // 处理合法的深度链接路由 navigateToWhitelistedPage(fragment); } else { // 不符合规则,跳转到浏览器打开原链接 Intent browserIntent = new Intent(Intent.ACTION_VIEW, deepLinkUri); startActivity(browserIntent); finish(); } }
关键注意点
- 无法通过Intent Filter直接过滤Fragment路由,必须在App内部做逻辑判断
- 这种方式不会影响App Links的验证流程,因为验证只针对scheme和host
- 如果需要更复杂的路由匹配,可以用正则表达式对Fragment内容做更精细的校验
内容的提问来源于stack exchange,提问作者ssnielsen
相关产品推荐
相关产品推荐

