一、场景需求
APP开发中经常会有这种需求:在浏览器或者短信、别的App中唤起自身APP。
二、提前小总结
如果不是硬性业务需要AppLink,那么DeepLink完全满足。
AppLink在国内还有一个严重的问题,就是需要翻墙才能正常使用。(这个问题很多网站没提到踩到坑)
二、介绍
Android一直是支持scheme的,URI Schemes其实就是实现Deep Link的第一代解决方案,后来随着诸多缺点的出现,比如
- 当要被唤起的app没有安装时,这个链接就会出错。(这个可以提前通过代码解决)
- 当注册有多个scheme相同的时候,目前没有办法区分。
为了解决上面问题,于是,就出现了Android6.0之后的App Link,其实App Link比Deep Link多了一种验证方式,需要App与Web协作完成系统验证,并且Manifest文件中需要加入android:autoVerify="true",其他的就没什么代码变动了
请记住,如果App Link验证通过,就设置默认打开,如果验证不过,则退化为Deep Link
三、区别
关键字 | 注释 | |
---|---|---|
不同点 | 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及以上版本 |
四、一些细节你要了解的
- App可以配置多个支持唤起的Activity
- Activity可以支持被多个URL唤起
- 若一个App配置了多个支持唤起的Activity,它们的scheme和host一般一致,然后通过path、pathPrefix等进行定向区分
五、DeepLink实践
四.1 首先,需要在AndroidManifest.xml文件进行配置
<!-- 用于不做任何处理的调用跳转 -->
<activity
android:name=".phone.entry.EntryActivity"
android:launchMode="singleTask"
android:exported="true"
android:screenOrientation="portrait">
<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="wx.test.com"
android:scheme="wx" />
</intent-filter>
</activity>
配置项作用:
关键字 | 注释 |
---|---|
ACTION_VIEW | 支持被检索 |
CATEGORY_DEFAULT | 响应隐式Intent |
CATEGORY_BROWSABLE | 可被Web浏览器唤起 |
data | 一个或多个,必须含有scheme标签,决定被唤起的URL格式。 |
四.2 然后,被唤起后的Activity解析URL数据
@Override
public void onCreate(Bundle savesInstanceState){
...
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();
...
}
四.3 URL基本格式
wx://wx.test.com?uid=123&name=Ming
四.4 唤起方
String url = "wx://wx.test.com";
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
MainActivity.this.startActivity(intent);
六、为什么第三方调用我的Activity会重启?
场景:自身App启动,然后调用第三方应用,这个时候第三方再调回我们自身App,如果没有设置singleTask模式,那么会重新启动我们的App
这是因为没有设置android:launchMode="singleTask"
那么问题又来了,业务需求我的这个Activity是不能设置SingleTask,那么,我们就要做一个类似入口的Activity
···
public class EntryActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Uri uri = getIntent().getData();
``````
finish();
}
}
···
那么当EntryActivity自己finish后,就会回到上一个页面中。
七、AppLink
在上面说了,需要App与Web协作完成系统验证。在上面我们已经创建了EntryActivity的入口,接下来就具体几个步骤
-
点击Android Studio的菜单栏中的Tools > App Links Assistant
在右侧界面会看到几项,那么我们一项一项说
-
打开第一项,即是Open URL Mapping Editor
可以看到我们之前添加的EntryActivity,在这里我们可以随意添加修改都会影响到Manifest文件
App Links Assistant提供了检查URL Mapping是否配置正确的快捷方式,操作如下:
点击Open URL Mapping Editor,然后在Check URL Mapping对话框中输入URL,当输入一个能够成功匹配到Acitivty的URL后,输入框下方会显示This URL maps to xxxxx(app) -
打开第二项,如图,只是让你更快进入Activity代码
-
第三项,就是AppLink设置的重点了
选项标题 | 解释 |
---|---|
Select a module yout want to work on | 项目里面有多个App的时候就会出现,让你选择其中一个 |
Site domain | 自己后台搭建的网址,需要提供出来验证 |
Application ID | App包名 |
Signing config | 选择密钥,可以看出debug跟release是不一样的 |
Generate Digital Asset Links file | 点击后生成Preview的下文 |
当我们生成Preview的文章后,作为一个assetlinks.json的文件存储进该路径
https://link.applk.cn/.well-known/assetlinks.json
请记得,打开这个链接,是一个自动下载的文件才是对的
八、如何验证AppLink是否成功
那么基本完成了,那么我们如何验证是否成功呢?首先,第四项就提供了验证功能
那么除了这个方法,还有别的方式验证,比如
Statement List Generator and Tester | Google Digital Asset Links
那么基本就结束了,踩过的坑也都在这个文章上写了如何避免