一、概念
1. 介绍
- DeepLink与AppLink,本质上都是基于Intent框架,使App能够识别并处理来自系统或其他App的某种特殊URL,在原生App之间相互跳转,实现良好的用户体验
- DeepLink相对简单,有时不能直接唤起目标App,会出现多选项弹窗、确认弹窗等,需要用户进一步操作;AppLink相对复杂,需要App与Web协作完成系统验证,但可以保证直接唤起目标App,无需用户二次选择或确认
2. 区别
不同点 | DeepLink | AppLink |
---|---|---|
Intent scheme | 任意 | 要求http或https |
Intent action | 任意 | 要求配置andorid.intent.action.VIEW |
Intent category | 任意 | 要求配置android.intent.category.BROWSABLE和android.intent.category.DEFAULT |
链接认证 | 无需验证 | 要求进行Digital Asset Links文件验证 |
用户体验 | 可能展示一个多选项弹窗或确认弹窗,用户需要二次选择或确认 | 无弹窗,直接由App处理链接 |
兼容性 | 所有版本 | Android6.0及以上版本 |
二、DeepLink实践
1. 被唤起方
1.1 首先,需要在AndroidManifest.xml文件进行配置
<activity
android:name=".activities.CalledActvity"
android:screenOrientation="portrait">
<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="www.example.com"
android:scheme="http" />
<data
android:host="www.example.com"
android:scheme="https" />
<data
android:host="www.example.com"
android:path="/user/profile"
android:scheme="https" />
<data
android:host="www.example.com"
android:pathPrefix="/user"
android:scheme="https" />
</intent-filter>
</activity>
配置项作用:
- ACTION_VIEW:支持被检索
- CATEGORY_DEFAULT:响应隐式Intent
- CATEGORY_BROWSABLE:可被Web浏览器唤起
- data:一个或多个,必须含有scheme标签,决定被唤起的URL格式。
其中:
- App可以配置多个支持唤起的Activity
- Activity可以支持被多个URL唤起
- 若一个App配置了多个支持唤起的Activity,它们的scheme和host一般一致,然后通过path、pathPrefix等进行定向区分
1.2 然后,被唤起后解析URL数据
@Override
public void onCreate(Bundle savesInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Intent intent=getIntent();
String action=intent.getAction();
Uri data=intent.getData();
//解析data
String scheme=data.getScheme();
String host=data.getHost();
String path=data.getPath();
int port=data.getPort();
Set<String> paramKeySet=data.getQueryParameterNames();
...
}
- URL基本格式
scheme://host/path?param1=value1¶m2=value2
eg: example://www.example.com/user?uid=123&name=Ming
2. 唤起方
2.1 获取到被唤起方的URL后,使用Intent跳转
Intent intent=new Intent();
intent.setData(Uri.parse("example://www.example.com/user?uid=123&name=Ming"));
startActivity(intent);
- 需要回调数据时,使用startActivityForResult
三、AppLink实践
链接
四、配置示例
1. DeepLink
腾讯视频Android客户端,反编译获取AndroidManifest文件
<activity android:configChanges="keyboardHidden|orientation|screenSize" android:launchMode="singleTask" android:name="com.tencent.qqlive.open.QQLiveOpenActivity" android:screenOrientation="portrait" android:theme="@android:style/Theme.Translucent.NoTitleBar">
<intent-filter>
<action android:name="android.intent.action.qqlive.open.details"/>
<action android:name="android.intent.action.qqlive.open.player"/>
<action android:name="android.intent.action.qqlive.open.list"/>
<action android:name="android.intent.action.qqlive.open.live"/>
<action android:name="android.intent.action.qqlive.open.home"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
<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="qqlive"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="tenvideo2"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="txvideo"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="videopush"/>
</intent-filter>
<intent-filter>
<action android:name="com.tencent.qqlive.action.oppo.push"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
2. AppLink
淘宝Android客户端,反编译获取AndroidManifest文件
<activity android:name="com.taobao.android.tbplay.GameDetailActivity">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW"/>
<action android:name="android.intent.action.NAV.ACTION"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="http"/>
<data android:scheme="https"/>
<data android:host="m.taobao.com" android:pathPattern="/tbplay.htm"/>
</intent-filter>
<meta-data android:name="bundleLocation" android:value="com.taobao.android.tbplay"/>
</activity>
网友评论