【Android必备】验证Android应用链接(17)

概要


Android应用程序链接是一种特殊类型的深层链接,可让您的网站网址立即在Android应用程序中打开相应的内容(无需用户选择应用程序)。

要将Android应用链接添加到您的应用,请定义使用HTTP URL打开应用内容的意图过滤器(如创建应用内容的深层链接所述 ),并验证您是否拥有应用和网站网址(如本指南中所述)。如果系统成功验证您拥有这些网址,系统会自动将这些网址意图路由到您的应用。

要验证您的应用和网站的所有权,需要执行以下步骤:

  • 在清单中请求自动应用链接验证。这向Android系统表明它应该验证您的应用属于您的意图过滤器中使用的网址域。
  • 通过在以下位置托管数字资产链接JSON文件来声明您的网站与您的意图过滤器之间的关系:
https://domain.name/.well-known/assetlinks.json

您可以在以下资源中找到相关信息:
在Android Studio中支持URL和App Indexing

创建一个语句列表

深层链接和应用链接之间的区别


一个深层链接是一个意图过滤器,允许用户在Android应用中直接输入一个特定的活动。点击其中一个链接可能会打开一个消歧义对话框,允许用户从多个应用程序(包括您的)中选择一个可以处理给定URL的应用程序。例如,图1显示用户点击地图链接后的消歧对话框,询问是否在地图或Chrome中打开链接。
【Android必备】验证Android应用链接(17)
图1.消歧对话框

Android应用链接是基于您的网站网址的深层链接,该网址已被验证属于您的网站。因此,单击其中一个会立即打开您的应用,如果已安装 - 消除歧义对话框不会出现。虽然用户以后可能会改变他们处理这些链接的偏好。

下表介绍了更具体的差异。
【Android必备】验证Android应用链接(17)

请求应用链接验证


要为您的应用启用链接处理验证,请android:autoVerify="true" 在您的应用清单中的任意一个网址意图过滤器中设置,其中包含android.intent.action.VIEW意向操作和 android.intent.category.BROWSABLE意向类别,如以下清单代码片段所示

<activity ...>

    <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="http" android:host="www.example.com" />
        <data android:scheme="https" />
    </intent-filter>

</activity>

如果android:autoVerify="true"您的任何一个意图过滤器都存在,则在安装了6.0及更高版本的设备上安装您的应用会导致系统尝试验证与您应用的任何意向过滤器中的网址相关联的所有主机。验证涉及以下内容:

  1. 系统检查所有意图过滤器,包括:
    • 行动: android.intent.action.VIEW
    • 类别:android.intent.category.BROWSABLE和 android.intent.category.DEFAULT
    • 数据方案:http或https
  2. 对于在上述意图过滤器中找到的每个唯一主机名,Android会在相应网站查询数字资产链接文件 。
    https://hostname/.well-known/assetlinks.json

只有当系统为清单中的所有主机找到匹配的数字资产链接文件时,才会将您的应用程序建立为指定URL模式的默认处理程序。

支持多个主机的应用程序链接

系统必须能够根据托管在所有相应网域上的数字资产链接文件来验证应用的URL意图过滤器数据元素中指定的每个主机。如果任何验证失败,则该应用程序未验证为应用程序意图过滤器中定义的任何URL模式的默认处理程序。系统默认使用其标准行为来解决意图,如创建应用程序内容的深层链接中所述 。

例如,如果有以下意图过滤器的应用程序将无法通过验证assetlinks.json的文件并没有在这两个发现 https://www.example.com/.well-known/assetlinks.json和 https://www.example.net/.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="http" android:host="www.example.com" />
      <data android:scheme="https" />
    </intent-filter>
  </activity>
  <activity android:name=”SecondActivity”>
    <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" android:host="www.example.net" />
    </intent-filter>
  </activity>

</application>

