1.概述

Deep Linking(译:深度链接)作为移动开发者可能对这个概念有点陌生,但是对于它的实现原理,说出来大家肯定都知道。不过我们先说一下Deep Linking能做什么?

  • 它可以唤起指定应用并向其传递数据,根据传递的数据显示特定内容页的详细信息;

  • 它不再受制于应用,只通过一个链接便可唤起应用并跳转到指定页面;

  • 它使应用之间产生了联系,使应用不再孤立存在;

  • 它优化了用户体验,这一点是它最终要达到的目的。

根据Deep Linking能做到的,很多人都能想到如何去实现它了,采用Uri Scheme的方式实现,是的!这是最通用的实现方式,不过该方式有一个问题,就是当点击一个深度链接时,该链接必须先经过浏览器才能跳转到相应的应用。不过,从Android 6.0开始,Android又增加了一种更加直接的方式来打开应用——App Links,该技术可以通过一个链接直接打开应用,不再需要浏览器的协助。下面分两部分实现Android如何通过Deep Linking从web页面跳转到指定应用页面。

2.Uri Scheme

Uri Scheme并不是什么特殊的Uri,只是因主要使用了Uri的scheme部分,所以称为Uri Scheme。关于Uri不了解的可以参考官方URI的API文档或者网上搜索相关资料查看,此处不讲解URI。下面讲解如何实现浏览器跳转到指定的APP页面。

目的:使用Uri Scheme实现从web页面唤起应用并跳转到指定页面

分析:
使用Uri Scheme需要添加怎样的<intent-filter/>,才能实现从浏览器唤起应用?
web页面如何配置对应的URI,才能实现跳转到指定页面?
如何接受web页面intent携带的参数?

实现:
1、配置<intent-filter/>
<intent-filter/>对应的组件可以响应符合该<intent-filter/>的URI。如果要实现可以接收浏览器发送的Intent的<intent-filter/>。就必须添加<action android:name="android.intent.action.VIEW" />和 <category android:name="android.intent.category.DEFAULT" />这两项。同时还必须能够接收特定的scheme,所以添加<data/>的属性,并指定scheme的名称。在AndroidManifest.xml文件中进行配置,具体配置如下图(摘自:LinkedME):

 <activityandroid:name=".activity.MainActivity"android:label="@string/app_name"android:launchMode="singleTask"><!-- URI Scheme方式 --><intent-filter><data android:scheme="lkmedemo" /><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /></intent-filter></activity>

