文章目录
  1. 1. App Links介绍
    1. 1.1. 优点
    2. 1.2. 缺点
  2. 2. App Links实现
    1. 2.1. 前置条件
    2. 2.2. App Links实现原理
    3. 2.3. 实现方法
      1. 2.3.1. 客户端实现
      2. 2.3.2. 服务器端实现
    4. 2.4. 测试方法

谷歌在2015年的I/O大会上宣布Android M支持App链接(App Links)。这个举动将改变H5和原生应用的交互体验。

在Android M之前,点击一个链接会产生一个弹出框,询问用户打开哪个应用-包括浏览器应用。但是谷歌在Android M 实现了一个自动认证(auto-verify)机制,让开发者可以避开这个弹出框,使用户不必去选择一个列表,直接跳转到他们的app。

优点

谷歌的App Link让用户在点击一个普通web链接的时候可以打开指定app的指定页面,前提是这个app已经安装并且经过了验证,否则会显示一个打开选项的弹出框。自此,在安卓中打开一个链接的用户体验大大提高,用户可以在链接与app之间快速切换。 也就是我们的唤起

缺点

App Links有如下缺点:

  • App Links只能工作在谷歌的Android M上
  • 要使用App Links开发者必须维护一个与app相关联的网站

前置条件

想要实现App Links需要如下条件:

  • 拥有一个域名
  • 域名SSL通道
  • 有上传文件到到域名指向服务器的权限

App链接认证涉及到安卓系统的两个组建:Package Manager和Intent Filter Verifier。

PackageManager 是一个无处不在的标准组建–它负责验证所安装的apk是否有效,授予app权限,另外还可以通过它知道系统上安装了些什么app。

Intent Filter Verifier 则是Android M上才有的新玩意儿。这个组建负责获取链接指向的JSON认证,解析它,验证它,然后将报告返回给PackageManger。

想要查看Intent Filter Verifier,可以通过这条命令:

1
adb shell dumpsys package ifv

App链接认证在安装的时候就一次性完成。这就是为什么刚刚我们说不必在每次点击链接的时候都阻塞网络。如果认证失败,app链接将无法指向你的app – 你的app会像往常一样出现在“打开方式”对话框中(除非另一个app通过了同一域名的验证)。

App Links Verifier

当一个package安装的时候,或者现有的package升级的时候:

  1. PackageManager对即将安装的apk做常规的验证。
  2. 如果成功,这个package将被安装,同时发出一个带有android.intent.action.INTENT_FILTER_NEEDS_VERIFICATION的广播intent,intent中还携带有该package的信息。
  3. Intent Filter Verifier的广播接收器将获取这个广播。
  4. 从package的标签中编译出一个特有主机名的列表。
  5. verifier尝试从每个特有的主机名中获取statements.json。
  6. 每一个被获取的JSON文件都会检查它的application ID和安装包的证书。
  7. 只有当所有文件同时满足时,才会发送成功信息到PackageManager,否则失败。
  8. PackageManager存储结果。

实现方法

客户端实现

客户端需要设置Activity的Intent Filter,来设置页面接收唤起。具体实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<activity
android:name="com.your.app.activity.HandlerActivity"
android:alwaysRetainTaskState="true"
android:launchMode="singleTask"
android:noHistory="true"
android:theme="@android:style/Theme.Translucent.NoTitleBar">


<intent-filter android:autoVerify="true">
<data android:scheme="http" android:host="yourdomain.com" />
<data android:scheme="https" android:host="yourdomain.com" />
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
</intent-filter>
</activity>

获取唤起参数等信息代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Intent intent = getIntent();
Uri deeplink = intent.getData();
if (deeplink != null) {
parseDeepLink(deeplink);
}
}

private void parseDeepLink(Uri deeplink) {
// The path of the deep link, e.g. '/products/detail?key=google'
String path = deeplink.getPath();
String latPathSegment = deeplink.getLastPathSegment();
String value1 = deeplink.getQueryParameter("key");

Toast.makeText(this,
"path : " + path
+ "\n lastPathSegment : " + latPathSegment
+ "\n value1 : " + value1,
Toast.LENGTH_SHORT).show();
}

服务器端实现

服务器端需要上传statements.json文件到根目录下的.well-known/文件夹下,完整路径是http://ihongqiqu.com/.well-known/statements.jsonstatements.json文件格式如下:

1
2
3
4
5
6
7
8
[{
"relation": ["delegate_permission/common.handle_all_urls"],
"target": {
"namespace": "android_app",
"package_name": "com.mycompany.myapp",
"sha256_cert_fingerprints": ["AB:E3:C6:08:34:AF....EA:2C:1B"]
}

}]

其中SHA256指纹证书可以有多个,获取命令如下:

1
keytool -list -v -keystore /path/to/app/release-key.keystore

or

1
echo | keytool - list - v - keystore app . keystore 2 > / dev / null | grep SHA256 :

测试方法

一种简单测试App是否设置正确的方法:

1
2
3
adb shell am start
-W -a android.intent.action.VIEW
-d "https://yourdomain.com/products/123?coupon=save90" com.example.android


本文地址 http://ihongqiqu.com/2015/12/18/App-Links/ 作者为 Zhenguo

author:Zhenguo
Author: Zhenguo      Blog: http://ihongqiqu.com/     Email: jinzhenguo1990@gmail.com
I have almost 6 years of Android application development experience and have a keen interested in the latest emerging technologies. I use my spare time to turn my experience, ideas and love for Android tech into informative articles, tutorials and more in hope to help others and learn more.
文章目录
  1. 1. App Links介绍
    1. 1.1. 优点
    2. 1.2. 缺点
  2. 2. App Links实现
    1. 2.1. 前置条件
    2. 2.2. App Links实现原理
    3. 2.3. 实现方法
      1. 2.3.1. 客户端实现
      2. 2.3.2. 服务器端实现
    4. 2.4. 测试方法
返回顶部