我们有一个利用深度链接的应用程序。 我们还使用安卓导航组件。
目前,我们在 out navigation.xml 文件中配置了我们的深度链接,这工作正常,但现在我们需要能够在构建时根据设置的环境变量添加另一个深度链接。
-
我尝试在build.gradle中设置字符串资源并在导航.xml中引用这些资源。
-
我还尝试在导航中设置占位符.xml但无法替换它,因为它已被解析为 URI。
-
我还尝试使用占位符在清单中设置直接意图过滤器,这将起作用,但我们失去了导航组件的良好路由。
目前,我们以以下形式配置导航.xml文件中的深度链接:
<deepLink
android:autoVerify="true"
app:uri="foo.bar.baz/pull/{quxArg}/{quuxArg}" />
我们现在要求能够在构建时基于集合 Envar 创建一个额外的 Deeplink。
例:
DEEPLINK_ENVAR = "replacement.com"
Build.gradle:
manifestPlaceholders = [deeplink:DEEPLINK_ENVAR]
导航.xml:
<deepLink
android:autoVerify="true"
app:uri="${deeplink}/pull/{quxArg}/{quuxArg}" />
请注意,上述内容不起作用。
如果这只是清单中的一个意图过滤器,我们可以使用清单占位符来完成此任务并在 app.gradle 中设置它们。但是,在导航中设置的深度链接.xml被解析为 URI,并在替换之前销毁任何占位符。
有没有人尝试过类似的事情? 我试图避免必须运行预构建脚本来直接模板化导航文件。
期望的结果:
我希望能够在构建时添加一个额外的深度链接(实际上是 4 个指向不同的目的地(,同时使用 Android 导航组件。
不确定我是否完全理解,但是... 您应该能够向单个操作添加多个深层链接。 如果你需要它重定向到不同的片段,你可以尝试使用"deepLinkTokenCheckFragment"或其他东西,它接收深度链接,然后从中提取信息,并可以将用户重定向到您希望他们访问的页面。
我有一个应用程序可以做这样的事情
private fun extractAction() {
if (ACTION_VIEW == parent.intent.action) {
// Collect information to know where to redirect here.....
val actionType = parent.intent.data
?.toString()
?.substringBefore('?')
?.substringAfterLast('/')
action = get information or token from the url here //?.substringBefore('?') ?.substringAfterLast('/')
when (action) {
"change_password" -> go to change password screen
"change email" -> go to change email screen
"go to other" -> go to other screen
}
}
}
这只是我是如何做到的一个想法。
同样,您可以检查构建或需要与之比较的任何内容,而不是检查某些令牌。
NavDestination:
public final void addDeepLink (String uriPattern)
添加指向此目标的深层链接。发送到
NavController.handleDeepLink(Intent)
或NavController.navigate(Uri)
的匹配 Uri 将触发导航到此目标。
https://developer.android.com/reference/androidx/navigation/NavDestination.html#addDeepLink(java.lang.String(
这听起来可以帮助你。 我自己还没有测试过。