验证Android应用链接

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

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

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

  • 请求清单中的自动应用链接验证。 这向Android系统发出信号,表明它应该验证您的应用是否属于您的意图过滤器中使用的URL域。

  • 通过在以下位置托管数字资产链接JSON文件来声明您的网站与您的意图过滤器之间的关系:
    https://domain.name/.well-known/assetlinks.json

您可以在以下资源中找到相关信息:

  • 在Android Studio中支持URL和应用程序索引

  • 创建语句列表

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

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

验证Android应用链接_第1张图片
图1.消歧对话框

Android App Link是基于您的网站网址的深层链接,该网址已经过验证,属于您的网站。 因此,如果已安装,则单击其中一个会立即打开您的应用程序 - 不显示消歧对话框。 虽然用户稍后可能会改变他们处理这些链接的偏好。

下表描述了更具体的差异。

验证Android应用链接_第2张图片
图片1.png

二、请求应用链接验证

要为您的应用启用链接处理验证,请在应用清单中的任何一个Web URL intent过滤器中设置android:autoVerify =“true”,其中包括android.intent.action.VIEW intent actionandroid.intent.category.BROWSABLE 意图类别,如以下清单代码段所示:



    
        
        
        
        
        
    


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

1、系统检查所有意图过滤器,包括:

  • 动作:android.intent.action.VIEW

  • 分类:android.intent.category.BROWSABLEandroid.intent.category.DEFAULT

  • 数据方案:httphttps

2、对于上述意图过滤器中找到的每个唯一主机名,Android会在https://hostname/.well-known/assetlinks.json上查询相应的数字资产链接文件网站。

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

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

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

例如,如果在https://www.example.com/.well-known/assetlinks.jsonhttps://www.example都找不到assetlinks.json文件,则具有以下意图过滤器的应用将无法验证达网络。



  
    
      
      
      
      
      
    
  
  
    
      
      
      
      
    
  


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

支持多个子域的应用程序链接

数字资产链接协议将意图过滤器中的子域视为唯一的独立主机。 因此,如果您的intent过滤器列出了具有不同子域的多个主机,则必须在每个域上发布有效的assetlinks.json。 例如,以下intent过滤器包括www.example.commobile.example.com作为已接受的intent URL主机。 因此,必须在https://www.example.com/.well-known/assetlinks.jsonhttps://mobile.example.com/.well-known/assetlinks.json上发布有效的assetlinks.json


  
    
      
      
      
      
      
    
  

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


  
    
      
      
      
      
    
  

三、声明网站关联

必须在您的网站上发布数字资产链接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.example Android应用授予链接开放权限:

[{
  "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",
    "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可能会为https://example.com/articles声明一个意图过滤器,而app2可能会为https://example.com/videos声明一个意图过滤器。

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

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

多个网站可以在各自的assetlinks.json文件中声明与同一应用程序的关联。 以下文件列表显示了如何使用app1声明example.comexample.net的关联的示例。 第一个列表显示了example.comapp1的关联:
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.netapp1的关联。 只托管这些文件的位置不同(.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文件与content-type application / json一起提供。

  • 无论您的应用程序的意图过滤器是否将HTTPS声明为数据方案,都必须可以通过HTTPS连接访问assetlinks.json文件。

  • 必须可以访问assetlinks.json文件,不需要任何重定向(没有301或302重定向),并且可以通过机器人访问(您的robots.txt必须允许抓取/.well-known/assetlinks.json)。

  • 如果您的应用程序链接支持多个主机域,则必须在每个域上发布assetlinks.json文件。 请参阅支持多个主机的应用链接。

  • 不要在清单文件中使用dev / test URL发布可能无法访问的应用程序(例如任何只能通过VPN访问的应用程序)。 在这种情况下,解决方法是配置构建变体以为开发构建生成不同的清单文件。

四、测试应用链接

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

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

确认要验证的主机列表

测试时,您应确认系统应为您的应用验证的关联主机列表。 列出其对应的intent过滤器包含以下属性和元素的所有URL

  • android:scheme属性,其值为http或https

  • android:具有域URL模式的host属性

  • android.intent.action.VIEW类别元素

  • android.intent.category.BROWSABLE类别元素

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

确认数字资产链接文件

或者每个网站,使用Digital Asset Links 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秒,以便系统完成验证过程。

该命令返回设备上定义的每个用户或配置文件的列表,前面带有以下格式的标头:

 Applinkages foruser 0:

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

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

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

  • - 根据其清单中声明的包名标识应用程序。

  • - 显示此应用处理的Web链接的主机的完整列表,使用空格作为分隔符。

  • 状态 - 显示此应用的当前链接处理设置。 已通过验证且其清单包含android:autoVerify =“true”的应用程序显示状态为always。 此状态后的十六进制数与Android系统的用户应用程序链接首选项记录相关。 该值不表示验证是否成功。

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

测试示例

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



    
        
            
            
            
            
            
        
        
            
            
            
        
    

    
        
            
            
            
            
        
    

      
        
            
            
            
        
        
            
            
            
        
      


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

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)

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

你可能感兴趣的:(验证Android应用链接)