我已经设置assetlinks.json
,AndroidManifest.xml
以便在所有早期版本的 Android 中验证所需的应用程序链接。但是,验证不再适用于 Android 12(当前为 Beta 2)。adb shell pm get-app-links <PACKAGE_NAME>
返回legacy_failure
。
Android 12 中的 App Links 验证似乎有一些变化,但文档对于需要更改的内容以及更改是否向后兼容并不是很明确。
我已经设置assetlinks.json
,AndroidManifest.xml
以便在所有早期版本的 Android 中验证所需的应用程序链接。但是,验证不再适用于 Android 12(当前为 Beta 2)。adb shell pm get-app-links <PACKAGE_NAME>
返回legacy_failure
。
Android 12 中的 App Links 验证似乎有一些变化,但文档对于需要更改的内容以及更改是否向后兼容并不是很明确。
事实证明,如果你打破
<data android:scheme="http" android:host="www.example.com" />
分成 2 个标签
<data android:scheme="http" />
<data android:host="www.example.com" />
在 中AndroidManifest.xml
,应用链接将在 Android 12 上成功验证。此更改似乎也向后兼容旧版本的 Android,即使文档没有明确说明。
我遇到了同样的问题。
sha256_cert_fingerprints
调试和发布密钥库是不同的。
如果您仅在 上注册释放指纹assetlinks.json
,则验证不适用于调试版本。所以adb shell pm get-app-links <PACKAGE_NAME>
返回legacy_failure.
如果您添加两个指纹(调试和发布),它将起作用assetlinks.json
除了详细说明需要的其他答案之外:
sha256_cert_fingerprints
正在测试的构建类型使用正确的值,注意这可能会因您使用的是调试版本还是发布版本而有所不同scheme
的host
数据标签条目intent-filter
确保您的intent-filter
withandroid:autoVerify="true"
不包含任何自定义 uri 方案(即launch://myapp/screen
)也很重要,因为这些可能导致验证程序失败。
intent-filter
可以只为未将autoVerify
标志设置为的自定义 uri 方案提供新的true
。
根据此处的文档,在运行以下命令时检查 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
在 Android 12 上测试,Jadent 提到的所有点都是有效的,但是破坏主机和方案中的数据声明并不重要。
我也在“主机”属性中使用了通配符
android:host="*.example.com"
这应该在文档中得到支持
但是,当我运行域验证过程时
adb shell pm verify-app-links --re-verify PACKAGE_NAME
我收到了 legacy_failure 错误 :( 即使根据需要将assetlinks.json 放置在根域中。
如果主机是明确的:
android:host="www.example.com"
我没有这样的问题。