为什么应用程序链接和验证在 Android 上不起作用

问题描述 投票:0回答:2

无法在 Android 设备上验证我的应用程序的应用程序链接。使用

example.com
表示域,使用
com.example.app
表示应用程序 ID,而不是 real

  1. 我可以通过
    adb shell am start -W -a android.intent.action.VIEW -d https://example.com/ com.example.app
  2. 启动应用程序
  3. 使用
    adb shell am start -W -a android.intent.action.VIEW -d https://example.com/
    启动,仅使用 url,不起作用,chrome 会使用链接打开。
  4. App Info > Open by Default > Verified links
    对于这个
    com.example.app
    是空的并且呈灰色。
  5. adb shell pm get-app-links com.example.app
    不返回/打印任何内容
  6. 安装此应用程序、打开它、保持打开状态超过 20 秒或使用
    adb logcat -e "(IntentFilterIntentOp|IntentFilterIntentSvc)"
     重新验证应用程序链接时,无法使用 
    adb shell pm verify-app-links -- re-verify
  7. 找到任何日志
  8. curl https://example.com/.well-known/assetlinks.json -I
    返回以下输出:
HTTP/1.1 200 OK
Date: Thu, 01 Jun 2023 09:05:51 GMT
Content-Type: application/json
Content-Length: 337
Connection: keep-alive
Strict-Transport-Security: max-age=63072000; includeSubdomains;
X-Content-Type-Options: nosniff
Last-Modified: Thu, 01 Jun 2023 08:40:55 GMT
ETag: "151-5fd0d65109bf8"
Accept-Ranges: bytes
Cache-Control: max-age=2592000
Expires: Sat, 01 Jul 2023 09:05:51 GMT
Vary: User-Agent
X-FRAME-OPTIONS: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Content-Security-Policy: default-src 'self' 'unsafe-inline' 'unsafe-eval' data: https: *.googleadservices.com *.doubleclick.net *.google.com *.googletagmanager.com *.gstatic.com *.googleapis.com *.facebook.net; frame-ancestors 'self'
Referrer-Policy: no-referrer
Feature-Policy: microphone 'none'; geolocation 'none'
Expect-CT: max-age=0
CF-Cache-Status: DYNAMIC
Set-Cookie: __cf_bm=wkXkFwgBEGc6Ghwu.9PHLwFccvVaqOaV0zj8WyBdDf0-1685610351-0-AeqBrPqaw4CpOpFKrWxzWbN7139MTi3/194uecclD0smsP++N2TXfshkdaoVy4FtqyWm1JfEkkKH3joUoPoU2HY=; path=/; expires=Thu, 01-Jun-23 09:35:51 GMT; domain=.example.com; HttpOnly; Secure; SameSite=None
Server: cloudflare
CF-RAY: 7d064c15bf09f44a-BOM

此 assetlinks.json 的内容如下,并且 SHA256 签名与我用于构建发布 apk 的密钥的签名匹配。

[
    {
        "relation": ["delegate_permission/common.handle_all_urls"],
        "target": {
            "namespace": "android_app",
            "package_name": "com.example.com",
            "sha256_cert_fingerprints": ["SO:ME:FA:KE:SH:A2:56:5C:57:D7:22:D4:ED:A3:C4:97:23:A2:4E:B0:30:93:A5:57:39:98:B1:E0:3E:03:64:73"]
        }
    }
]
  1. 运行
     curl "https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://example.com&relation=delegate_permission/common.handle_all_urls"
    返回以下json:
{
  "statements": [
    {
      "source": {
        "web": {
          "site": "https://example.com."
        }
      },
      "relation": "delegate_permission/common.handle_all_urls",
      "target": {
        "androidApp": {
          "packageName": "com.example.app",
          "certificate": {
            "sha256Fingerprint": "SO:ME:FA:KE:SH:A2:56:5C:57:D7:22:D4:ED:A3:C4:97:23:A2:4E:B0:30:93:A5:57:39:98:B1:E0:3E:03:64:73"
          }
        }
      }
    }
  ],
  "maxAge": "589172.377669267s"
}
  1. 仅当我运行时才会得到以下输出
    adb shell pm get-app-links --user cur com.example.app
    User 0:
      Verification link handling allowed: true
      Selection state:
        Disabled:
          example.com
  1. 我还在应用程序清单中添加了一个自定义 url 方案,效果很好。

我正在 Android 13、Oneplus Nord 2 和 Android 12 设备上测试应用程序链接。我找不到任何讨论运行时没有输出的案例的文档

adb shell pm get-app-links com.example.app

android adb deep-linking android-app-links
2个回答
1
投票

我在为Android应用程序实现深度链接时遇到的常见错误。请在您的 Android 代码中验证这些

  1. 确保接收深度链接意图的 Activity 应该是

    android:exported="true"

  2. 确保您的意图过滤器已正确定义`

        <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" />
            <data android:host="example.com" />
            <data android:pathPrefix="/xyz/verify" />
        </intent-filter>`
    
  3. 对于通过内部应用程序共享、本地构建和播放控制台签名的构建版本进行的构建,SHA-256 密钥有所不同,因此建议还使用名为 Asset Links Tool

    的应用程序验证构建 apk SHA-256 密钥
  4. 还要确保您的 assetLinks.json 页面可公开访问,以 google

    为例

希望这能帮助您排除我遇到的任何可能的错误!


0
投票

我们也面临同样的问题。突然我们的深层链接不起作用了。当我们分析我们的深度链接方案时,我们发现我们的深度链接方案是从 strings.xml 引用的。即使我们设置 translatable=false,其他语言的 strings.xml 中也会提到字符串。由于这些问题,我们对我们的方案进行了硬编码,路径没有从 strings.xml 引用。希望这个答案可能有用

© www.soinside.com 2019 - 2024. All rights reserved.