请记住,<data>同一个意图过滤器中的所有元素会合并在一起,以说明其组合属性的所有变体。例如,上面的第一个intent过滤器包含一个<data>只声明HTTPS方案的元素。但它与其他<data>元素结合使用,意图过滤器支持http://www.example.com和https://www.example.com。因此,当您想要定义URI方案和域的特定组合时,您必须创建单独的意图过滤器。

支持多个子域名的应用链接

数字资产链接协议将您意图过滤器中的子域视为唯一的独立主机。因此,如果您的意图过滤器列出了多个具有不同子域的主机,则必须assetlinks.json在每个域上发布有效的 域名。例如,以下intent过滤器包含www.example.com和 mobile.example.com作为接受的意向URL主机。所以一个有效的 assetlinks.json必须发表在两个 https://www.example.com/.well-known/assetlinks.json和 https://mobile.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="www.example.com" />
      <data android:scheme="https" android:host="mobile.example.com" />
    </intent-filter>
  </activity>
</application>

或者,如果您使用通配符声明主机名(例如*.example.com),则必须assetlinks.json在根主机名(example.com)处发布文件。例如,只要文件发布在以下位置,具有以下意向过滤器的应用程序就会通过任何子名称example.com(例如foo.example.com)的验证:assetlinks.jsonhttps://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>

声明网站协会


一个数字资产链接 JSON文件必须在你的网站上公布,以表明与该网站相关的Android应用和验证应用程序的URL意图。JSON文件使用以下字段来标识关联的应用程序:

  • package_name:应用 程序build.gradle文件中声明的应用程序ID。
  • sha256_cert_fingerprints:您应用签名证书的SHA256指纹。您可以使用以下命令通过Java keytool生成指纹:
$ keytool -list -v -keystore my-release-key.keystore

该字段支持多个指纹,可用于支持不同版本的应用程序,如调试和生产版本。

以下示例assetlinks.json文件授予com.exampleAndroid应用的链接开放权限 :

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example",
    "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"]
  }
}]

将网站与多个应用相关联

网站可以在同一个assetlinks.json 文件中声明与多个应用程序的关联。以下文件列表显示声明与两个应用程序关联的语句文件的示例,它们位于 https://www.example.com/.well-known/assetlinks.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.puppies.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"]
  }
  },
  {
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.example.monkeys.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"]
  }
}]

不同的应用程序可能会在同一个Web主机下处理不同资源的链接。例如,app1可以声明一个intent过滤器https://example.com/articles,app2可以声明一个intent过滤器https://example.com/videos。

注意:与域相关的多个应用程序可能使用相同或不同的证书进行签名

将多个网站与单个应用关联

多个网站可以在各自的assetlinks.json文件中声明与同一应用的关联。以下文件列表显示了如何声明example.com和example.net与app1的关联的示例。第一个列表显示了example.com与app1的关联:

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

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.mycompany.app1",
    "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"]
  }
}]

下一个清单显示example.net与app1的关联。只有托管这些文件的位置不同(.com和.net):

https://www.example.net/.well-known/assetlinks.json

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target": {
    "namespace": "android_app",
    "package_name": "com.mycompany.app1",
    "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"]
  }
}]

发布JSON验证文件
您必须在以下位置发布您的JSON验证文件:

https://domain.name/.well-known/assetlinks.json

请确保以下内容:

  • 该assetlinks.json文件与内容类型一起提供 application/json。
  • 该assetlinks.json文件必须可通过HTTPS连接访问,无论您的应用的意图过滤器是否将HTTPS声明为数据方案。
  • 该assetlinks.json文件必须无需任何重定向(无301或302重定向),并且可以被机器人访问(您robots.txt必须允许抓取 /.well-known/assetlinks.json)。
  • 如果您的应用链接支持多个主机域,那么您必须assetlinks.json在每个域上发布该 文件。请参阅 支持多个主机的应用链接。
  • 请勿在清单文件中公开您的应用程序的开发/测试URL,这些URL可能对公众不可访问(例如只能使用×××访问的任何URL)。在这种情况下,解决方法是配置构建变体以为开发生成生成不同的清单文件。

测试应用链接