2、web页面跳转链接配置
只需简单地添加一个链接就可以实现从web页面唤起App。链接如下:
open app with uri-scheme
分析:lkmedemo://?click_id=IEGyekes7,其中lkmedemo对应的就是<intent-filter/>中配置的scheme,这样系统才能找到对应的组件。该URI只包含了scheme、query两部分,其中lkmedemo属于scheme部分,?click_id=IEGyekes7部分属于query部分,在query部分,你可以添加一些参数。
Notice:query部分的“?”是必须包含的。
当你点击该链接的时候会自动打开能接收该URI的应用,并且你可以在相应的组件中接收参数并进行后续处理。
(DeepLinking Demo:https://github.com/ljpww72729...)

3、参数接收处理
上面指出query部分属于URI携带的一些参数,如何去获取参数呢?通过getQueryParameter()方法可获取query部分的参数,如下:
String click_id = getIntent().getData().getQueryParameter("click_id");
获取到参数后就可以根据参数进行后续处理了。

3.App Links

在2015的I/O大会上,谷歌宣布了Android M 支持App链接(App Links),这将极大提升用户体验,当用户点击一个web链接时能直接跳转到特定的App内。

在Android M之前,点击一个链接会弹出一个对话框,询问用户使用哪个应用打开 - 包括浏览器应用。但是谷歌在Android M 上实现了一个自动认证(auto-verify)机制,让开发者可以避开这个弹出框,使用户不必去选择一个列表,直接跳转到他们的App。

官方关于App Links的介绍,已经很详细了,不再赘述,这里说一下需要注意的问题:
1、<intent-filter>需要按照以下格式进行配置,其中 android:autoVerify="true" 是必须配置项。因为配置了该项,所以需要特别注意AndroidManifest.xml文件中所有的包含<data/>属性的<intent-filter>,需要在必要的域名服务器上都添加json校验文件,有一项校验不成功都会校验失败。具体参考:https://developer.android.com...

<intent-filter  android:autoVerify="true">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="applinkingexperiment.appspot.com" android:scheme="http"/>
<data android:host="applinkingexperiment.appspot.com" android:scheme="https"/>
</intent-filter>

2、json校验文件必须能通过https访问,无论intent-filter中是否声明了https。
3、响应只能是“application/json”类型的Content-type,其他类型都不支持!
4、校验不支持重定向,所以不要配置链接重定向。
5、生成sha256指纹证书java命令:keytool -list -v -keystore my-release-key.keystor e,json校验文件中的sha256应该是发布签名的sha256,可以配置多个,以逗号分隔。

附:
查看webview的User Agent:
https://developer.chrome.com/...
DeepLinking Demo 该demo模拟了web页面跳转打开应用的场景,通过webview加载本地html文件,并通过点击链接打开应用。请不要为webview添加setWebViewClient()方法,否则无法跳转!
该Demo跳转可以按照自己的需要更改scheme,默认采用的是(LinkedME Demohttps://github.com/WFC-Linked...)
作为跳转的应用,如若不想更改scheme,需要下载运行LinkedME Demo才能正常跳转。
声明:DeepLinking Demo 并没有对所有手机进行适配,部分手机或者模拟器可能会出现跳转不成功的情况,请多试几部手机(Android 6.0模拟器正常运行)。

参考:
1.https://developer.chrome.com/...
2.https://developer.android.com...
3.https://developer.android.com...
4.https://github.com/hehonghui/...

关注我们

Android移动开发者必须知道的Deep Linking技术相关推荐

  1. 高效Android开发者必须知道的4个工具

    移动app开发是一个漫长而费力的过程.然而,现在的企业总是希望能够尽快发布app.幸运的是,我们有很多帮助移动开发人员加快工作步伐的工具. 可用的工具集随着移动平台新版本的出现而不断更新.是的,我们很 ...

  2. 作为开发者必须知道的5个安卓应用推广方式

    很多开发者都是程序员,在推广方面往往不是特别擅长.一款再好的应用,也是需要进行适当的推广的,更何况对于个人开发者来说,应用的安装量就等于他的收入量.怎么样提高 安卓 应用的安装量,最后提高开发者的收入 ...

  3. 每一个C#开发者必须知道的13件事情

    1.开发流程 程序的Bug与瑕疵往往出现于开发流程当中.只要对工具善加利用,就有助于在你发布程序之前便将问题发现,或避开这些问题. 标准化代码书写 标准化代码书写可以使代码更加易于维护,尤其是在代码由 ...

  4. 开发者必须知道的HTML5十五大新特性

    HTML5想必大家都很熟悉了,因为太多的媒体在讨论这一技术.然而,你能准确地说出HTML5带来了哪些新特性吗? 本文 总结 了 HTML5带来的15项你必须知道的 新特性 . 一起来看下: 1.新的文 ...

  5. 《你必须知道的.NET》,蓄势待发;博客园开发者征途,又添新作

    博客园CLR基础研究团队|Anytao技术博客|<你必须知道的.NET>网站 <你必须知道的.NET>,蓄势待发:博客园开发者征途,又添新作 发布日期:2008.3.5 作者: ...

  6. 《你必须知道的.NET》,前言

    <你必须知道的.NET>网站 | Anytao技术博客  <你必须知道的.NET>,前言 发布日期:2008.3.29 作者:Anytao © 2008 Anytao.com ...

  7. [你必须知道的.NET]第三十回:.NET十年(下)

    引言 语言是程序开发者行走江湖的手上利器,各大门派的高手在论坛.博客为了自家门派争吵不已早是技术世界中的亮丽风景,虽多少为刚刚踏入江湖的新手提供了思考的素材,但也同时迷惑了初出茅庐的前行方向. 本文不 ...

  8. [你必须知道的.NET]第二十九回:.NET十年(上)

    引言 语言是程序开发者行走江湖的手上利器,各大门派的高手在论坛.博客为了自家门派争吵不已早是技术世界中的亮丽风景,虽多少为刚刚踏入江湖的新手提供了思考的素材,但也同时迷惑了初出茅庐的前行方向. 本文不 ...

  9. [你必须知道的.NET]第二十三回:品味细节,深入.NET的类型构造器

    1 引言 今天Artech兄在<关于Type Initializer和 BeforeFieldInit的问题,看看大家能否给出正确的解释>一文中让我们认识了一个关于类型构造器调用执行的有趣 ...

最新文章

  1. C++ Primer 5th笔记(chap 13 拷贝控制)实例1
  2. 【Python】Pandas数据挖掘与分析时的常用方法
  3. 全平台硬件解码渲染方法与优化实践
  4. ubuntu切换JDK版本
  5. 国家开放大学2021春1257混凝土结构设计原理题目
  6. 【ZOJ - 3956】Course Selection System(01背包)
  7. weui 加载提示_WeUI与WeUI.JS配合切换进入页面显示加载动画
  8. 网络爬虫-爬取飞常准航班信息
  9. MLDN的超级玛丽。。。
  10. win10打开internet信息服务器,Win10打开internet信息服务的方法
  11. html、css 实现网页弹出层
  12. sha1校验工具android,Android 正式版与测试版签名(MD5,SHA1,SHA256)以及忘记keystore的应用正式版签名获取...
  13. java 随机生成不重复的数字_java中生成不重复随机的数字
  14. Leetcode——唯唯诺诺对并查集的初次相见
  15. 腾讯云TCA开发工程师认证考试
  16. PowerPC VxWorks BSP分析(4.3)——BSP定制
  17. 【新手向】Python做一个简易登录注册GUI界面(无事件绑定)
  18. iOS 绘图(drawrect)图片裁剪的红色框框
  19. sap fi清账函数POSTING_INTERFACE*的使用
  20. presto 剖析详解

热门文章

  1. android程序安装后图标不显示
  2. 在block中进行行循环
  3. 用偷梁换柱法清除腾讯QQ迷你首页的方法
  4. 在UWP 将BitmapImage转换为 WriteableBitmap
  5. 机构押注ABS云平台 融资成本下降1%~3%
  6. 使用GitList查看git修改记录
  7. 解决android unable to resolve new-instance问题
  8. _disable_logging 对于归档数据库的影响
  9. Docker导入导出镜像两种方式
  10. 彻底弄懂浏览器端的Event-Loop