如何在构建时使用占位符和导航组件创建 Deeplink

Posted

技术标签:

【中文标题】如何在构建时使用占位符和导航组件创建 Deeplink【英文标题】:How can you create a Deeplink using placeholders and nav component at build time 【发布时间】:2019-12-21 02:31:57 【问题描述】:

我们有一个使用 Deeplinks 的应用程序。我们还使用 android Navigation 组件。

目前我们在导航.xml 文件中配置我们的深层链接,这工作正常,但我们现在需要能够在构建时基于设置的环境变量添加另一个深层链接。

我尝试在 build.gradle 中设置字符串资源并在 navigation.xml 中引用这些资源。

我也尝试在 navigation.xml 中设置一个占位符,但无法替换它,因为它已被解析为 URI。

我还尝试在 Manifest 中使用占位符设置直接意图过滤器,这将起作用,但我们失去了导航组件的良好路由。

目前我们在 out navigation.xml 文件中配置我们的 Deeplinks,格式如下:

 <deepLink
            android:autoVerify="true"
            app:uri="foo.bar.baz/pull/quxArg/quuxArg" />

我们现在需要能够在构建时基于一组 Envar 创建额外的 Deeplink。

示例:

DEEPLINK_ENVAR = "replacement.com"

Build.gradle:

manifestPlaceholders = [deeplink:DEEPLINK_ENVAR]

navigation.xml:

<deepLink
            android:autoVerify="true"
            app:uri="$deeplink/pull/quxArg/quuxArg" />

请注意上述方法不起作用。

如果这只是 Manifest 中的一个意图过滤器,我们可以使用 Manifest 占位符来完成此任务并将它们设置在 app.gradle 中。然而,在 navigation.xml 中设置的深层链接被解析为 URI,并在替换之前销毁所有占位符。

有没有人尝试过类似的事情?我试图避免必须运行预构建脚本来直接对导航文件进行模板化。

期望的结果:

我希望能够在构建时添加额外的深层链接(实际上是 4 个到不同的目的地),同时使用 Android 导航组件。

【问题讨论】:

你能解决这个问题吗?我陷入了同样的境地。我想为深层链接提供动态方案,我可以通过编程方式添加。 这个问题你解决了吗??我有同样的问题 @Flint 你能解决这个问题吗? @Flint,这里有更新吗?我的“备份”解决方案是将整个图表复制到不同的产品风格/构建类型文件夹中,但维护起来会很糟糕...... 【参考方案1】:

不确定我是否完全理解,但是... 您应该能够将多个深度链接添加到单个操作中。 如果您需要它重定向到不同的片段,您可以尝试使用“deepLinkTokenCheckFragment”或其他东西,它接收 deepLink,然后从中提取信息,并可以将用户重定向到您希望他们去的页面。

我有一个应用程序可以做这样的事情

    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
            
        
    

这只是我如何做到的一个想法。

以同样的方式,您可以检查构建或需要与之进行比较的任何内容,而不是检查某些令牌。

【讨论】:

【参考方案2】:

导航目的地:

public final void addDeepLink (String uriPattern)

添加指向此目的地的深层链接。发送到 NavController.handleDeepLink(Intent)NavController.navigate(Uri) 的匹配 Uris 将触发导航到此目的地。

https://developer.android.com/reference/androidx/navigation/NavDestination.html#addDeepLink(java.lang.String)

这听起来可以帮助你。 我自己没有测试过。

【讨论】:

以上是关于如何在构建时使用占位符和导航组件创建 Deeplink的主要内容,如果未能解决你的问题,请参考以下文章

使用 std::bind 占位符和 boost 库的问题

缩小占位符文本后如何使占位符和文本框光标居中?

占位符和参数的区别

如何在 React Material UI TextField 中居中占位符和文本

使用占位符和错误验证为 CreateView 和 UpdateView 制作自定义模板

如何更改 UISearchBar 占位符和图像色调颜色?