Android外部调用自身App(scheme DeepLink、AppLink详解)

Android外部调用自身App(scheme DeepLink、AppLink详解)

一、场景需求

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文件进行配置

android:name=".phone.entry.EntryActivity"

android:launchMode="singleTask"

android:exported="true"

android:screenOrientation="portrait">

android:host="wx.test.com"

android:scheme="wx" />

配置项作用:

关键字

注释

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 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

那么基本就结束了,踩过的坑也都在这个文章上写了如何避免

如果能帮到你,请记得给star更多动力咯

相关文章

“虢季子白”青铜盘
28365-365体育备用

“虢季子白”青铜盘

⌛ 09-23 👁️ 3791
如何自己制作wallpaper壁纸
28365-365体育备用

如何自己制作wallpaper壁纸

⌛ 08-27 👁️ 1683
手机怎么设置密码?几个步骤就能完成设置!
Bet体育365验证提款

手机怎么设置密码?几个步骤就能完成设置!

⌛ 07-15 👁️ 715