查看原文
其他

DeepLink,链接app世界

九心 鸿洋
2024-08-24

本文作者


作者:九心

链接:

https://juejin.cn/post/7341720847880798235

本文由作者授权发布。


1DeepLink是什么?

首先给各位同学看一个定义:
深层链接是指任何架构的 URI,可将用户直接转到应用中的特定部分。--Android官网
https://developer.android.com/training/app-links/deep-linking?hl=zh-cn

可以看到,DeepLink能做的不仅是唤起了当前应用,还跳转到应用中的特定部分。

2为什需要DeepLink?

在网页时代,网站之间的引流比较简单,通过一个超链接,就能完成网页之间的跳转。
而在移动互联时代,用户往往聚焦于头部的App,常用的也就那十几二十个App,增量变成了一件很困难的事情。
俗话说,背靠大树好乘凉,所以,大家经常可以看到,一方面经常需要让巨头App给自家的应用导流;另外一方面,我们接入的广告SDK,将我们的流量导出。这些都涉及到应用之间的跳转,这也是Deeplink做的事情。如下图中的Q阅中的换量和掌盟广告中的SDK:
QQ阅读签到中的换量掌盟中广告页


3DeepLink存在的几种形式?

我们先看一下,如果要接入Deeplink,可以使用的技术有:
  • 注册URL Scheme(Android和iOS)
  • 特殊Deeplink(支持Http和Https):Android中有App Links,iOS中则有Universal Links
  • Deferred Deeplink(延迟深度链接):除了普通Deeplink的功能,还针对于未安装应用的场景,安装后,能够复原H5内的应用场景。
我们分别详细的聊一聊。

1、URL Scheme

一个 URL Scheme 可以分为四个部分:
  • Scheme:业务标识。
  • host:域名,用来指定对应的页面。
  • Path:页面路径,可用也可以不用。
  • query:携带的参数。
比如,微信扫一扫的 URL:
// 微信扫一扫,精度为1,打开闪光灯,这些参数是我编的
weixin://dl/scan?level=1&light=1
在这个 URL 里面:
  • Scheme:weixin
  • host:dl
  • path:/scan
  • query:level=1&light=1,我们可以查询到对应的参数扫码的精细度 level 和是否打开闪光灯 light。
在我们的 App 里注册完 URL,就可以响应应用之间的唤起了。但是,URL Scheme 也有一些问题:
  1. 不能处理未安装:用户未安装该应用的场景,不能响应。
  2. 不同应用可监听相同URL:这种情况需要交给用户自己选择。

2、Android App Links 和 iOS Universal Links

Android App Links 和 iOS Universal Links 都可以很好的解决用户在未安装App场景下的跳转问题。

简单来说,他们都允许配置一个网站,在应用没有安装的时候,链接不会失效,会跳转自己App中配置的网站,而在链接中正常的时候,又回跳转到具体的业务场景。


  
这就可以解决了之前的 URL 中的问题:
  1. 应用未安装:针对应用未安装的情况,可以跳转到指定的网页,在网页中可以做特殊的处理。
  2. 不同应用可以监听同一URL:由于使用的是HTTP\HTTPS问题,避免了这样的情况。
但是,在 Android 中,各大应用在在处理这一类链接的时候,并不会直接将这些 URL 交给我们的系统处理,比如说微信。因此,Android App Links 生效的场景就比较有限了。

3、H5链接

现在很多公司,都会选择使用H5链接做唤起起点。比如说下面的京东金融:


  
使用H5的流程: 
 

具体的一些流程我们可以查看这个链接:深度链接(Deeplink)技术助力APP运营,实现病毒式用户增长。

https://mp.weixin.qq.com/s/fWBDfd-7al7MsY0zwDn6dA


使用H5的链接的优点是,可以更加灵活的使用策略。
如果当前未安装应用,且当前环境允许的情况,我们可以直接下载APK,减少各种跳转,带来的用户流失;即便当前环境不允许,我们也可以引导到浏览器打开直接下载或者跳转到应用市场。当然,后续的跳转我们仍然需要借助 URL 或者其他 Links。
使用 H5 的缺点是,增加一个进入网页的环节,不过,研发也想了一些对应的策略,比如说,进入H5链接以后,自动的唤起对应的应用。

