Android 12 上的应用链接“legacy_failure”验证错误

Mar*_*Lan 17 android android-deep-link android-app-links

我已进行设置assetlinks.jsonAndroidManifest.xml以便在所有以前版本的 Android 中验证所需的应用程序链接。但是,该验证在 Android 12(当前为 Beta 2)中不再起作用。adb shell pm get-app-links <PACKAGE_NAME>返回legacy_failure

Android 12 中的 App Links 验证似乎有一些更改,但文档并没有非常明确地说明需要更改哪些内容以及更改是否向后兼容。

Mar*_*Lan 30

事实证明,如果你打破了

<data android:scheme="http" android:host="www.example.com" />
Run Code Online (Sandbox Code Playgroud)

分成2个标签

<data android:scheme="http" />
<data android:host="www.example.com" />
Run Code Online (Sandbox Code Playgroud)

在 中AndroidManifest.xml,应用程序链接将在 Android 12 上成功验证。此更改似乎也向后兼容旧版本的 Android,尽管文档没有明确说明。


小智 14

我遇到了同样的问题。

sha256_cert_fingerprints调试和发布密钥库是不同的。

如果您仅在 上注册发布指纹assetlinks.json,则验证在调试版本上不起作用。所以adb shell pm get-app-links <PACKAGE_NAME>返回legacy_failure.

如果您添加两个指纹(调试和发布),它将起作用assetlinks.json


Jad*_*ent 8

除了详细说明需要的其他答案之外:

  • sha256_cert_fingerprints确保您为正在测试的构建类型使用正确的值,请注意,这可能会根据您使用的是调试还是发布构建而有所不同
  • 使用单独的scheme数据host标签条目进行intent-filter定义

确保您的intent-filterwithandroid:autoVerify="true"不包含任何自定义 uri 方案(即launch://myapp/screen)也很重要,因为这些方案可能会导致验证程序失败。

可以仅为您未将标志设置intent-filter为 的自定义 uri 方案提供新的。autoVerifytrue

按照此处的文档,在运行以下命令时检查 logcat 以确认验证是否正常工作。

adb shell pm verify-app-links --re-verify <PACKAGE_NAME>

IntentFilterIntentOp查找说明验证成功或失败的术语,即:

I/IntentFilterIntentOp:验证23完成。成功:正确。失败的主机:。[上下文 service_id=244 ]

intent-filter如果无法验证一个或多个定义,您可能会在 Logcat 中看到以下内容:

“D/ProcessState:启用单向垃圾邮件检测的 Binder ioctl 失败:参数无效”并且没有提及IntentFilterIntentOp


小智 5

发生了什么变化?

从 Android 12 开始,他们引入了一种检查支持的 Web 域的新方法。

较低版本的android保持不变。

Android 12 中的验证如何进行?

安装应用程序时,android 会向意图链接内的域发送异步请求,以检查 .well-known/assetlinks.json 是否存在且有效。

如何生成assetlinks.json?

我建议使用谷歌提供的这个工具来生成该文件。它还可以检查 assetlinks.json 是否存在且设置正确。生成器: https: //developers.google.com/digital-asset-links/tools/generator

从哪里获取 SHA-256 表格

  1. 打开Android Studio
  2. 打开你的项目
  3. 单击 Gradle(从右侧面板中,您将看到 Gradle 栏)
  4. 单击刷新(单击 Gradle Bar 中的刷新,您将看到列表
  5. 您项目的 Gradle 脚本)
  6. 单击您的项目(您的项目名称表单列表(根))
  7. 单击任务
  8. 点击安卓
  9. 双击签名报告(您将在运行栏中获得 SHA1 和 MD5(有时会在 Gradle 控制台中))
  10. 从模块选择下拉列表中选择应用程序模块以运行或调试您的应用程序

生成 .json 文件后,将其放入域的根目录 (.well-known/assetlinks.json)。我建议手动打开它以确保安全。 https://my.domain.com/.well-known/assetlinks.json

在应用程序中设置 Intent 链接

到您的 AndroidManifest.xml 添加

<!-- Make sure you have explicitly set autoVerify to true -->
<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" />
 <!-- If a user clicks on a shared link that uses the "http" scheme, your
     app should be able to delegate that traffic to "https". -->
<data android:scheme="http" />
<data android:scheme="https" />

<!-- Include one or more domains that should be verified. -->
  <data
          android:scheme="https"
          android:host="**my.domain.com**"
          android:pathPrefix="/test" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)

手动测试意图链接是否有效:

您可以在模拟器运行时运行此命令,它应该打开应用程序:

adb shell am start -W -a android.intent.action.VIEW -d "https://my.domain.com/test?code=abcde"
Run Code Online (Sandbox Code Playgroud)

手动测试意图链接

  1. 支持更新的域名验证流程

    adb shell am compat 启用 175408749 PACKAGE_NAME

  2. 重置设备上 Android 应用程序链接的状态

adb shell pm set-app-links --package PACKAGE_NAME 0 全部

  1. 调用域验证过程

adb shell pm verify-app-links --重新验证 PACKAGE_NAME

运行此命令后,等待至少一分钟让应用程序验证您的域名至关重要

  1. 查看验证结果

adb shell pm get-app-links PACKAGE_NAME

该命令的输出类似于以下内容:

com.example.pkg:
ID: 01234567-89ab-cdef-0123-456789abcdef
Signatures: [***]
Domain verification state:
  my.domain.com: verified
  sub.example.com: legacy_failure
  example.net: verified
  example.org: 1026
Run Code Online (Sandbox Code Playgroud)

之后您就可以开始了,您的意图链接将在 Android 12 及更低版本上运行。

最终测试检查您是否已正确设置所有内容 运行:

 adb shell am start -W -a android.intent.action.VIEW -d "https://my.domain.com/test?code=abcde"
Run Code Online (Sandbox Code Playgroud)

来源: https: //developer.android.com/training/app-links/verify-site-associations