移动端深度链接,简称deeplink。这是一种通过uri链接到app特定位置的一种跳转技术,不单是简单地通过网页、app等打开目标app,还能达到利用传递标识跳转至不同页面的效果。参考Create Deep Links to App Content
场景
在推广、广告、应用间跳转的场景下,使用极多。这里将根据以下要点来介绍deeplink。
- intent
- intent-filter
- scheme
原理介绍
- intent
首先我们要讲一下的是intent,在android中,intent作为“调用意图”来解释再合适不过了,其作用不用多说,就是为调用其他app所做的封装,这里就简单说一下。intent的调用有显式和隐式两种方式。
显式调用就好比你去别人家做客,显式调用类似于你知道朋友家的地址,浙江省杭州市西湖区某某小区几栋几零几,人家门牌都写的很清楚,你去找就很容易,指向性唯一。
隐式调用包含一定的条件,有action,category,data,type,extras,flags等等,每一种属性都类似于筛选条件。你说你要去杭州的山上玩,那么就会给你定位到杭州市的各种山,只要符合这个条件,他们都会一一被列出来,至于去哪里,就看你自己选。
- intent-filter
intent-filter是针对你跳转的目标来讲的,就类似于门牌的修饰,他会在门牌上定义上述介绍的那些属性。当有intent发送过来的时候,就会筛选出符合条件的app来。最常见的就是
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
这俩属性可以说AndroidManifest.xml最常见的两行代码了,作用就是app第一个启动的activity。一个app里有很多activity,在启动的时候,系统并不知道哪个是第一个要启动的,那么他就发一个setAction为“android.intent.action.MAIN”、setCategory为“android.intent.category.LAUNCHER”的intent出来,被匹配的到Activity就会启动了。
- Android Deeplink探究
deeplink所需要的几个属性大致有以下几个
<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:scheme="xt"
android:host="www.abc.com"
android:pathPrefix="/work" />
</intent-filter>
这边一个个介绍过去,action.VIEW是打开一个视图,category.DEFAULT为默认,category.DEFAULT为设置该组件可以使用浏览器启动,这个是关键,从浏览器跳转,就要通过这个属性。data中的scheme、host、pathPrefix等等,这个是uri的链接,scheme可以导向app的跳转,是另一个关键。
接下来就是生成一个短链,通过浏览器打开就行了。比如"xt://www.abc.com/work",这里要注意的是,uri也是层级过滤的,例如有两个activity同时声明了scheme为“xt”,那么会继续往下匹配host。
好了,deeplink的原理及使用,就基本讲完了。
拓展
由于推广等场景的使用,许多都是由网页打开,针对一些未安装的用户进行跳转的。整个流程要求用户先去应用市场下载,下载完后再打开跳转。普通的deeplink实现方案已经不能满足,进而演化出一种延迟深度链接。
目前市场上流行的解决方案很多,类似魔窗,google的firebase dynamic-link,branch,facebook的app-links等等(我是不是要收一波广告费txtx)。翻看了一下源码及实现,大致是通过访问定向链接的时候(这个和短链不一样,短链是针对本地app的,长链是可以真正访问的http网页),会上传设备、ip、时间戳等信息,在app启动的时候,再去异步向他们服务器请求短链。也有和应用市场合作,先把信息传递给应用市场,在市场中打开也可以定向跳转。ps:iOS中的实现好像是访问浏览器中的cookie。
方案很多,各有优缺点,目前来看均可尝试,结合各平台的资源去实现。
总结
deeplink的使用大致就上述内容,还有深层次的内容,像是scheme协议等,有空深究了再做分享。