4、Deferred deeplink

Deferred deeplink 就更强了,你可以认为它是前面一些技术的增强。针对未安装的场景,它能够在安装启动后,还原目标落地页的场景。比如说,上面的小红书:
小红书H5小红书端内

打开H5 、下载小红书、 安装、启动后还原《10分钟美味早餐》的链接。本质上,Deferred deeplink 是前面技术的补充,目前主要的技术方案有:

  • 剪贴板:点击下载的时候,将场景中的一些参数记录下,生成一条链接或者更为复杂得多口令码,启动的时候从剪贴板中读取参数。
  • 设备指令模糊匹配:将当前网络的IP、系统、可以获取的ID信息记录下来,某个时间段可以匹配上的用户可以认为是同一个用户。

我们看看 Deferred deeplink 的技术流程: 


 
Deferred deeplink 对于应用的帮助是巨大的,尤其是对于Pdd、得物、美团这类的应用,可以帮助其更加便捷的促进交易。

5、其他技术方案

5.1 微信跳转
之前我提过,在微信里,我们的URL其实会被拦截,所以需要单独的适配:
《微信跳转第三方应用文档》
https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_H5_Launch_APP.html
5.2 ChromeIntent
在高版本的 Chrome 中无法直接使用 URL,需要按照要求实现。具体的实现可查看:
《Chrome Intent使用规范》
https://developer.chrome.com/docs/android/intents?hl=zh-cn

4Android中的简单实现

在 Android 中,如果想配置 Deeplink,还是比较简单的,我们可以直接查看官方文档:
《创建指向应用内容的深层链接》
https://developer.android.com/training/app-links/deep-linking?hl=zh-cn

1、在AndroidManifest文件中添加Intent过滤器

看代码,里面包括了 AppLinks 和 正常的 URL Scheme:
<activity
  android:name="com.example.android.GizmosActivity"
  android:label="@string/title_gizmos" >

  <intent-filter android:label="@string/filter_view_http_gizmos">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <!-- APPLinks URIs 是 "http://www.example.com/gizmos” -->
    <data android:scheme="http"
      android:host="www.example.com"
      android:pathPrefix="/gizmos" />

    <!-- note that the leading "/" is required for pathPrefix-->
  </intent-filter>
  <intent-filter android:label="@string/filter_view_example_gizmos">
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <!-- URI 是 "example://gizmos” -->
    <data android:scheme="example"
      android:host="gizmos" />

  </intent-filter>
</activity>

2、读取Intent传递的书架

当我们启动到对应的 Activity 后,就可以读取 Intent 中对应的数据:
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Intent intent = getIntent();
    String action = intent.getAction();
    Uri data = intent.getData();
}
如果需要查询对应的参数,可以使用 Uri 中对应的 getQueryParameter 方法。

3、使用ADB测试Deeplink

使用 adb 测试 intent 过滤器 URI 的一般语法为:
$ adb shell am start
        -W -a android.intent.action.VIEW
        -d <URI> <PACKAGE>
两个参数:
  • URI:对应的 Deeplink 链接。
  • PACKAGE:App对应的包名。

上面的内容比较简单,都是复制的官方文档,建议查看官方文档。

5总结

以上内容是我针对移动端 Deeplink 方案的总结,针对 Deferred deeplink,自己并未经过完整技术方案的实践,如有不足,欢迎指出。


最后推荐一下我做的网站,玩Android: wanandroid.com ,包含详尽的知识体系、好用的工具,还有本公众号文章合集,欢迎体验和收藏!


推荐阅读

鸿蒙版「玩Android」已经来了,你还不来学习一下?
Android 自定义 html css标签解析器
Android稳定性:可远程配置化的Looper兜底框架


扫一扫 关注我的公众号

如果你想要跟大家分享你的文章,欢迎投稿~


┏(^0^)┛明天见!

继续滑动看下一个
鸿洋
向上滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存