Android DeepLink介绍与使用

deeplink.png

前段时间公司让调研一下DeepLink,说以后会用到,之前看了很久,并做了个demo,现整理一下,方便以后查阅,如果有幸帮助到其他人就更好了。

基本概念

Deep Link,又叫deep linking,中文翻译作深层链接。

简单地从用户体验来讲,Deep Link,就是可以让你在手机的浏览器/Google Search上点击搜索的结果,便能直接跳转到已安装的应用中的某一个页面的技术。

对于不懂技术的运营人员来说就是一个分享功能,而从技术层面上去简单理解是实现将某APP用户带到另外APP相对应的内容页面,实现APP之间无缝跳转!

商业价值

相信大家或多或少看到过这样的页面:

deeplink

底部有一个“App内打开”,点击后如果安装过应用直接跳到应用的对应页面,如果没安装则跳到下载应用页。

Deeplink(深度链接)

对于已经安装APP,指向特定的页面,和上面说的一致。

Deferred deeplink( 延迟深度链接)

相比deeplink,它增加了判断APP是否被安装,用户匹配的2个功能;

  • 1.当用户点击链接的时候判断APP是否安装,如果用户没有安装时,引导用户跳转到应用商店下载应用。
  • 2.用户匹配功能,当用户点击链接时和用户启动APP时,分别将这两次用户Device Fingerprint(设备指纹信息)传到服务器进行模糊匹配,使用户下载且启动APP时,直接打开相应的指定页面。

通过上面的2个技术方案,不仅:①可以让被分享者更快更便捷的回到APP,且回到指定的活动页面,而且:②可以引导未安装APP的用户下载APP、③分享者和被分享者的关系链会通过设备指纹信息记录下来,在业务场景中给出相应的奖励。

使用deeplink前后对比:

对比

基本使用

具体见Demo:WebViewStudy

HTML页面:deeplink.html

<a href="[scheme]://[host]/[path]?[query]">启动应用程序</a> 

示例:

<a href="will://link/testId">立即打开(直接打开)&gt;&gt;</a>

AndroidManifest.xml

<!--用于DeepLink,html跳到此页面  scheme_Adr: 'will://link/testid',-->
        <activity android:name=".DeepLinkActivity">
            <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:host="link"
                    android:scheme="will" />
            </intent-filter>
        </activity>
    </application>

MyWebViewClient.class

    @SuppressWarnings("deprecation")
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (TextUtils.isEmpty(url)) {
            return false;
        }
        try {
            // 用于DeepLink测试
            if (url.startsWith("will://")) {
                Uri uri = Uri.parse(url);
                Log.e("---------scheme", uri.getScheme() + ";host: " + uri.getHost() + ";Id: " + uri.getPathSegments().get(0));
            }

            Intent intent1 = new Intent();
            intent1.setAction("android.intent.action.VIEW");
            Uri uri = Uri.parse(url);
            intent1.setData(uri);
            intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mActivity.startActivity(intent1);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }

