多源 Trusted Web Activity

Trusted Web Activity 是一种使用基于自定义标签页的协议将 Web 应用内容(例如 PWA)与 Android 应用集成的新方法。

ff-origin 导航

Trusted Web Activity 需要使用 Digital Asset Links 来验证已打开的来源,才能全屏显示内容。

当用户离开经过验证的来源时,系统会显示自定义标签页界面。自定义标签中的网址栏会告知用户他们现在正在应用以外的网域中进行导航,同时还会为用户提供 X 按钮,以便用户快速返回已验证的来源。

但是,Web 应用创建跨多个来源的体验也很常见,例如,主要体验位于 www.example.com 的购物应用,而结账流程托管在 checkout.example.com 上。

在这种情况下,显示自定义标签页是不可取的,这不仅是因为用户在同一应用中,也因为顶栏可能会让用户以为自己离开了应用并放弃结账。

Trusted Web Activity 可让开发者验证多个源站,而且用户在这些源站间导航时将保持全屏状态。与主网域一样,开发者必须能够控制每个已验证的来源。

为多个源设置验证

与在主源中一样,验证通过 Digital Asset Links 实现,并且每个要验证的网域都需要有自己的 assetlinks.json 文件。

在包含 www.example.comcheckout.example.com 的示例中,结果为:

  • https://www.example.com/.well-known/assetlinks.json
  • https://checkout.example.com/.well-known/assetlinks.json

由于每个网域都会连接到同一 Android 应用,因此 assetlinks.json 文件看起来完全相同。

假设 Android 应用的软件包名称为 com.example.twa,这两个 assetlink.json 文件将包含类似于以下内容的内容:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
  "namespace": "android_app",
  "package_name": "com.example",
   "sha256_cert_fingerprints": ["..."]}
}]

向 Android 应用添加多个源

在 Android 应用中,需要更新 asset_statements 声明,以包含需要验证的所有来源:

<string name="asset_statements">
[{
    \"relation\": [\"delegate_permission/common.handle_all_urls\"],
    \"target\": {
        \"namespace\": \"web\",
        \"site\": \"https://www.example.com\"
    }
}],
[{
    \"relation\": [\"delegate_permission/common.handle_all_urls\"],
    \"target\": {
        \"namespace\": \"web\",
        \"site\": \"https://checkout.example.com\"
    }
}],
</string>

向 LauncherActivity 添加额外的来源

使用默认 LauncherActivity

android-browser-helper 支持库中的 LauncherActivity 提供了一种方法,可让您通过配置 Android 项目来添加多个要验证的来源。

首先,向 res/values/strings.xml 文件添加一个 string-array 元素。需要验证的每个额外网址都将位于 item 子元素中:

...
<string-array name="additional_trusted_origins">
    <item>https://www.google.com</item>
</string-array>
...

接下来,在 AndroidManifest.xml 内引用 LauncherActivity 的现有 activity 元素内添加一个新的 meta-data 标记:

...
<activity android:name="com.google.androidbrowserhelper.trusted.LauncherActivity"
    android:label="@string/app_name">


    <meta-data
        android:name="android.support.customtabs.trusted.ADDITIONAL_TRUSTED_ORIGINS"
        android:resource="@array/additional_trusted_origins" />


    ...
</activity>
...

使用自定义 LauncherActivity

使用自定义代码启动 Trusted Web Activity 时,可以在构建 intent 以启动 Trusted Web Activity 时调用 setAdditionalTrustedOrigins 来实现添加额外的源:

public void launcherWithMultipleOrigins(View view) {
  List<String> origins = Arrays.asList(
      "https://checkout.example.com/"
  );


  TrustedWebActivityIntentBuilder builder = new TrustedWebActivityIntentBuilder(LAUNCH_URI)
      .setAdditionalTrustedOrigins(origins);


  new TwaLauncher(this).launch(builder, null, null);
}

总结

完成上述步骤后,Trusted Web Activity 现在可以支持多个源站了。android-browser-helper 提供了一个适用于多源 Trusted Web Activity 的示例应用。请务必进行检查。

问题排查

设置 Digital Asset Links 涉及一些操作。如果应用仍在顶部显示“自定义标签页”栏,则可能是配置存在问题。

Trusted Web Activity 快速入门指南中有一个很棒的问题排查部分,介绍了如何调试 Digital Asset Link 问题。

此外,还有超棒的 Peter 的 Asset Link 工具,可帮助调试设备上安装的应用上的 Digital Asset Links。