在实施应用链接功能时,您应该测试链接功能以确保系统可以将您的应用与您的网站关联起来,并按照您的预期处理URL请求。

要测试现有的语句文件,可以使用 语句列表生成器和测试器工具。

确认要验证的主机列表

测试时,应确认系统应为您的应用验证的关联主机列表。制作其相应意向过滤器包含以下属性和元素的所有网址列表:

  • android:scheme属性的值为http或https
  • android:host 属性与域URL模式
  • android.intent.action.VIEW 类别元素
  • android.intent.category.BROWSABLE 类别元素

使用此列表检查每个指定主机和子域上是否提供了数字资产链接JSON文件。

确认数字资产链接文件

对于每个网站,请使用数字资产链接API来确认数字资产链接JSON文件的托管和定义是否正确:

https://digitalassetlinks.googleapis.com/v1/statements:list?
   source.web.site=https://domain.name:optional_port&
   relation=delegate_permission/common.handle_all_urls

测试URL意图

确认与您的应用关联的网站列表后,如果您确认托管的JSON文件有效,请在设备上安装该应用。等待至少20秒钟,完成异步验证过程。使用以下命令检查系统是否验证了您的应用并设置了正确的链接处理策略:

adb shell am start -a android.intent.action.VIEW \
    -c android.intent.category.BROWSABLE \
    -d "http://domain.name:optional_port"

检查链接政策

作为测试过程的一部分,您可以检查链接处理的当前系统设置。使用以下命令获取连接设备上所有应用的现有链接处理策略列表

adb shell dumpsys package domain-preferred-apps

或者下面的做同样的事情:

adb shell dumpsys package d

注意:确保在安装应用程序后至少等待20秒,以便系统完成验证过程。

该命令将返回设备上定义的每个用户或配置文件的列表,并以以下格式的标题开头:

App linkages for user 0:

在此标题后面,输出使用以下格式列出该用户的链接处理设置:

Package: com.android.vending
Domains: play.google.com market.android.com
Status: always : 200000002

此列表指示哪些应用程序与该用户的哪些域相关联:

  • Package - 通过其清单中声明的​​软件包名称识别应用程序。
  • Domains - 显示其网页链接此应用程序处理的主机的完整列表,使用空格作为分隔符。
  • Status - 显示此应用的当前链接处理设置。已通过验证并且其清单包含的应用程序android:autoVerify="true"显示的状态为always。此状态之后的十六进制数字与Android系统的用户应用程序链接首选项记录相关。该值不表示验证是否成功。

注意:如果用户在验证完成之前更改应用的应用链接设置,即使验证失败,您也可能会看到成功验证的误报。但是,如果用户明确启用应用程序而不询问就打开支持的链接,则此验证失败并不重要。这是因为用户首选项优先于编程验证(或缺少它)。因此,链接直接转到您的应用程序,而不显示对话框,就像验证成功。

测试示例

要使应用链接验证成功,系统必须能够使用您在应用的意图过滤器中指定的所有网站验证您的应用,并且符合应用链接的条件。以下示例显示了定义了几个应用链接的清单配置:

<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="www.example.com" />
            <data android:scheme="https" android:host="mobile.example.com" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" android:host="www.example2.com" />
        </intent-filter>
    </activity>

    <activity android:name=”SecondActivity”>
        <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" android:host="account.example.com" />
        </intent-filter>
    </activity>

      <activity android:name=”ThirdActivity”>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:scheme="https" android:host="map.example.com" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="market" android:host="example.com" />
        </intent-filter>
      </activity>

</application>

平台尝试从上述清单中验证的主机列表是:

www.example.com
mobile.example.com
www.example2.com
account.example.com

平台不会尝试从上述清单中验证的主机列表是:

map.example.com (it does not have android.intent.category.BROWSABLE)
market://example.com (it does not have either an “http” or “https” scheme)

要了解有关语句列表的更多信息,请参阅 创建语句列表

Lastest Update:2018.04.23

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Android必备】验证Android应用链接(17)

转载于:https://blog.51cto.com/4789781/2122478

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值