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

Firebase Dynamic Link 多实例启动问题求助(WhatsApp/SMS场景)

解决Firebase动态链接延迟深度链接重复启动应用的问题

我之前在做Firebase动态链接的时候也踩过这个坑——从WhatsApp或者短信点链接,明明应用已经在后台跑着,结果又启动了一个新实例,着实头疼。下面几个方案亲测有效,你可以一步步试:

1. 调整应用的启动模式(核心修复)

Android默认的standard启动模式会给每个Intent创建新的Activity实例,这就是重复启动的根源。你需要把处理动态链接的主Activity的启动模式改成singleTask(推荐,不会完全隔离应用)或者singleInstance。

在AndroidManifest.xml里修改对应Activity的配置:

<activity
    android:name=".MainActivity"
    android:launchMode="singleTask">
    <!-- 主入口的Intent Filter -->
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <!-- Firebase动态链接的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:host="你的动态链接域名.page.link"
            android:scheme="https" />
    </intent-filter>
</activity>

2. 重写onNewIntent处理新链接

设置singleTask后,新的链接Intent会发送到已存在的Activity实例,而不是创建新的。这时候你需要在onNewIntent里重新处理动态链接,不能只在onCreate里处理。

以Kotlin为例,在MainActivity中添加:

override fun onNewIntent(intent: Intent?) {
    super.onNewIntent(intent)
    setIntent(intent) // 更新当前Activity的Intent
    handleDynamicLink(intent) // 统一处理链接逻辑
}

private fun handleDynamicLink(intent: Intent?) {
    Firebase.dynamicLinks
        .getDynamicLink(intent)
        .addOnSuccessListener { pendingLinkData ->
            pendingLinkData?.link?.let { deepLink ->
                // 这里写你的深度链接跳转逻辑,比如打开商品页、详情页
                navigateToTargetPage(deepLink)
            }
        }
        .addOnFailureListener { error ->
            Log.w("DynamicLinkError", "获取链接失败", error)
        }
}

记得在onCreate方法里也调用一次handleDynamicLink(intent),保证首次启动时也能处理链接。

3. 给动态链接添加包名参数(针对第三方应用适配)

有些应用(比如WhatsApp)会对链接做一层包装,可能导致唤起逻辑异常。你可以在创建动态链接时添加apn参数,明确指定应用包名,确保链接直接指向你的应用。

比如创建链接时带上:

https://你的动态链接域名.page.link/?link=https://你的应用域名/深层路径&apn=com.your.app.package

4. 验证唤起逻辑是否正常

用adb命令测试一下,看看Intent传递是否正确:

adb shell am start -a android.intent.action.VIEW -d "https://你的动态链接域名.page.link/测试链接"

如果测试时能直接唤起后台的应用实例,并触发onNewIntent,说明配置没问题;如果还是有问题,可能是第三方应用的特殊处理,这时候可以考虑在应用启动时(比如onResume)主动检查最近的动态链接:

override fun onResume() {
    super.onResume()
    Firebase.dynamicLinks
        .getDynamicLink(intent)
        .addOnSuccessListener { /* 处理逻辑 */ }
}

如果是iOS端遇到类似问题,记得把Info.plist里的UIApplicationSupportsMultipleScenes设为NO,或者在SceneDelegate的scene(_:openURLContexts:)方法里处理动态链接。


内容的提问来源于stack exchange,提问作者Deepak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:20:45