React Native Firebase动态链接Android端参数未传递问题咨询
Android端Firebase动态链接参数丢失问题(小米浏览器)
环境信息
"react-native": "0.67.4", "@react-native-firebase/app": "12.7.4", "@react-native-firebase/dynamic-links": "12.7.4", 设备: 小米9 浏览器: 小米浏览器 测试链接: https://sweeftdigital.page.link/transfer_tip?userId=3
测试情况
- 小米浏览器:点击动态链接直接打开App,但未传递userId参数
- Chrome浏览器:点击后询问打开方式,选择App则参数正常传递
现有配置代码
AndroidManifest配置
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.tipapp" > <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-feature android:name="android.hardware.camera" android:required="false" /> <uses-feature android:name="android.hardware.camera.front" android:required="false" /> <application android:name=".MainApplication" android:label="@string/app_name" android:icon="@mipmap/ic_launcher" android:allowBackup="false" android:usesCleartextTraffic="true" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:exported='true' android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode" android:launchMode="singleTask" android:screenOrientation="portrait" android:windowSoftInputMode="adjustResize" > <intent-filter android:autoVerify="true" > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <action android:name="android.intent.action.DOWNLOAD_COMPLETE" /> </intent-filter> <intent-filter > <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <!-- Accepts URIs that begin with "https://www.sweeftdigital.page.link/” --> <data android:scheme="https" android:host="sweeftdigital.page.link" /> <!-- Accepts URIs that begin with "tipapp://” --> <data android:scheme="tipapp" /> </intent-filter> </activity> </application> </manifest>
React Navigation Deeplink处理代码
const config = { screens: { webView: { path: '/transfer_tip', parse: { userId: (userId: any) => userId, }, }, authLoading: '*', }, }; const linking = { prefixes: ['tipapp://', 'https://sweeftdigital.page.link'], config: config, }; <NavigationContainer linking={linking} ...
问题
请问这是配置错误还是Firebase动态链接的正常行为?
问题原因
这是小米浏览器等国产自定义浏览器的跳转逻辑问题,并非Firebase动态链接或你的配置错误。这类浏览器在处理HTTPS动态链接时,可能会直接截取域名部分唤起App,忽略URL后的查询参数,导致参数丢失。
解决方案
- 拆分Intent Filter配置
将HTTPS和自定义Scheme的Intent Filter分开定义,避免浏览器解析冲突:
<!-- 保留原有的Launcher Intent Filter --> <intent-filter android:autoVerify="true"> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <action android:name="android.intent.action.DOWNLOAD_COMPLETE" /> </intent-filter> <!-- HTTPS动态链接单独配置Intent Filter --> <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="sweeftdigital.page.link" /> </intent-filter> <!-- 自定义Scheme单独配置Intent Filter --> <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="tipapp" /> </intent-filter>
- 手动监听Firebase动态链接回调
不依赖React Navigation的自动解析,直接通过Firebase SDK获取完整链接参数:
import dynamicLinks from '@react-native-firebase/dynamic-links'; import { useNavigation } from '@react-navigation/native'; import { useEffect } from 'react'; // 在App入口或根组件中添加监听 const App = () => { const navigation = useNavigation(); useEffect(() => { // 获取App启动时的初始链接 const fetchInitialLink = async () => { const initialLink = await dynamicLinks().getInitialLink(); if (initialLink?.url) { const urlParams = new URL(initialLink.url).searchParams; const userId = urlParams.get('userId'); if (userId) { navigation.navigate('webView', { userId }); } } }; fetchInitialLink(); // 监听后台唤起的链接 const linkSubscription = dynamicLinks().onLink(({ url }) => { const urlParams = new URL(url).searchParams; const userId = urlParams.get('userId'); if (userId) { navigation.navigate('webView', { userId }); } }); return () => linkSubscription(); }, [navigation]); // ... 其他组件代码 };
- 验证Firebase动态链接配置
确保Firebase控制台中创建动态链接时,"Deep link"字段包含完整的参数路径(如https://sweeftdigital.page.link/transfer_tip?userId=3),而非仅基础路径。
内容的提问来源于stack exchange,提问作者Beka Batmanashvili
相关产品推荐
相关产品推荐

