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 App Link
是基于您的网站网址的深层链接,该网址已经过验证,属于您的网站。 因此,如果已安装,则单击其中一个会立即打开您的应用程序 - 不显示消歧对话框。 虽然用户稍后可能会改变他们处理这些链接的偏好。
下表描述了更具体的差异。
二、请求应用链接验证
要为您的应用启用链接处理验证,请在应用清单中的任何一个Web URL intent
过滤器中设置android:autoVerify =“true”
,其中包括android.intent.action.VIEW intent action
和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”
时,在Android 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模式的默认处理程序。
支持多个主机的应用程序链接
系统必须能够针对托管在所有相应Web
域上的数字资产链接文件验证应用程序的URL intent
过滤器数据元素中指定的每个主机。 如果任何验证失败,则应用程序不会被验证为应用程序的intent
过滤器中定义的任何URL
模式的默认处理程序。 然后,系统默认使用其标准行为来解析意图,如创建应用程序内容的深层链接中所述。
例如,如果在https://www.example.com/.well-known/assetlinks.json
和https://www.example
都找不到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
过滤器包含一个只声明HTTPS
方案的<data>
元素。 但它与其他<data>
元素结合使用,因此intent
过滤器同时支持http://www.example.com
和https://www.example.com
。 因此,如果要定义URI
方案和域的特定组合,则必须创建单独的intent过滤器。
支持多个子域的应用程序链接
数字资产链接协议将意图过滤器中的子域视为唯一的独立主机。 因此,如果您的intent过滤器列出了具有不同子域的多个主机,则必须在每个域上发布有效的assetlinks.json
。 例如,以下intent
过滤器包括www.example.com
和mobile.example.com
作为已接受的intent URL
主机。 因此,必须在https://www.example.com/.well-known/assetlinks.json
和https://mobile.example.com/.well-known/assetlinks.json
上发布有效的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
)声明主机名,则必须在根主机名(example.com
)上发布assetlinks.json
文件。 例如,具有以下intent过滤器的应用程序将通过example.com
的任何子名称验证(例如foo.example.com
),只要assetlink.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>
三、声明网站关联
必须在您的网站上发布数字资产链接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.com
和example.net
的关联的示例。 第一个列表显示了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
文件与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或httpsandroid
:具有域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
系统的用户应用程序链接首选项记录相关。 该值不表示验证是否成功。
注意:如果用户在验证完成之前更改了应用的应用链接设置,即使验证失败,您也可能会看到成功验证的误报。 但是,如果用户明确启用应用程序以打开支持的链接而不询问,则此验证失败无关紧要。 这是因为用户首选项优先于编程验证(或缺少编程验证)。 因此,该链接直接转到您的应用,而不显示对话框,就像验证成功一样。
测试示例
要使应用链接验证成功,系统必须能够使用您在应用的意图过滤器中指定的所有网站验证您的应用,并且该网站符合应用链接的条件。 以下示例显示了定义了多个应用程序链接的清单配置:
<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)
要了解有关语句列表的更多信息,请参阅创建语句列表。