1

我正在尝试设置从我的网站到我的应用程序的数字资产链接,但我无法让它工作。我确保它intent-filter存在于我的清单中,并assetlinks.json使用我的 Play 商店签名 SHA 256 指纹上传了一个文件,并使用 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 商店的内部测试
  • 从从下载的签名 apkApp bundle explorer
  • 我们通常从签名的 apk 上传到 Play 商店
  • 来自在我的本地机器上构建的手动签名的 apk

有谁知道我错过了什么?

4

3 回答 3

1

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

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

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

"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>
于 2021-11-29T13:19:09.480 回答
0

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

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

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

于 2021-11-30T14:04:12.517 回答
0

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

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

  1. 检查您的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
  2. 接下来,检查您的 AndroidManifest.xml,并确保在 -elementandroid: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 - 希望对您有所帮助!

于 2021-11-25T14:35:56.637 回答