Flutter中FirebaseDynamicLinks跨Host链接无法被onLink.listen捕获
问题解决思路
问题出在哪
onLink.listen默认只会监听和当前应用uriPrefix同Host的链接,哪怕你允许列表里加了另一个Host的规则,跨Host的链接还是不会被触发拦截——多数路由库都默认这么限制,避免误处理外部链接。
具体调整步骤
1. 给路由库添加双Host前缀
拿常用的React Navigation举例,你需要把两个Host都加到prefixes配置里,让路由库明确这两个Host的链接都属于它的处理范围:
const linking = { prefixes: ['https://testshare.host.us', 'https://test.host.us'], config: { screens: { // 此处填写你的路由映射配置 }, }, };
如果用的是其他路由库,找类似「允许的前缀」「Host白名单」的配置项,把两个Host都添加进去即可。
2. 检查并优化允许列表正则
你当前的两个正则规则本身没问题,但可以稍微调整得更灵活,避免匹配遗漏:
^https:\/\/testshare.host.us\/?(\?id=[0-9]{1,10}&type=[A-Za-z]+)?$
不过核心还是要让路由库识别跨Host链接属于可拦截范围,正则只是辅助匹配。
3. 手动编写拦截逻辑兜底
如果默认配置不生效,直接自定义监听逻辑,手动判断链接是否符合规则:
import { Linking } from 'react-native'; Linking.addEventListener('url', (event) => { const targetUrl = event.url; // 把允许规则整理成正则数组 const allowedRules = [ /^https:\/\/testshare.host.us\/?id=[0-9]{1,10}&type=[A-Za-z]+/, /^https:\/\/test.host.us\/.*$/ ]; // 匹配任意一条规则就执行处理逻辑 if (allowedRules.some(rule => rule.test(targetUrl))) { // 此处填写你的链接处理逻辑 handleDeepLink(targetUrl); } });
关键系统配置提醒
不管用哪种方法,都要在iOS的Info.plist或Android的AndroidManifest.xml中,把两个Host都配置为应用可处理的链接,否则系统不会把对应链接传递给你的应用。
内容的提问来源于stack exchange,提问作者astheras
相关产品推荐
相关产品推荐

