You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Android端向第三方应用实现Deferred deep-link的问题咨询

嘿,这个问题是Android延迟深度链接(Deferred Deep Linking)里非常典型的场景,咱们一步步拆解解决:

需求可行性说明

这个需求完全可行,但你当前的实现缺少了「安装后传递深度链接参数」的关键环节——用户从Play Store安装应用后首次打开时,Play Store不会自动把之前的深度链接参数传递给你的应用,所以需要手动做参数留存和恢复逻辑。

解决方案

下面是两种主流的实现方式,你可以根据场景选择:

方案1:利用Google Play Install Referrer API(官方推荐)

这是Google官方提供的获取安装来源的API,你可以在跳转Play Store时携带自定义参数,安装后通过API拿到参数再跳转指定页面。

步骤1:修改Play Store跳转逻辑,携带深度链接参数

在跳转Play Store的URL里添加referrer参数,把你的深度链接编码后传入:

private fun goToPlayStore() {
    // 对深度链接进行URL编码,避免参数冲突
    val encodedDeepLink = Uri.encode(deepLink)
    val playStoreUrl = "https://play.google.com/store/apps/details?id=com.myapp.xx&referrer=deep_link%3D$encodedDeepLink"
    val goToPlayStoreIntent = Intent(
        Intent.ACTION_VIEW, Uri.parse(playStoreUrl)
    ).apply {
        setPackage("com.android.vending")
    }
    activity.startActivity(goToPlayStoreIntent)
    activity.finish()
}

步骤2:集成Install Referrer API,在应用启动时解析参数

首先在build.gradle(Module级别)添加依赖:

dependencies {
    implementation "com.android.installreferrer:installreferrer:2.2"
}

然后在Application的onCreate或者启动页的onCreate中添加参数解析逻辑:

private fun handleDeferredDeepLink() {
    val referrerClient = InstallReferrerClient.newBuilder(this).build()
    referrerClient.startConnection(object : InstallReferrerStateListener {
        override fun onInstallReferrerSetupFinished(responseCode: Int) {
            when (responseCode) {
                InstallReferrerClient.InstallReferrerResponse.OK -> {
                    val response = referrerClient.installReferrer
                    val referrerParams = response.installReferrer
                    // 解析referrer参数中的深度链接
                    val uri = Uri.parse("?$referrerParams")
                    val targetDeepLink = uri.getQueryParameter("deep_link")
                    
                    targetDeepLink?.let {
                        // 用SharedPreferences标记是否已经处理过该链接,避免重复跳转
                        val sp = getSharedPreferences("deeplink_prefs", MODE_PRIVATE)
                        if (!sp.getBoolean("has_handled_deeplink", false)) {
                            val intent = Intent(Intent.ACTION_VIEW, Uri.parse(it))
                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                            startActivity(intent)
                            sp.edit().putBoolean("has_handled_deeplink", true).apply()
                        }
                    }
                }
                InstallReferrerClient.InstallReferrerResponse.FEATURE_NOT_SUPPORTED,
                InstallReferrerClient.InstallReferrerResponse.SERVICE_UNAVAILABLE -> {
                    // 处理不支持或服务不可用的情况,默认跳首页即可
                }
            }
            referrerClient.endConnection()
        }

        override fun onInstallReferrerServiceDisconnected() {
            // 服务断开时可尝试重新连接,或者忽略
        }
    })
}

方案2:自定义后端存储深度链接(适用于多渠道场景)

如果你的应用支持非Play Store渠道安装,或者需要更灵活的参数传递,可以搭建一个简单的后端接口:

  • 跳转Play Store前,将用户设备标识(比如合规的Advertising ID)和目标深度链接存储到后端。
  • 应用首次启动时,调用后端接口,根据设备标识获取对应的深度链接,完成跳转。
  • 后端需标记该设备已处理链接,避免重复跳转。
关于责任方的说明

这个功能不需要第三方应用负责,完全由你的应用和你可控的环节(比如Play Store跳转参数、后端存储)实现。第三方应用只需要触发你的跳转逻辑(比如打开你的应用深度链接、跳转你提供的中转页面),安装后的跳转逻辑全部由你的应用自行处理。

注意事项
  • 测试时不要用adb直接安装,需通过Play Store内部测试渠道或测试链接安装,否则Install Referrer可能无法获取参数。
  • 解析深度链接时要做好异常捕获,避免因链接格式错误导致崩溃。
  • 确保跳转逻辑只在应用首次打开时执行一次,避免每次启动都触发跳转。

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

火山引擎 最新活动