由于应用没有签名,因此无法将 Android 应用与 Digital Asset Link 链接

Posted

技术标签:

【中文标题】由于应用没有签名,因此无法将 Android 应用与 Digital Asset Link 链接【英文标题】:Can't link Android app with Digital Asset Link since app doesn't have a signature 【发布时间】:2021-12-24 18:59:42 【问题描述】:

我正在尝试设置从我的网站到我的应用程序的数字资产链接,但我无法让它工作。我确保 intent-filter 存在于我的清单中,并使用我的 Play 商店签名 SHA 256 指纹上传了一个 assetlinks.json 文件,并使用 Google 的语句列表对其进行了测试,并成功返回。

在再次执行验证步骤时,我使用adb -d shell pm get-app-links --user current com.example.app 检查了我设备的应用链接,我意识到我的应用链接没有签名。我猜这可能是该应用无法链接到我的网站的原因,因为它无法将签名与托管在我网站服务器上的assetlinks.json 中给出的指纹进行比较。

我的应用链接

com.example.app 01234567-89ab-cdef-0123-456789abcdef:
    User 0:
      Verification link handling allowed: true
      Selection state:
        Enabled:
          com.example.app

与其他人比较

com.google.android.youtube:
    ID: 01234567-89ab-cdef-0123-456789abcdef
    Signatures: [<has-some-SHA256-certificate-fingerprints-here>]
    Domain verification state:
      youtu.be: system_configured
      m.youtube.com: system_configured
      youtube.com: system_configured
      www.youtube.com: system_configured
    User 0:
      Verification link handling allowed: true
      Selection state:
        Disabled:
          youtu.be
          m.youtube.com
          youtube.com
          www.youtube.com

由于某种原因,我的应用链接与大多数其他链接的格式不同,更重要的是没有签名,我不知道为什么。但是我尝试安装它,它总是给出相同的结果。我尝试安装它:

来自 Play 商店的内部测试 来自从App bundle explorer 下载的签名 apk 从我们通常上传到 Play 商店的签名 apk 来自在我的本地计算机上构建的手动签名 apk

有人知道我错过了什么吗?

【问题讨论】:

【参考方案1】:

我设法找到了解决问题的方法。结果我的intent-filter 有多个空的data 标签,这似乎阻止了我的应用程序检测到该网站。

由于我使用的是 Ionic,因此我忘记指定我是我的应用程序的 AndroidManifest 是由 Cordova 构建的。所以我不能直接编辑我的AndroidManifest。我必须使用ionic-plugin-deeplinks 插件。

问题是,离子插件使用package.json中给出的数据生成一个intent-filter,格式如下。

"cordova": 
  "plugins": 
    "ionic-plugin-deeplinks": 
      "URL_SCHEME": "my-url-scheme",
      "DEEPLINK_SCHEME": "https",
      "DEEPLINK_HOST": "com.example.app",
      "ANDROID_PATH_PREFIX": "/",
      "ANDROID_2_PATH_PREFIX": "/",
      "ANDROID_3_PATH_PREFIX": "/",
      "ANDROID_4_PATH_PREFIX": "/",
      "ANDROID_5_PATH_PREFIX": "/",
      "DEEPLINK_2_SCHEME": " ",
      "DEEPLINK_2_HOST": " ",
      "DEEPLINK_3_SCHEME": " ",
      "DEEPLINK_3_HOST": " ",
      "DEEPLINK_4_SCHEME": " ",
      "DEEPLINK_4_HOST": " ",
      "DEEPLINK_5_SCHEME": " ",
      "DEEPLINK_5_HOST": " "
    
  

此格式由插件自动生成并添加多个主机/方案/前缀以允许支持多个地址。但是我只使用一个地址,所以当我使用插件生成AndroidManifest 时,它会生成一个intent-filter,其中包含许多空的data 标签。

<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="com.example.app" android:pathPrefix="/" android:scheme="https" />
    <data android:host=" " android:pathPrefix="/" android:scheme=" " />
    <data android:host=" " android:pathPrefix="/" android:scheme=" " />
    <data android:host=" " android:pathPrefix="/" android:scheme=" " />
    <data android:host=" " android:pathPrefix="/" android:scheme=" " />
</intent-filter>

到目前为止,我设法删除额外的 data 标记的唯一方法是分叉插件的存储库并从插件中删除 package.json 额外的属性。它看起来像这样:

"cordova": 
  "plugins": 
    "ionic-plugin-deeplinks": 
      "URL_SCHEME": "my-url-scheme",
      "DEEPLINK_SCHEME": "https",
      "DEEPLINK_HOST": "com.example.app",
      "ANDROID_PATH_PREFIX": "/"
    
  

生成这个正在工作的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:host="com.example.app" android:pathPrefix="/" android:scheme="https" />
</intent-filter>

【讨论】:

【参考方案2】:

我可能刚刚解决了这样的问题。检查事项:

请注意,我只是以 imgur.com 为例,我不以任何方式附属/为他们工作。

    检查您的assetlinks.json,并将其与工作文件进行比较(例如https://imgur.com/.well-known/assetlinks.json)。你也可以像这样测试你的文件:https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://imgur.com&relation=delegate_permission/common.handle_all_urls 接下来,检查您的 AndroidManifest.xml,并确保在 intent-元素上设置了属性 android:autoVerify="true"(错误地,我在 activity-元素上声明了我的属性),这导致了同样的问题以上):
    <activity android:name=".MainActivity">
            <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="https"
                    android:host="imgur.com" />
            </intent-filter>
    </activity>
    接下来,构建一个签名的 .apk(使用相同的密钥库来签署您的 .apk,就像您在assetlinks.json 文件中设置足迹一样 - 即$ keytool -list -v -keystore myapp.keystore),并将其安装到模拟器中.像这样(首先从模拟器中卸载应用程序):
    $ adb install /myapp/app-release.apk
    $ adb shell
    : pm get-app-links com.myapp.app

此外,此参考页面在处理此问题时非常方便:https://developer.android.com/training/app-links/verify-site-associations#manual-verification -- 希望对您有所帮助!

【讨论】:

【参考方案3】:

这可能对其他人有所帮助,但我制作了 2 个意图过滤器:

    一个只有 http/s 数据标签和 另一个以我的应用名称作为方案。

当自定义主题捆绑在一个意图过滤器下时,它似乎不起作用。

【讨论】:

以上是关于由于应用没有签名,因此无法将 Android 应用与 Digital Asset Link 链接的主要内容,如果未能解决你的问题,请参考以下文章

android 安装包签名问题探究

对Android应用签名

无法通过 fastlane 使用 Google Play 应用签名将 android 包上传到 Google Play

如何对Android的APP进行签名

Android应用程序版本升级时签名冲突

应用宝 无法获取签名信息 360 解析证书为空!