深层链接打开错误的应用程序(即时应用程序,未安装的应用程序)

Posted

技术标签:

【中文标题】深层链接打开错误的应用程序(即时应用程序,未安装的应用程序)【英文标题】:Deep Link opens wrong app (instant app, not installed app) 【发布时间】:2021-02-25 00:04:12 【问题描述】:

我在安装免安装应用和已安装应用(版本)时遇到了深层链接问题。我的设置如下:

基础应用 (com.android.application) 已安装的应用程序(com.android.dynamic-feature with dist:instant="false", dist:onDemand="false")

Manifest.xml:

<application>
   <activity
      android:name=".Activity1">
      <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="example.com"
            android:pathPattern="/deeplink/*" />
      </intent-filter>
      ...
Instant App(com.android.dynamic-feature with dist:instant="true", dist:onDemand="false")

Manifest.xml:

<application>
   <activity
      android:name=".Activity2">
      <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="example.com"
            android:pathPattern="/deeplink/*" />
      </intent-filter>
      ...

(请注意,已安装应用的清单定义了 Activity1,而免安装应用的清单定义了 Activity2)

问题是,当我打开带有深层链接的已安装应用时,它会打开 Activity2(免安装应用的 Activity)而不是已安装应用的 Activity。

我了解 gradle 对动态功能模块和将所有 3 个清单合并在一起的基本应用(基本应用、已安装应用、即时应用)进行清单合并。但我认为如果设备上存在已安装应用的 Activity 来启动应用,Android 会足够智能。

所以我的问题是:如何在已安装的应用和免安装应用中同时支持相同的深层链接?也就是说:如果没有安装应用,使用免安装应用的Activity(Activity2)打开深层链接,如果安装了应用,使用已安装应用的Activity(Activity1)打开深层链接?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

以防万一其他人遇到这个问题:

事实证明,它与意图过滤器无关。相反,在 Android Studio 的运行配置中,您需要在“安装选项”中选择“应用包中的 APK”而不是“默认 APK”(这是默认选择)。一旦你这样做了,就会启动正确的动态功能。

【讨论】:

【参考方案2】:

在您的示例意图过滤器中,您用于启动意图的数据侦听完全相同的 URL 模式。 通常不鼓励这样做,因为您的 AndroidManifest 中只有一个条目能够从 Android 框架接收此意图。

即时启用的模块不需要区分已安装的模块,尤其是当它具有相同的入口点时。即时或安装对用户来说是不透明的,因此他们不会期望会有截然不同的行为。

如果需要区分即时状态和安装状态,可以使用PackageManager.isInstantApp(),根据返回值执行不同的代码。

【讨论】:

感谢键盘侠的回答。即时启用的模块实际上与已安装的模块没有区别。他们俩都不认识对方。它们只是具有相同的意图过滤器。这个想法是,如果用户点击一个链接并且安装的模块不存在,那么即时应用程序就会启动,如果是,安装的应用程序就会启动。

以上是关于深层链接打开错误的应用程序(即时应用程序,未安装的应用程序)的主要内容,如果未能解决你的问题,请参考以下文章

深层链接未从 Facebook 帖子打开应用程序

带有颤动的 Firebase 动态链接:深层链接 URL 未打开应用程序

使用 branch.io 来自 Play 商店的 Android 深层链接

Branch 打不开 App Store 链接

iOS Branch.io 深层链接不会打开已安装的应用程序,并且始终重定向到应用程序商店,但共享的第一个链接除外

在 facebook 上显示从 google play store 弹出的即时安装