深层链接打开错误的应用程序(即时应用程序,未安装的应用程序)
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()
,根据返回值执行不同的代码。
【讨论】:
感谢键盘侠的回答。即时启用的模块实际上与已安装的模块没有区别。他们俩都不认识对方。它们只是具有相同的意图过滤器。这个想法是,如果用户点击一个链接并且安装的模块不存在,那么即时应用程序就会启动,如果是,安装的应用程序就会启动。以上是关于深层链接打开错误的应用程序(即时应用程序,未安装的应用程序)的主要内容,如果未能解决你的问题,请参考以下文章
带有颤动的 Firebase 动态链接:深层链接 URL 未打开应用程序
使用 branch.io 来自 Play 商店的 Android 深层链接