HarmonyOS 鸿蒙Next中如何获取应用签名和appid等信息
HarmonyOS 鸿蒙Next中如何获取应用签名和appid等信息
我使用以下代码获取应用签名信息appid等信息,当使用调试证书签名后,调用该代码可以正常获取签名信息。
当切换为发布证书时,输出只能正常获取bundleName的值 签名信息和appid为空 为什么
bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO)
.then((bundleInfo) => {
const packageName = bundleInfo.name
console.log("numberauth:pagname:" + packageName)
const sign = bundleInfo.signatureInfo.fingerprint
console.log("numberauth:sign:" + sign)
const appIdentifier = bundleInfo.signatureInfo.appIdentifier
console.log("numberauth:appid:" + appIdentifier)
})
更多关于HarmonyOS 鸿蒙Next中如何获取应用签名和appid等信息的实战教程也可以访问 https://www.itying.com/category-93-b0.html
【解决方案】
不管是本地调试包还是上架包,签名信息都依赖于密钥库文件(p12文件),只要保证上架的app包使用的和本地调试的hap一样的p12文件,则相关的公钥指纹或者appId都不会发生变化。
- 本地调试包获取appId的方式有两种:
- 可以调用bundleManager.getBundleInfoForSelf获取自身的BundleInfo应用包信息,应用包信息中包含signatureInfo签名信息,签名信息中包含appId信息。相关代码如下:
import { bundleManager } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION |
bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_SIGNATURE_INFO;
try {
bundleManager.getBundleInfoForSelf(bundleFlags).then((bundleInfo: bundleManager.BundleInfo) => {
console.info('testTag', 'getBundleInfoForSelf successfully. appId: %{public}s', bundleInfo.signatureInfo.appId);
}).catch((err: BusinessError) => {
console.error('testTag', 'getBundleInfoForSelf failed. Cause: %{public}s', err.message);
});
} catch (err) {
let message = (err as BusinessError).message;
console.error('testTag', 'getBundleInfoForSelf failed: %{public}s', message);
}
- 安装应用后通过bm工具获取。参考命令:
hdc shell
# 需将com.example.myapplication替换为实际应用的包名
bm dump -n com.example.myapplication | grep appId
上架包获取appId的方式也有两种:
- 如前面简述,如果上架包使用的和本地调试包一样的p12文件,则可以参考本地调试包的方式获取appId。
- 发布邀请测试,从应用市场安装应用,然后通过bm工具获取,该方式也可以进一步验证同一p12编译的软件包appId是一致的。
【背景知识】
HarmonyOS应用经常需要集成一些开放能力,不管是华为开放能力还是三方能力,都需要做鉴权,鉴权的方式根据不同产品提供,一般是通过软件包的签名信息做鉴权,签名信息依赖于证书,而HarmonyOS应用打包有调试正式和发布证书区分,上架应用市场的应用必须用发布证书打包,为了保证应用上架后用户的体验,因此必须配置在架应用的签名信息。签名信息一般可通过公钥指纹和appId来承载。应用相关如:
- 华为开放能力使用公钥指纹鉴权,涉及的场景服务有华为账号,应用内支付,钱包服务等。具体的操作步骤可以参见配置公钥指纹。
- 如华为账号高德地图使用appId鉴权,具体的获取方式参考bundleInfo.signatureInfo.appId。正确的appId形式为:“包名_签名信息”。
【总结】
- 不管是本地调试包还是上架包,签名信息都依赖于密钥库文件(p12文件),只要保证上架的app包使用的和本地调试的hap一样的p12文件,则相关的公钥指纹或者appId都不会发生变化。
- 签名信息是唯一的,通过签名信息能很好的完成业务的鉴权,一般表现形式是公钥指纹或appId。部分业务通过fingerprint鉴权,但是使用的签名证书发生变化时,fingerprint也会发生变化。因此涉及到该业务要及时关注fingerprint的值是否正确。
更多关于HarmonyOS 鸿蒙Next中如何获取应用签名和appid等信息的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
【问题定位】
楼主的问题主要是从调试证书切换到发布证书时无法获取APPID
【解决方案】
根据你提供的信息,你已经使用相关代码去获取APPID,但是根据我的开发经验,如果使用了正式发布证书去在手机上是无法运行成功的。那么肯定就没办法获取到基于发布证书的APPID。
本人开发过程中使用的方法供你参考(很详细的步骤,可以耐心阅读或跟着操作):
将你的程序切换到发布证书和发布状态下打包编译,在build目录下找到.app文件上传到AGC的软件包目录,然后把自己添加到邀请测试群组,再去发布邀请测试(切记一定是邀请测试,因为只有邀请测试无需人工审核,能节约很多时间),发布之后通过应用市场中应用尝鲜找到自己的应用(也可以在发布邀请测试的时候选择生成链接通过链接去安装),确保手机与开发工具链接正常,然后在手机上去运行APP,控制台就会打印出你基于发布证书的APPID
发布证书不允许读取证书信息的
阿里云的号码认证服务需要使用包名、appid和签名信息生成密钥,如果不能获取,我怎么解决呢?
在HarmonyOS Next中,应用签名信息可通过查看应用配置文件获取。AppID位于项目的AppScope目录下的app.json5文件中,具体字段为"bundleName"。应用签名信息则存储在工程的signing目录下,通过自动生成的.p7b和.cer文件管理。这些信息在应用打包时由开发环境自动处理,无需手动获取。
在HarmonyOS Next中,使用发布证书时签名信息为空是正常现象。这是出于安全机制考虑:发布证书的私钥和签名信息不会存储在设备本地,因此应用运行时无法通过API获取完整的签名指纹和appIdentifier。
调试证书由于用于开发阶段,其签名信息会保留在设备上供调试使用。而发布证书对应正式上架场景,系统会隐藏具体签名内容以防止敏感信息泄露。
当前代码逻辑正确,但需要调整预期:在发布版本中,bundleInfo.signatureInfo下的fingerprint和appIdentifier字段将返回空值。如果业务需要验证应用身份,建议使用其他替代方案,例如通过应用特权配置或服务端校验机制来实现。


