不能 link Android 带有数字资产 Link 的应用,因为应用没有签名

Can't link Android app with Digital Asset Link since app doesn't have a signature

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

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

我的应用程序link

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

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

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

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

请注意,我仅以 imgur.com 为例,无论如何我都不会 affiliated/working。

  1. 检查您的 assetlinks.json,并将其与正常工作的进行比较(例如 https://imgur.com/.well-known/assetlinks.json). You could also test your file like so: https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://imgur.com&relation=delegate_permission/common.handle_all_urls
  2. 接下来,检查您的 AndroidManifest.xml,并确保属性 android:autoVerify="true" 设置在 intent 元素上(错误地,我在 activity-element) 导致与上述相同的问题):
    <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>
  1. 接下来,构建一个已签名的 .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 -- 希望对您有所帮助!

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

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

问题是,ionic 插件使用 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": " "
    }
  }
}

此格式由插件自动生成,并添加多个host/scheme/prefix以允许支持多个地址。但是我只使用一个地址,所以当我用插件生成 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 个意图过滤器:

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

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