问题是在 Android 12 或更高版本中通过链接打开应用程序。
在较低版本的 Android 上一切正常。
当我查看“应用程序信息”->“默认打开”屏幕时。我看到未经批准的链接。
当我在受支持的网址内打开该链接并获得批准时,可以通过链接打开应用程序。
我已经阅读了有关在 Android 文档中验证意图过滤器的内容,对我来说一切看起来都很好。
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 过滤器
<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 商店相关的问题,但没有区别。
我还检查了我的应用程序包名称,它对于内部测试和调试来说都是正确的。
为了确保安全,我还添加了应用程序包名称的每个组合。
简短地说: 由于网址不受支持,在 Android 12 及更高版本上无法通过链接打开应用程序。
我知道链接需要使用 .well-known/assetlinks.json 进行验证 当我手动检查支持的网址时,它工作得很好,但这不是最终的解决方案。
我不知道我在这里错过了什么。
有人知道我在这里做错了什么吗?
改变了什么?
从 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 表格?
生成 .json 文件后,将其放入域的根目录 (.well-known/assetlinks.json)。
我建议手动打开它以确保。
https://my.domain.com/.well-known/assetlinks.json
在应用程序中设置意图链接
给你的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"
手动测试意图链接
adb shell am compat enable 175408749 PACKAGE_NAME
adb shell pm set-app-links --package PACKAGE_NAME 0 all
adb shell pm verify-app-links --re-verify PACKAGE_NAME
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
我也遇到了同样的问题,调试了好几天。
我不明白主机
*.example.com
中的通配符将在没有子域的情况下尝试进行验证。
意味着验证者尝试:
代替:
如果没有子域名,我们就有重定向 301,根据 官方指南,这是行不通的。