应用程序链接无法在Android上运行

我的应用程序定义了意图filter来处理来自我的网站定义的URL

            

该应用程序正确检测正确主机的URL,但查询用户是否在应用程序或浏览器中打开它们。 我尝试使用此处指定的应用链接validation。 https://developer.android.com/training/app-links/index.html

如我的服务器日志中所示,安装时,应用程序设备会查询/well-known/assetlinks.json,并以200状态响应。 使用。测试数字资产文件

https:// digitalassetlinks.googleapis.com/v1/statements:list?source.web.site= https:// :&relation = delegate_permission / common.handle_all_urls

API并没有发现任何错误。

使用了获得assetlinks.json文件中的SHA256

 keytool -list -v -keystore my-release-key.keystore 

应用程序签名的.keystore。

运行adb shell dumpsys package d返回链接validation状态为“ask”,表示validation失败。 为什么validation会失败?

Solutions Collecting From Web of "应用程序链接无法在Android上运行"

哦,Gawd对我们来说是Windows系列的结局!

使用“ https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://:&relation = delegate_permission / common.handle_all_urls”进行测试certificate非常宝贵,因为它给了我们一个“可以不解析语句列表(无效JSON)“错误导致我们解决问题。

提示:最好使用Android Studio App Links Assistant中的“保存文件”按钮,而不是像我们一样复制和粘贴 – 这样就可以自行生成文件并保证不会出现此问题。

对我来说,它归结为检查所有基础知识:

  1. 使用此工具validation我的assetLinks文件是否合适:(将domain1:port替换为您的域) https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://domain1:port&relation=delegate_permission /common.handle_all_urls
  2. 始终使用已签名的APK进行测试
  3. 确保测试设备运行的是Android 6.0或更高版本(这是因为我忘记了它 – 在旧版本的android上,你总是得到用户提示)

有一些常见的陷阱你应该检查两次(我不是说你做错了。它只是一个检查清单):

  1. validationassetlinks.json是否有效并可从https://example.com/.well-known/assetlinks.json存储,以便访问https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site= https://example.com&relation=delegate_permission/common.handle_all_urls ,必须没有错误。
  2. 如果您一次链接多个域,请检查是否正确设置了所有域,如步骤1中所示。
  3. 确保包含标记的具有属性android:autoVerify="true"
  4. validation您的标记中是否包含所需的 标记:

      

    asset_statements字符串的内容必须是:

     [{\"include\": \"https://example.com/.well-known/assetlinks.json\"}] 
  5. 用于调试也是发布签名证书(不要害怕你不能意外上传)在build.gradle使用它:

     buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } debug { debuggable true signingConfig signingConfigs.release } } 

就我而言, adb shell dumpsys package d显示在assetlinks.json未正确配置packageName 。 我在AndroidManifest.xml使用了manifest标签的package属性值,但是我应该在build.gradle文件中使用android.defaultConfig.packageId值。

系统应用选择窗口有两种情况

1)用户通过转到设置>应用程序>齿轮图标>打开链接>选择应用程序>打开支持的链接>每次选择提示来更改与设置相关的打开链接。

2)默认应用程序未由用户设置,并且在其中一个支持应用程序链接的应用程序中未启用自动validation

我认为在您的情况下启用了自动validation,因此请检查用户设置。

对我来说,事实是我的assetlinks.json文件是UTF-8并且包含一个字节顺序标记 (BOM),这是一个三字节的幻数,位于文件的头部,用于向编程消耗程序发送信号。 BOM是可选的,显然Google / Android工具不喜欢看到它。 当它出现时,谷歌的数字资产链接validation程序(下面的URL)给了我一个“格式错误的JSON”错误。

如果您使用的是Visual Studio,以下是如何确定文件中是否包含BOM,并在必要时将其删除:

  1. 右键单击assetlinks.json文件。
  2. 从上下文菜单中选择“打开方式…”。
  3. 在“打开方式”对话框中选择“二进制编辑器”。
  4. 检查文件字节。 如果文件以EF BB BF开头,那就是问题所在。
  5. 删除这些字符(您可以通过任一列执行此操作)并保存文件。
  6. 重新上传文件并使用Google工具(以下url)对其进行测试,它应该适合您。

这是您可以用来检查文件的URL(用您的实际URL替换example.com):

https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://example.com&relation=delegate_permission/common.handle_all_urls

更新

所以我解决了我的问题。 不确定是哪一个(可能是一个组合),但这就是我做的:

  • 卸载了“适用于即时应用程序的Google Play服务”:我之前使用过Instant Apps进行了修改,所以我想也许一些旧的配置可能会像调试包名称一样,但这不太可能。
  • 停止使用代理:代理有助于调试网络调用,但我正在使用的工具可能不完全支持HTTP / 2。
  • 删除旧版子域的意图filter: 这是最重要的 。 我的一个子域名已被弃用,不再可用。 在AndroidManifest中,如果为包含至少一个 autoVerify意图filter的活动声明了多个主机名,则会检查每个主机的数字资产链接JSON文件。 如果即使其中一台主机autoVerify失败,则不会自动validation所有主机。

原版的

当我第一次遇到这个问题时,原因是我的网络阻止了对Google服务器的调用以validation应用链接。

随着OP和其他答案的触及,通常对端点的API调用:

digitalassetlinks.googleapis.com

必须成功绕过选择器对话框。 这是Android系统进行的Web调用,用于validationDigital Asset Link JSON文件,并且似乎是在应用安装/更新时进行的。 一个有用的地方是Logcat,搜索带有文本“I / SingleHostAsyncVerifier:”的项目。 如果您在日志末尾看到“ – > true”,那么您的应用

最近,由于最近可能引入的一些错误,这些调用对我来说是失败的。 设备正在从上面的API调用中接收此响应:

错误:不可用:从{host} / .enle known / assetlinks.json(相当于'{host} /.well-known / assetlinks.json’)获取语句时,HTTP响应头中的内容types错误:expected’ Content-Type:application / json’但在从{host}获取Web语句时findtext / html [11] ./。熟知/ assetlinks.json

自从我上次查看这些请求以来已经有一段时间了,所以我不记得它们之前的样子。 但似乎有可能最近有一些涉及App Links或Android网络框架的更新,他们切换到这个function的协议缓冲区(并忘了支持另一个)。

事情可能已经改变的另一个迹象是,今天的请求路径看起来与前面答案中提到的路径不同:

https://digitalassetlinks.googleapis.com/google.digitalassetlinks.v1.AssetLinks/Check