我有一个game正在使用应用链接。从我的计算机运行调试和发行版本时,该应用程序链接可以正常工作,但不适用于从Google Play下载的版本。在Google Play版本中,我看到一个对话框,询问哪个应用程序应打开链接。
我使用“由Google Play进行应用签名”,并且了解发行版APK由Google签名并且具有不同的签名。我已将Google Play上列出的应用程序签名证书中的SHA-256证书指纹添加到我的assetlinks.json中,因此它包含本地版本和Google Play版本的指纹。
我还从Google Play下载了派生的APK,并确保指纹与assetlinks.json文件中的指纹匹配。
下面是一个示例网址,当您在Android中单击该网址时,应打开该应用(适用于本地版本),但不适用于Google Play版本。相反,我看到一个对话框,询问哪个应用程序应打开链接。
https://letsdraw.fun/ec?parent=Z0ibN7m-H8jO1jCiMRQtY23VTpKjnIch
我正在从实时发行版的logcat中写出SHA256指纹,以仔细检查它是否正确,而且一切都很好。
原始签名的APK和Google Play签名的APK可以从here下载。这两个APK都是从Google Play下载的,一个是“原始”,另一个是“派生”,因此除了签名外,它们应该相同。有趣的是,它们的大小略有不同。 11,590,297字节和11,601,619字节。
看adb shell dumpsys package domain-preferred-apps
的输出,原始签名的apk是
Package: com.scribble.exquisitecorpse
Domains: letsdraw.fun scribble-cloud.appspot.com scribble-cloud-v24-test-dot-scribble-cloud.appspot.com
Status: always : 200000000
Google Play签名的APK是
Package: com.scribble.exquisitecorpse
Domains: letsdraw.fun scribble-cloud.appspot.com scribble-cloud-v24-test-dot-scribble-cloud.appspot.com
Status: ask
使用@ymindstorm提到的测试页进行测试时
https://developers.google.com/digital-asset-links/tools/generator
我收到消息
成功!主机letsdraw.fun授予应用深链接至 com.scribble.exquisitecorpse。
您对导致这种情况的原因有何建议?
更新: 我现在已将此错误报告给Google,因为我无法弄清发生了什么。 https://issuetracker.google.com/issues/162564916
答案 0 :(得分:1)
最终我从Google得到了帮助……这不是一个错误。
构建过程正在从network_security_config.xml
文件合并到主机中,因此即使指定了AndroidManifest.xml
文件,也是如此:
<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" />
<data android:host="letsdraw.fun" android:pathPrefix="/ec" android:scheme="https" />
<data android:host="letsdraw.fun" android:pathPrefix="/restore" android:scheme="https" />
</intent-filter>
构建过程中的文件也指定了其他主机:
<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" />
<data
android:scheme="http"
android:host="scribble-cloud-v24-test-dot-scribble-cloud.appspot.com"
android:pathPrefix="/ec" />
<data
android:scheme="https"
android:host="scribble-cloud.appspot.com"
android:pathPrefix="/ec" />
<data
android:scheme="https"
android:host="letsdraw.fun"
android:pathPrefix="/ec" />
<data
android:scheme="https"
android:host="letsdraw.fun"
android:pathPrefix="/restore" />
</intent-filter>
在this页上指出
仅当系统为所有找到匹配的数字资产链接文件时 清单中的主机会先将其建立为默认应用 指定的网址格式的处理程序。
问题是我的测试主机未返回与其他主机相同的assetlinks.json
文件。
构建APK后,使用IntelliJ或Android Studio转到Build | Analyze Apk
并打开刚刚构建的APK以检查您的主机是否正确,并且assetlinks.json
文件返回正确的签名。
为什么这样合并清单文件?希望我们能找到here!
答案 1 :(得分:0)
要为您的应用启用链接处理验证,请在应用清单中包含
android:autoVerify="true"
意向操作和android.intent.action.VIEW
意向类别[ ...]当任何一个意图过滤器中包含
android.intent.category.BROWSABLE
时,在具有Android 6.0及更高版本的设备上安装应用程序都会导致系统尝试验证与任何应用程序意图过滤器中的URL关联的所有主机。验证涉及以下内容:系统检查所有意图过滤器,包括:
- 操作:
android:autoVerify="true"
- 类别:
android.intent.action.VIEW
和android.intent.category.BROWSABLE
- 数据方案:http或https 对于在上述意图过滤器中找到的每个唯一主机名,Android会在
android.intent.category.DEFAULT
的相应网站上查询Digital Asset Links文件。仅当系统为清单中的所有主机找到匹配的Digital Asset Links文件时,系统才会将您的应用建立为指定URL模式的默认处理程序。
因此,为了跳过歧义消除对话框,您需要验证您是否正确配置了应用程序以及在正确的位置可以使用assetlinks.json。 根据经验,常见的陷阱是:
https://<hostname>/.well-known/assetlinks.json
您可以使用此便捷工具来检查您的配置文件是否正确:
https://developers.google.com/digital-asset-links/tools/generator
答案 2 :(得分:0)
您是否尝试仅将Google Play中的SHA-256留在资产链接中。它可以与本地版本一起使用,而实时版本的行为类似于深层链接,这可能表明您的数字资产链接存在一些问题。