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

22

在安卓12或更高版本中通过链接打开应用程序出现问题。

在低版本的安卓上一切正常。

当我查看“应用信息”->“默认打开方式”屏幕时,我看到未批准的链接。

当我将该链接作为受支持的Web地址之一并批准后,通过链接打开应用程序就可以正常工作。

enter image description here

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

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

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

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target" : { "namespace": "android_app", "package_name": "my.package.name",
               "sha256_cert_fingerprints": ["SHA_256"] }
}]

已经三次确认使用正确的SHA_256。

还使用“语句列表生成器和测试工具”测试了.json文件,链接如上所述。

AndroidManifest.xml中的意图过滤器

<intent-filter
   android:autoVerify="true"
   android:label="@string/login_to_app">
  
   <action android:name="android.intent.action.VIEW" />

   <category android:name="android.intent.category.DEFAULT" />
   <category android:name="android.intent.category.BROWSABLE" />

   <data
      android:host="my.domain.net"
      android:pathPrefix="/${dynamicVar}/our/application/"
      android:scheme="https" />
 </intent-filter>

我还将应用程序上传到Play 商店,以确保这不是SHA证书或 Play 商店相关的问题,但那里也没有任何区别。

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

我还尝试了添加每种可能的应用程序包名称组合以确保正确性。

简而言之: 由于不支持的 Web 地址,通过 Android 12 和更高版本上的链接打开应用程序无法工作。

我知道链接需要使用 .well-known/assetlinks.json 进行验证。当我手动检查受支持的 Web 地址时,它可以完美地工作,但这并非最终解决方案。

我无法想出自己漏掉了什么。

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


你解决了这个问题吗?@iWizard - Binesh
2个回答

37

有什么改变?

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

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栏中点击刷新,你会看到项目的Gradle脚本列表) 5. 点击你的项目(从列表(根)中选择你的项目名称) 6. 点击任务 7. 点击Android 8. 双击signingReport(你将在运行栏中得到SHA1和MD5(有时会在Gradle控制台中)) 9. 从模块选择下拉菜单中选择应用程序模块以运行或调试你的应用程序
在生成了.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>

手动测试意图链接是否正常工作:

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

adb shell am start -W -a android.intent.action.VIEW -d "https://my.domain.com/test?code=abcde"

手动测试意图链接

  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

之后你就可以开始了,你的意图链接将在Android 12及以下版本上正常工作。

最后的测试,检查你是否已经正确设置了一切
运行:

adb shell am start -W -a android.intent.action.VIEW -d "https://my.domain.com/test?code=abcde"

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

我可以再问你一些问题吗?当我看到这个文档时,我可以想象请求语句的流程是像 app(client)google APIyour server,我简单地告诉它是服务器端请求。但是当我检查这个时,我可以想象流程是像 app(client)your server,我简单地告诉它是客户端请求。哪一个是正确的? - Changdae Park

1

我曾经遇到过同样的问题,调试了好几天。

我没有意识到在主机名中使用通配符*.example.com时,将会尝试验证没有子域名的情况。

也就是说,验证器会尝试:

https://example.com

改为:

https://www.example.com

没有子域名,我们进行了301重定向,但根据官方指南,这种方法不起作用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接