IndySdk导入钱包报WalletAlreadyExistsError问题咨询
Indy SDK 钱包导入报错 WalletAlreadyExistsError 的原因及解决办法
问题原因
- API 使用错误:当前调用的
IndySdk.importWallet是用于从备份文件创建全新钱包的接口,若指定名称的钱包已存在,必然抛出WalletAlreadyExistsError,这和你“复用已有钱包并追加数据”的需求完全不匹配。 - 钱包名称不匹配:代码中生成随机的
imported_wallet_${uniqueIdentifier}作为钱包名,但你实际要复用的是sainopal-wallet,导致检查钱包存在性的逻辑完全失效——你检查的是随机钱包的路径,而非目标钱包sainopal-wallet的路径。 - 删除逻辑无效:现有代码仅删除自己生成的随机钱包,既没处理目标钱包
sainopal-wallet的存在情况,也违背了你要复用该钱包的需求。
解决办法
1. 替换正确的API
要向已有钱包追加备份数据,需使用IndySdk.walletImportRecords接口,而非importWallet。前者用于向已打开的钱包导入记录,后者仅用于从备份创建新钱包。
2. 修改核心代码逻辑
调整钱包名称、存在性检查及导入流程,以下是修改后的核心代码:
const handleImport = async (selectedFile: DocumentPickerResponse | null) => { try { if (!selectedFile) { console.log("No file selected"); return; } // 固定目标钱包名称为要复用的`sainopal-wallet` const walletName = "sainopal-wallet"; const localFilePath = `${RNFS.DocumentDirectoryPath}/${selectedFile.name}`; await RNFS.moveFile(selectedFile.uri, localFilePath); const walletConfig: WalletConfig = config.walletConfig || {}; const walletCredentials = { key: walletConfig.key || "" }; // 检查目标钱包是否存在 const existingWalletPath = `${RNFS.DocumentDirectoryPath}/.indy_client/wallet/${walletName}`; const walletExists = await RNFS.exists(existingWalletPath); if (walletExists) { // 钱包已存在:打开钱包并导入备份数据 const walletHandle = await IndySdk.openWallet(walletConfig, walletCredentials); // 根据备份文件格式调整importFormat,通常为json await IndySdk.walletImportRecords( walletHandle, { path: localFilePath }, { importFormat: "json" } ); await IndySdk.closeWallet(walletHandle); console.log("数据已追加到现有钱包"); Alert.alert("成功", "数据已成功追加到现有钱包!"); } else { // 钱包不存在:从备份创建新钱包 await IndySdk.importWallet(walletConfig, walletCredentials, { path: localFilePath, key: walletName, }); console.log("钱包已从备份创建"); Alert.alert("成功", "钱包已从备份成功创建!"); } } catch (error) { console.error("导入过程出错:", error); Alert.alert("错误", "钱包导入/数据追加过程中发生错误。"); } };
3. 关键注意事项
- 确保备份文件格式与
walletImportRecords要求一致(默认支持JSON格式,需与导出时的格式匹配)。 - 钱包配置
walletConfig和凭证walletCredentials必须与原钱包完全一致,否则无法打开已有钱包。 - 操作完成后必须调用
closeWallet关闭钱包句柄,避免资源泄漏。
内容的提问来源于stack exchange,提问作者JrealFun
相关产品推荐
相关产品推荐

