由于应用没有签名,因此无法将 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 链接的主要内容,如果未能解决你的问题,请参考以下文章