App Links 的多子域支持

Multiple subdomain support with App Links

我一直在阅读支持 android 应用程序 link 的文档,我的应用程序支持的网站使用子域,但子域太多,而且它们是动态构建的。我想知道是否有一种方法可以支持许多子域而不必在 intent-filter 标记中全部指定它们。

这是 google 中示例的 link:http://developer.android.com/training/app-links/index.html#request-verify 该示例位于支持应用程序 linking for multiple subdomains 位置。

我认为正则表达式可以工作,但显然在定义主机时不支持它。我不想列出所有这些,因为这意味着必须为每个创建的新子域推送一个新版本

<activity ...>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="https" />
        <data android:host=".*.example.org" />
        <data android:pathPattern="/.*" />
    </intent-filter>
</activity>

我不希望使用第三方库或服务。但是任何对您有用的建议都将不胜感激,以了解如何使这项工作发挥作用。

the website my app supports works with subdomains but there's too many subdomains and they are built dynamically

欢迎您为其中的某些子集(例如,在您构建应用程序时已知的链接)实现应用程序链接。您甚至可以考虑编写一个 Gradle 插件,它可以从某处的域列表中生成适当的清单元素。

但是,域会在安装时进行检查,并且无法添加新域,除非使用新清单发布新版本的应用程序。

I was wondering if there is a way to support many subdomains without having to specifiy them all in the intent-filter tag.

不,对不起。 Android 检查域并在安装时检索 JSON 文件。

I thought a regex would work but apparently that's not supported when defining the host

您无法从正则表达式下载 JSON。

I don't want to list all of them since that would mean having to push a new release with every new subdomain created

那么要么支持一些通用的子集,要么暂时不支持应用链接。可以想象,如果不太可能,恕我直言,Google 将来会为此提供更灵活的选择。

更新:2019-11-08:看来 as of .

您可以将您的域添加为 *.example.com。在 the docs 处说通配符可以用作主机的第一个字符。因此,您可以将清单更改为如下内容:

<intent-filter . . . >
    <data android:scheme="https" />
    <data android:host="*.example.org" />
    . . .
</intent-filter>

这应该适用于子域:

  • example.org
  • www.example.org
  • 任何其他子域。example.org

经过多次测试,自android 7.1(api 25级)起支持多个子域。 在之前的版本中,我们在安装应用程序时遇到了这个错误:E/HostsVerifier: Invalid host to verify (*.example.org):Input host is not valid.

引用自:Verify Android App Links

或者,如果您使用通配符(例如 *.example.com)声明您的主机名,则必须在根主机名 (example.com) 处发布您的 assetlinks.json 文件。例如,具有以下 Intent 过滤器的应用程序将通过对 example.com 的任何子名称(例如 foo.example.com)的验证,只要 assetlinks.json 文件发布在 https: / /example.com/.well- known/assetlinks.json:

<application>
  <activity android:name=”MainActivity”>
    <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:scheme="https" android:host="*.example.com" />
    </intent-filter>
  </activity>
</application>

以前的答案似乎已经过时,Android 现在确实支持主机名中的通配符。根据文档,现在支持它。