如何在 Android 12 及更高版本上验证 Android 应用程序链接?

iWi*_*ard 22 android kotlin google-play android-12

问题是在 Android 12 或更高版本中通过链接打开应用程序。

\n

在较低版本的 Android 上一切正常。

\n

当我查看我的 \xe2\x80\x9cApp Info\xe2\x80\x9d -> \xe2\x80\x9c 默认打开\xe2\x80\x9d 屏幕时。我看到未经批准的链接。

\n

当我打开受支持网址内批准的链接时,可以通过链接打开应用程序。

\n

在此输入图像描述

\n

我已经阅读了有关在 android 文档中验证意图过滤器的内容,一切对我来说看起来都很好。

\n

https://developer.android.com/training/app-links/verify-site-associations#add-intent-filters

\n

已将 .well-known/assetlinks.json 添加到我的域\n https://my.domain.net/.well-known/assetlinks.json \n.well-known/assetlinks.json 的内容(使用https生成并检查) ://developers.google.com/digital-asset-links/tools/generator

\n
[{\n  "relation": ["delegate_permission/common.handle_all_urls"],\n  "target" : { "namespace": "android_app", "package_name": "my.package.name",\n               "sha256_cert_fingerprints": ["SHA_256"] }\n}]\n
Run Code Online (Sandbox Code Playgroud)\n

三次检查我使用的 SHA_256 是否正确。

\n

还测试了 .json 是否可以使用 \xe2\x80\x9cStatement List Generator 和 Tester\xe2\x80\x9d(上面提到的链接)。

\n

AndroidManifest.xml 内的 Intent 过滤器

\n
<intent-filter\n   android:autoVerify="true"\n   android:label="@string/login_to_app">\n  \n   <action android:name="android.intent.action.VIEW" />\n\n   <category android:name="android.intent.category.DEFAULT" />\n   <category android:name="android.intent.category.BROWSABLE" />\n\n   <data\n      android:host="my.domain.net"\n      android:pathPrefix="/${dynamicVar}/our/application/"\n      android:scheme="https" />\n </intent-filter>\n
Run Code Online (Sandbox Code Playgroud)\n

另外,我将应用程序上传到 Play 商店只是为了确保这不是 SHA 证书或与 Play 商店相关的问题,但没有区别。

\n

我还检查了我的应用程序包名称,它对于内部测试和调试都是正确的。

\n

为了确保安全,我还添加了应用程序包名称的每个组合。

\n

不久:\n由于网址不受支持,在 Android 12 及更高版本上无法通过链接打开应用程序。

\n

我知道链接需要使用 .well-known/assetlinks.json 进行验证\n当我手动检查支持的网址时,它可以正常工作,但这不是最终的解决方案。

\n

我不知道我在这里错过了什么。

\n

有人知道我在这里做错了什么吗?

\n

小智 41

发生了什么变化?

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

较低版本的android保持不变。


Android 12 中的验证如何进行?

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

注意
如果您在通过数字资产工具验证之前已经安装了该应用程序,它将不会在您的网站上检测到您的更新文件 (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 explicitly set android: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 enable 175408749 PACKAGE_NAME
  1. 重置设备上 Android 应用程序链接的状态
  • adb shell pm set-app-links --package PACKAGE_NAME 0 all
  1. 调用域验证过程
  • adb shell pm verify-app-links --re-verify 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-android-applinks