Android应用程式连结无法在已发布的版本中运作,但可以在本地安装中正常运作

时间:2020-07-19 05:59:10

标签: android applinks android-app-links

我有一个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

3 个答案:

答案 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)

documentation指出:

要为您的应用启用链接处理验证,请在应用清单中包含android:autoVerify="true"意向操作和android.intent.action.VIEW意向类别[ ...]

当任何一个意图过滤器中包含android.intent.category.BROWSABLE时,在具有Android 6.0及更高版本的设备上安装应用程序都会导致系统尝试验证与任何应用程序意图过滤器中的URL关联的所有主机。验证涉及以下内容:

系统检查所有意图过滤器,包括:

  • 操作:android:autoVerify="true"
  • 类别:android.intent.action.VIEWandroid.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留在资产链接中。它可以与本地版本一起使用,而实时版本的行为类似于深层链接,这可能表明您的数字资产链接存在一些问题。