在一个DeepLink中从网络到应用程序



Android应用程序是站点或服务的反映,通常在方便的外壳中表示类似的功能。 因此,迫切需要解决Web页面与已安装客户端之间的导航问题。 为了解决这个问题,发明了深层链接。 在猫下,您会发现一个有趣的故事,关于我们如何在家中实现它们以及如何在用户尚未安装我们的应用程序的情况下进行处理。

深度链接是很久以前发明的,现在很难想象没有它们的应用程序。 该技术本身不需要新的Android API,但是,如果您完成了应用索引编制,则可能会遇到与API 17兼容的事实。

让我们回到深层链接。 它们的配置是应用程序清单中用于意图过滤器的一组设置,这些设置描述了受支持的链接的模式。

例如:

<intent-filter><data android:host="best.memes" android:pathPrefix="/memes" android:scheme="http" /> <data android:host="best.memes" android:pathPrefix="/jokes" android:scheme="https" /></intent-filter> 

经过这些简单的操作,每次您单击与过滤器设置匹配的链接时,都会为用户提供包括您的应用程序在内的多个应用程序之间的选择。 接下来,为其设置了意图过滤器的活动将收到一个包含链接的意图。 如果使用Intent#getData方法获取它并解析必要的参数,则可以立即将用户定向到感兴趣的部分。

在实施之后,可能会出现一个合理的问题:如果用户还没有该应用程序该怎么办? 答案将是特殊的链接,在这种情况下,它可以将一个人引导到市场。 通过尽职调查,您可以自己生成这样的链接,但不能保证该链接将在所有浏览器以及所有版本的Android上都可以使用。 现在,有很多服务提供了至少部分解决这些问题的解决方案,例如,带有OneLink的AppsFlyer或带有DynamicLink的Firebase。 它们都以大致相同的方式工作,只有DynamicLink使用预先安装的Google服务来处理Diplink。

万联


OneLink本身通向AppsFlyer服务器; 他们确定用户从哪个设备进入网络,然后将其重定向到适当的地址。 您可以为台式机,Android和iOS设置重定向。 安装Android应用程序后,链接会通过Intent作为常规的深层链接进入该应用程序。 如果没有应用程序,则Google Chrome和Google Play会发挥作用。

应用程序的存在由浏览器检查。 Chrome具有针对特定链接格式的规范,然后将其转换为Intent并发送给系统。 它提供了在未安装应用程序的情况下设置指向Google Play的链接的功能。 可以在这里找到更多详细信息。

通常,在Google Play上,您可以通过以下方式将链接转移到应用程序:安装和启动后,它将进一步跳过部分链接。 这是使用查询参数url实现的,看起来像这样:

play.google.com/store/apps/details?id=memes.best&url=https%3A%2F%2Fbest.memes%2Fjokes

在这种情况下, best.memes /笑话将作为深度链接安装后进入应用程序。 默认情况下,AppsFlyer不能以这种方式工作:它提供了通过库界面获取链接的方法。 深度链接本身显然是通过服务服务器传输到应用程序的。

 AppsFlyerLib.getInstance().init(KEY, new AppsFlyerConversionListener() { @Override public void onInstallConversionDataLoaded(final Map<String, String> map) { } @Override public void onInstallConversionFailure(final String s) { } @Override public void onAppOpenAttribution(final Map<String, String> map) { } @Override public void onAttributionFailure(final String s) { } }, mContext); 

这非常不方便,因为首先,我们无法确定我们是否需要等待一些参数,或者用户是否只是单击了该图标而没有任何参数。 其次,我们要立即打开应用程序的所需部分,而无需不必要的锁定和期望。 AppsFlyer提供打开主屏幕的功能,并在参数到达时(以及它们到达时)进行重定向。 这种方法不适合我们,因此我们在Google Play上生成了带有参数的网址,用于用户点击Android设备上的DIP链接而没有应用程序的情况。 我们在Onelink中对其进行了设置,以在应用程序中获得深层链接,而不必等待该库。

在我们尝试将其链接到Slack之前,OneLink可以正常工作。 事实是他通过Chrome自定义标签在内置浏览器中打开链接。 简而言之,这是一个浏览器选项卡,可在您的应用程序期间打开,并且可以对其进行自定义,以免脱离常规样式(更多详细信息,请参见此处 )。 在这种情况下,将打开Goog​​le Play的网络版本,安装后不会转发到该应用程序的DIP链接。 同样,如果您将OneLink复制到地址栏中并点击链接,浏览器的行为也一样。 关于这种情况,Chrome开发人员在多个版本的发行说明中曾写过。 最重要的是,使用这种方法,当未安装应用程序时,Google Play上的重定向将无法在浏览器中运行,并且用户仍然可以上网。 OneLink无法克服此问题,因此我们转向DynamicLink。

动态链接


Google Play服务在系统中的深度集成使他们可以优化设备上目标应用程序的可用性。 这是一个封闭的生态系统,因此无法彻底了解其操作原理,但是,所有迹象都表明Chrome浏览器正在启动一项由Google Play服务拥有的具有进度的活动,该活动决定了如何通过深层链接对其进行处理。 在那之后,重定向要么发生在Google Play上,要么发生在应用程序中。 在这种情况下,然后,深层链接通过Intent进入应用程序,也就是说,无需附加库约束。

从主观上讲,这种方法不能比OneLink更快,但是当您在Chrome“自定义标签”中打开链接时,它可以使用,这是一个重要的优势,因为许多应用程序都使用它们。

除其他外,Firebase允许您查看链接的工作方式以及在每种情况下在每个平台上将用户重定向到的位置。 看起来像这样:


结论


作为总结,我准备了一个数据透视表。 我认为OneLink可以理解为任何竞争性解决方案,因为只有DynamicLink才能访问Google Play服务,因此,其他服务之间不应有任何重大差异。
万联 已安装目标应用程序万联 未安装目标应用程序动态链接 已安装目标应用程序动态链接 未安装目标应用程序
系统已打开链接(ACTION_VIEW)+我必须“加强”以在一开始就获得深层链接++
链接在Chrome自定义标签中打开----++
单击浏览器中的链接+我必须“加强”以在一开始就获得深层链接++
链接被复制到地址栏----++

该表显示,在使用DynamicLinks的实现中,所有内容都可以正常运行,并且在所有情况下对我们都很有趣。

有用的链接:


感谢您的关注! 我将很高兴在评论中讨论您如何解决类似的问题。

Source: https://habr.com/ru/post/zh-CN477602/


All Articles