JavaScript钱包应用中WalletConnect v2 SignClient重连历史会话咨询
WalletConnect v2 SignClient 自动重连历史会话实现指南
以下是基于JavaScript实现自动重连历史会话的具体步骤和逻辑:
1. 初始化SignClient(与首次创建会话时保持一致)
必须用相同的projectId和钱包metadata初始化SignClient,否则重连会失败。示例代码:
import { SignClient } from "@walletconnect/sign-client"; const signClient = await SignClient.init({ projectId: "你的ProjectID", metadata: { name: "你的钱包名称", description: "钱包描述", url: "钱包官网", icons: ["钱包图标URL"] } });
2. 从持久化层加载存储的会话数据
确保你存储的是完整的Session对象(包含topic、peerMetadata、namespaces、expiry等核心字段)。假设你的持久化层读取方法是getStoredSessions(),代码示例:
// 从本地存储/数据库读取所有历史会话 const storedSessions = await getStoredSessions();
3. 逐个重连会话
遍历存储的会话,调用signClient.reconnect()发起重连,同时处理重连失败的情况(比如会话已过期或被DApp终止):
for (const session of storedSessions) { try { // 先检查会话是否已过期 if (session.expiry * 1000 < Date.now()) { // 移除过期会话 await removeStoredSession(session.topic); continue; } // 发起重连请求 await signClient.reconnect({ topic: session.topic }); console.log(`会话 ${session.topic} 重连成功`); } catch (error) { console.error(`会话 ${session.topic} 重连失败:`, error); // 重连失败时移除无效会话 await removeStoredSession(session.topic); } }
4. 监听重连后的关键事件
重连成功后,需要监听会话相关事件以维持正常交互:
// 监听DApp的ping请求,确认连接存活 signClient.on("session_ping", ({ params }) => { console.log(`收到来自 ${params.topic} 的ping请求`); // 可选:回复ping signClient.ping({ topic: params.topic }); }); // 监听DApp发起的会话事件(比如链上交易请求) signClient.on("session_event", ({ params }) => { const { topic, event } = params; console.log(`会话 ${topic} 收到事件:`, event); // 这里处理DApp的请求,比如弹窗让用户确认交易 }); // 监听会话断开事件,及时清理存储 signClient.on("session_delete", ({ params }) => { await removeStoredSession(params.topic); console.log(`会话 ${params.topic} 已断开`); });
关键注意事项
- 会话完整性:必须存储完整的
Session对象,不能只存topic,重连需要验证peerMetadata和namespaces等信息。 - 参数一致性:初始化SignClient的projectId和metadata必须和首次创建会话时完全一致,否则会被DApp拒绝。
- 错误处理:重连失败时要及时从持久化层删除无效会话,避免下次启动重复尝试。
- 过期检查:每次重连前先检查会话过期时间,跳过已过期的会话。
内容的提问来源于stack exchange,提问作者Saman Salehi
相关产品推荐
相关产品推荐

