不能 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 的格式不同,更重要的是没有签名,我想不通出为什么。但是我尝试安装它,它总是给出相同的结果。我尝试安装它:
- 来自 Play 商店的内部测试
- 来自从
App bundle explorer
下载的签名 apk
- 从我们通常上传到 Play 商店的签名 apk
- 来自我本地机器上构建的手动签名的 apk
有人知道我错过了什么吗?
我可能刚刚解决了这样的问题。要检查的事项:
请注意,我仅以 imgur.com 为例,无论如何我都不会 affiliated/working。
- 检查您的 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
- 接下来,检查您的 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>
- 接下来,构建一个已签名的 .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 个意图过滤器:
- 一个只有 http/s 个数据标签和
- 另一个以我的应用名称作为方案。
当自定义主题捆绑在一个 intent 过滤器下时,它似乎不起作用。
我正在尝试设置数字资产 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 的格式不同,更重要的是没有签名,我想不通出为什么。但是我尝试安装它,它总是给出相同的结果。我尝试安装它:
- 来自 Play 商店的内部测试
- 来自从
App bundle explorer
下载的签名 apk
- 从我们通常上传到 Play 商店的签名 apk
- 来自我本地机器上构建的手动签名的 apk
有人知道我错过了什么吗?
我可能刚刚解决了这样的问题。要检查的事项:
请注意,我仅以 imgur.com 为例,无论如何我都不会 affiliated/working。
- 检查您的 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
- 接下来,检查您的 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>
- 接下来,构建一个已签名的 .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 个意图过滤器:
- 一个只有 http/s 个数据标签和
- 另一个以我的应用名称作为方案。
当自定义主题捆绑在一个 intent 过滤器下时,它似乎不起作用。