You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android端Firebase Dynamic Links与React Navigation路由跳转异常排查

Firebase动态链接与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();
        };
    },
};

排查修复建议

  1. 修正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>
    
  2. 调整动态链接生成逻辑
    不要事后拼接路由,直接将完整深度链接传入link参数,自动完成编码:

    const link = await dynamicLinks().buildLink({
        link: "https://buildwebsitepro.com.au/casualjob/InvitedEmployee", 
        domainUriPrefix: "https://casualjobsyd.page.link/app",
    });
    
  3. 完善React Navigation路由映射
    确保config中配置了深度链接到路由的对应关系,同时添加深度链接域名到前缀列表:

    // 示例路由配置
    const config = {
        screens: {
            InvitedEmployee: "InvitedEmployee",
            // 其他路由映射...
        },
    };
    
    // 更新prefixes
    const linking = {
        prefixes: ["casualjob://", "https://casualjobsyd.page.link/app", "https://buildwebsitepro.com.au/casualjob"],
        // 其余配置不变...
    };
    
  4. 添加调试日志
    在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 05:50:11