需求简介
从原生App
通过Scheme
的方式拉起支付宝(alipay://xxx.xxx.xx
),然后由支付宝再拉起目标H5
页面。H5
页面完成具体工作之后,需要将结果回传给原生App
,怎么实现?
iOS
的通用链接可以实现这一需求,具体的可以参考实践文章:iOS通用链接实践-2020-05-28
Android
中跟通用链接相对应的技术是App Links
,理论上也是可行的。但是现实情况是,App link
不翻墙会失败,退化到deep link
,还是要弹框选择处理程序。上面的例子,从H5
页面就不能回跳到原生App
。
实现工具
Android Studio
给了一个工具来实现AppLink
,这点是比iOS
的Xcode
做得好的地方。
菜单路径:AndroidStudio -> Tools -> App Links Assistant

(1) Add URL intent filters

点击新增或者编辑按钮,会出现如下对话框

编辑完后,在AndroidManifest.xml中会自动添加相关的内容:

(2)Add logic to handle the intent
这一步的目的,是在点击url
之后,在相对应的Activity
中处理通过url
传过来的数据。

在这里,我们只是简单地显示一下url
的各个组成部分,代码如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result);
// ATTENTION: This was auto-generated to handle app links.
Intent appLinkIntent = getIntent();
String appLinkAction = appLinkIntent.getAction();
Uri appLinkData = appLinkIntent.getData();
if (appLinkData != null) {
//Uri 规则: scheme://host+path?query
//这里以“https://app.kjtpay.com/app?success=true&from=alipay”为例
String scheme = appLinkData.getScheme(); //https , "://" 这个前面的就表示scheme
String host = appLinkData.getHost(); //app.kjtpay.com
String path = appLinkData.getPath(); //app
String query = appLinkData.getQuery(); //success=true&from=alipay
String message = "scheme: " + scheme + "\n host: " + host + "\n path: " + path
+ "\n query: " + query + "\n action: " + appLinkAction;
Log.d("ResultActivity", message);
TextView textView = findViewById(R.id.text_view_content);
textView.setText(message);
}
findViewById(R.id.text_view_back).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
}
(3) Associate website
这一步是最关键的一步,也就是生成Digital Asset Links
文件,这就是AppLink
和普通的DeepLink
不同的地方

点击按钮,生成配置文件,下载配置文件,并将配置文件放到指定位置:

配置文件放到指定位置之后,点击链接,可以考到这个配置文件的内容:

AndroidManifest
中自动增加的标志:

(4) Test on device or emulator

选择之后,自动打开目标Activity
:

限制的缺陷
- 需要翻墙或针对国外环境可用,否则退化到
Deep link
这个缺陷其实非常严重,导致大多数应用的
AppLink
没有实际价值
-
Android 6.0
及以上可用,否则退化到Deep link
网友评论