Android端Firebase Dynamic Links与React Navigation路由跳转异常排查
动态链接可成功唤起Android应用,但无法导航至正确路由,暂未配置iOS端,怀疑是配置项有误,请求协助排查。
测试情况
- 可正常唤起应用并跳转至正确路由的命令:
adb shell am start -W -a android.intent.action.VIEW -d casualjob://InvitedEmployee com.casualjob - 仅能唤起应用但无法跳转至正确路由的命令:
npx uri-scheme open "https://casualjobsyd.page.link/app?link=https%3A%2F%2Fbuildwebsitepro.com.au%2Fcasualjob%2FInvitedEmployee" --android - 链接预览
https://casualjobsyd.page.link/app?d=1可正常返回动态链接树,https://casualjobsyd.page.link/.well-known/assetlinks.json可返回正确JSON数据。
Firebase控制台配置
- 动态链接名称:
https://casualjobsyd.page.link - 短动态链接:
https://casualjobsyd.page.link/app - 深度链接:
https://buildwebsitepro.com.au/casualjob
AndroidManifest.xml配置
... <activity android:name=".MainActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode" android:launchMode="singleTask" android:windowSoftInputMode="adjustResize" android:exported="true" > <intent-filter android:autoVerify="true"> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </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="casualjob"/> </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="http" android:host="casualjobsyd.page.link/app"/> <data android:scheme="https" android:host="casualjobsyd.page.link/app"/> </intent-filter> </activity> ...
动态链接生成代码
const link = await dynamicLinks().buildLink({ link: "https://buildwebsitepro.com.au/casualjob/", domainUriPrefix: "https://casualjobsyd.page.link/app", }); const linkSentToUser = link + "InvitedEmployee"; // 生成结果:"https://casualjobsyd.page.link/app?link=https%3A%2F%2Fbuildwebsitepro.com.au%2Fcasualjob%2FInvitedEmployee"
React Navigation动态链接配置
const linking = { prefixes: ["casualjob://", "https://casualjobsyd.page.link/app", ], config: config, async getInitialURL() { const { isAvailable } = utils().playServicesAvailability; if (isAvailable) { const initialLink = await dynamicLinks().getInitialLink(); if (initialLink) { return initialLink.url; } } const url = await Linking.getInitialURL(); return url; }, subscribe(listener) { const unsubscribeFirebase = dynamicLinks().onLink(({ url }) => { listener(url); }); const linkingSubscription = Linking.addEventListener("url", ({ url }) => { listener(url); }); return () => { unsubscribeFirebase(); linkingSubscription.remove(); }; }, };
排查修复建议
修正AndroidManifest意图过滤器
动态链接的<data>配置错误,android:host应仅填写域名,路径部分用pathPrefix匹配,修改后代码:<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="http" android:host="casualjobsyd.page.link" android:pathPrefix="/app"/> <data android:scheme="https" android:host="casualjobsyd.page.link" android:pathPrefix="/app"/> </intent-filter>调整动态链接生成逻辑
不要事后拼接路由,直接将完整深度链接传入link参数,自动完成编码:const link = await dynamicLinks().buildLink({ link: "https://buildwebsitepro.com.au/casualjob/InvitedEmployee", domainUriPrefix: "https://casualjobsyd.page.link/app", });完善React Navigation路由映射
确保config中配置了深度链接到路由的对应关系,同时添加深度链接域名到前缀列表:// 示例路由配置 const config = { screens: { InvitedEmployee: "InvitedEmployee", // 其他路由映射... }, }; // 更新prefixes const linking = { prefixes: ["casualjob://", "https://casualjobsyd.page.link/app", "https://buildwebsitepro.com.au/casualjob"], // 其余配置不变... };添加调试日志
在getInitialURL和subscribe的回调中打印接收的URL,确认链接是否正确传递:async getInitialURL() { // ...原有代码 if (initialLink) { console.log("Firebase initial link:", initialLink.url); return initialLink.url; } const url = await Linking.getInitialURL(); console.log("Linking initial URL:", url); return url; }, subscribe(listener) { const unsubscribeFirebase = dynamicLinks().onLink(({ url }) => { console.log("Firebase onLink URL:", url); listener(url); }); const linkingSubscription = Linking.addEventListener("url", ({ url }) => { console.log("Linking event URL:", url); listener(url); }); // ...原有代码 },
内容的提问来源于stack exchange,提问作者Bilal Abdeen
相关产品推荐
相关产品推荐