DeepLinkActivity.java

   /**
     * 从deep link中获取数据
     * 'will://share/传过来的数据'
     */
    private void getDataFromBrowser(TextView textView) {
        Uri data = getIntent().getData();
        try {
            String scheme = data.getScheme();
            String host = data.getHost();
            List<String> params = data.getPathSegments();
            // 从网页传过来的数据
            String testId = params.get(0);
            String text = "Scheme: " + scheme + "\n" + "host: " + host + "\n" + "params: " + testId;
            Log.e("ScrollingActivity", text);
            textView.setText(text);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

页面具体显示:

Scheme:will
host:link
params:testId

实现原理

DeepLink用到的核心技术就是:URL SCHEMES。不论是IOS还是Android。 URL Schemes 有两个单词:

  • URL,我们都很清楚,http://www.apple.com 就是个 URL,也叫它链接或网址;
  • Schemes,表示的是一个 URL 中的一个位置——最初始的位置,即 ://之前的那段字符。比如 http://www.apple.com 这个网址的 Schemes 是 http。

我们可以像定位一个网页一样,用一种特殊的 URL 来定位一个应用甚至应用里某个具体的功能。而定位这个应用的,就应该这个应用的 URL 的 Schemes 部分,也就是开头儿那部分。但是需要注意的是应用的URL Schemes 并不唯一,也就是说一个应用可以“起多个名“,不同应用的URL Schemes也可能因为名字一样发生冲突。

Android系统级应用,有一些已经定义了URL Schemes,比如短信是 sms:、通话是tel:、email是mailto:,在定义自己APP的URL Schemes的时候要避免跟系统应用名称一样。

<a href="tel:15088888888">电话</a>
<a href="sms:15088888888">短信</a>
<a href="mailto:15088888888@qq.com">邮件</a>

与URL一样,URL Schemes也可以通过传参打开特定的APP界面。

Applink

基本介绍

官网文档:Verify Android App Links

Android App Links是一种特殊的Deep Links,它使Android系统能够直接通过网站地址打开应用程序对应的内容页面,而不需要用户选择使用哪个应用来处理网站地址。

要添加Android App Links到应用中,需要在应用里定义通过Http(s)地址打开应用的intent filter,并验证你确实拥有该应用和该网站。如果系统成功验证到你拥有该网站,那么系统会直接把URL对应的intent路由到你的应用。

为了验证你对应用和网站的所有权,以下两个步骤是必须的:

  • 1.在AndroidManifest里要求系统自动进行App Links的所有权验证。这个配置会告诉Android系统去验证你的应用是否属于在intent filter内指定的URL域名。
  • 2.在以下链接地址里,放置一个数字资产链接的Json文件,声明你的网址和应用之间的关系:
  • https://domain.name/.well-known/assetlinks.json

与Deep Links的区别

  • Deep Links 是一种允许用户进入应用某个特定Activity的intent filter。点击这类链接时,系统可能会弹出一个选择列表,让用户在一堆能够处理这类链接的应用里(包括你的)选择一个来处理该链接。图一展示了这样一种情况:用户点击了一个地图相关的链接,系统弹出一个选择列表,让用户选择是要使用地图应用来处理,还是使用Chrome浏览器来处理。
  • App Links 是一种基于你的网站地址且验证通过的Deep Links。因此,点击一个这样的链接会直接打开你的应用(如果已经安装),系统将不会弹出选择列表。当然,后续用户可以更改配好设置,来指定由哪个应用程序处理这类链接。

下面这个列表描述更多差异:

item

Deep Links

App Links

Intent URL Scheme

https, http,或者自定义

需为http或https

Intent Action

任意Action

需为android.intent.action.VIEW

Intent Category

任意Category

需为android.intent.category.BROWSABLE和android.intent.category.DEFAULT

链接验证

不需要

需要在网站上放置一个数字资产链接,并能够通过HTTPS访问

用户体验

可能会弹出一个选择列表给用户选择用哪个应用处理连接

没有弹框,系统直接打开你的应用处理网站连接

兼容性

所有Android版本

Android 6.0及以上

总结一下

  • 1.APP要想被其他APP直接打开,自身得支持,让自己具备被人打开的能力。(URL Schemes)
  • 2.APP要想打开其他的APP,自身也得支持。(判断设备是否安装、各种跳转的处理)

应该来讲,deeplink技术比较适用于独立电商、金融理财APP,一方面这类APP的广告内容可以是平台的商品(产品),链接后直接进入相关商品(产品)的详情页,另一方面,这类APP在打开后是会产生后续的交易行为。

这种方式只能用于系统处理URL的intent的情况,若URL本身没有抛给系统处理,而是直接在应用内打开了,那就无法直接拉起应用。

由于大部分应用,如微博、微信、第三方浏览器(包括Chrome),都不会将URL抛给系统处理(对scheme进行屏蔽),因此App Links生效的情况就很有限了,比如只能从记事本应用、短信应用这些进行跳转。总体来说,实属鸡肋。

京东及淘宝的CPS即是使用此方式实现的。 京东CPS商品推广接入流程 Android 阿里百川cps SDK接入流程

一些常用APP的URL Schemes

知乎:回答 zhihu://answers/{id}用户页 zhihu://people/{id} 微信: weixin://dl/scan 扫一扫weixin://dl/feedback 反馈weixin://dl/moments 朋友圈weixin://dl/settings 设置weixin://dl/notifications 消息通知设置weixin://dl/chat 聊天设置weixin://dl/general 通用设置weixin://dl/officialaccounts 公众号weixin://dl/games 游戏weixin://dl/help 帮助weixin://dl/feedback 反馈weixin://dl/profile 个人信息weixin://dl/features 功能插件

腾讯微博:TencentWeibo:// 淘宝:taobao:// 支付宝:alipay:// 微博:sinaweibo:// weico微博:weico:// QQ浏览器:mqqbrowser:// uc浏览器:ucbrowser:// 海豚浏览器:dolphin:// 搜狗浏览器:SogouMSE:// 百度地图:baidumap:// Chrome:googlechrome:// 优酷:youku:// 京东:openapp.jdmoble:// 人人:renren:// 美团:imeituan:// 1号店:wccbyihaodian:// 我查查:wcc:// 有道词典:ddictproapp:// 点评:dianping:// 微盘:sinavdisk:// 豆瓣fm:doubanradio:// 网易公开课:ntesopen:// 名片全能王:camcard:// 淘宝宝贝搜索:taobao://http://s.taobao.com/?q=[prompt] 淘宝店铺搜索:taobao://http://shopsearch.t

参考链接

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ThoughtWorks

Kubernetes救援 - 教你如何从新技术的坑里爬出来(上) | TW洞见

今日洞见 文章作者/配图来自ThoughtWorks:佟达。 本文所有内容,包括文字、图片和音视频资料,版权均属ThoughtWorks公司所有,任何媒体、网站...

40790
来自专栏杨建荣的学习笔记

使用Echarts来实现数据可视化

自动化运维中,脚本化,工具化,平台化的过程中,有一个环节不可缺少,那就是可视化。 可视化这方面的开源产品还是相当的多,总体的方向都是借助于丰富的前端方案来联动,...

45360
来自专栏吉浦迅科技

NVIDIA Jetson开发压箱底的秘密都在这里,很多人还不知道(一)

经常有人在群里问我各种“小”问题: Jetson TX2 显存是多大? Jetson TX2 开发板的尺寸是多大?给我个孔位图纸 Jetson TX2 支持最...

82280
来自专栏编程一生

架构师之路--搜索业务和技术介绍及容错机制

13920
来自专栏量化投资与机器学习

战斗民族开源神器ClickHouse:一款适合于构建量化回测研究系统的高性能列式数据库(一)

编辑部原创 编译:wally21st、 西西 未经允许,不得转载 对于一些私募、投资机构和个人来说,量化投资研究、回测离不开数据的支持。当数据量达到一定数量,如...

73780
来自专栏PPV课数据科学社区

大规模爬虫流程总结

爬虫是一个比较容易上手的技术,也许花5分钟看一篇文档就能爬取单个网页上的数据。但对于大规模爬虫,完全就是另一回事,并不是1*n这么简单,还会衍生出许多别的问题。...

382110
来自专栏java工会

使用Github创建自己的小博客

12720
来自专栏芋道源码1024

Dubbo 源码解析 —— 集群容错架构设计

前言 本来是想把整个dubbo源码解析一次性弄完,再做成一个系列来发布的,但是正巧最近有位好朋友要去杭州面试,就和我交流了一下.本着对dubbo源码略有心得的心...

32570
来自专栏喔家ArchiSelf

CAP理论与分布式系统设计

S 先生 是一位难得的技术同行,学者气质,一见如故。s 先生 作为本公众号(wireless_com) 的第一位投稿者,老曹深感荣幸。CAP 和 分布式系统的...

17640
来自专栏AI科技大本营的专栏

8月精选Python开源项目Top10

【导读】过去一个月里,我们对近 250 个 Python 开源项目进行了排名,并挑选出热度前 10 的项目。这份清单的平均 github star 数量高达 1...

21450

扫码关注云+社区

领取腾讯云代金券