在Android M应用链接中处理特定路线

Mic*_*ael 5 android applinks android-6.0-marshmallow digital-assets-links

Android M 通过在Web服务器上创建特殊的assetlinks.json来将链接处理委派给移动应用,从而增加了对应用链接的支持。

例如,这是该文件的内容:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.costingtons.app",
    "sha256_cert_fingerprints": ["14:6D:E9:83:C5:73:06:50:D8:EE:B9:95:2F:34:FC:64:16:"
     "A0:83:42:E6:1D:BE:A8:8A:04:96:B2:3F:CF:44:E5"]
  }
}]
Run Code Online (Sandbox Code Playgroud)

当前,该关系被定义为common.handle_all_urls意味着任何URL将被路由到该应用。

我希望该应用程序打开特定的路线,例如https://costingtons.com/products/a-product将在应用程序中打开,而https://costingtons.com将打开网络版本。

Apple Universal Links类似的配置文件可以定义要在应用中打开的路径,并且语法支持模式匹配等/products/*

有什么办法可以通过Android中的App Link做类似的事情吗?

zma*_*ies 5

assetlinks.json文件指定允许该特定应用打开所有URL,但是该应用本身(通过其AndroidManifest中的意图过滤器)可能更具限制性,因此仅打开产品链接,而不打开常规网站链接。

此外,即使针对特定URL调用了意图过滤器,接收方仍然可以决定不对其进行处理,而将其留给下一个处理程序(通常是浏览器)。(也许您希望该应用程序在蜂窝网络上处理链接,但让浏览器在无线网络上处理链接)。

  • *“接收者仍然可以决定不处理它,把它留给下一个处理者”* - 这是否有记录?我仍然认为决定应用程序应该处理哪些路径的责任应该属于网站而不是应用程序。例如,网站可能希望让第 3 方应用程序处理网站的特定部分而不是其他部分,但被迫让应用程序处理所有内容 (2认同)
  • *“接收者仍然可以决定不处理它,把它留给下一个处理者”* - 你知道这是怎么做的吗? (2认同)

the*_*hal 5

据我所知,没有办法设置资产链接文件来确定哪些路径可以/应该打开应用程序(您可以使用 iOS AASA 文件的方式)。

但是,由于 Android 使用了意图过滤器,您可以使用它们来限制应打开应用程序的路径。根据之前的评论,assetlinks 文件只说明哪些 URL可以打开应用程序。由应用程序来定义打开应用程序的URL 。

因此,在上面的示例中,您需要为您的一项活动定义一个意图过滤器,该过滤器如下所示:

<intent-filter android:autoVerify="true">
    <category android:name="android.intent.category.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />

    <!-- Only accept URLs that look like https://costingtons.com/products/* -->
    <data
        android:scheme="https"
        android:host="costingtons.com"
        android:pathPrefix="/products/" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)

我发现的最大限制是无法排除某些路径(即不是带有 xyz 前缀的 URL),因此您必须想出一组详尽的 Intent Filters 匹配您的所有 URL确实要允许进入应用程序。