You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WalletConnect V2连接数分钟后停止接收请求问题求助

WalletConnect V2 React-Native 钱包5分钟后出现"Error: Not initialized. subscription"错误

问题详情

我用React-Native开发钱包应用,已配置好WalletConnect V2,能和dApp配对并响应请求,但约5分钟后会弹出以下错误:

Error: Not initialized. subscription

之后所有请求都无法发送到钱包。我已给web3wallet添加文档提及的所有监听器,推测可能是dApp尝试发送某些内容,但应用未配置对应接收逻辑,求指导。

当前实现代码

const core = new Core({
   projectId: CONNECT_WALLET_PROJECT_ID
});

const metadata = {
    name: 'Wallet',
    description: 'A Wallet Application',
    url: "#",
    icons: []
};

const web3wallet = await Web3Wallet.init({
      core,
      metadata: metadata
});

 web3wallet.on("session_delete", (proposal) => {
      Alert.alert("session deleted");
      console.log('wc delete: ', proposal);
});  

web3wallet.on("session_request", (event) => {
      console.log('session request: ', event);
      console.log('create wallet method worked');
      // const { id, method, params } = event.request;
      setGlobalVariableValue({
         key: 'walletConnectEventData',
         value: {'event': 'session_request', 'data': event}
      });

      navigation.navigate('WalletConnectModal');
});

web3wallet.on("session_update", (proposal) => {
      console.log('session update! ', proposal)
});

web3wallet.on("push_request", (proposal) => {
      console.log("push_request")
      console.log("push_request", proposal)
});

web3wallet.on("push_message", (proposal) => {
      console.log("push_message")
      console.log("push_message: ", proposal)
});

web3wallet.on("push_delete", (proposal) => {
      console.log("push_delete");
      console.log("push_delete: ", proposal)
});
        
web3wallet.on("session_ping", (proposal) => {
      console.log("session_ping");
      console.log("session_ping: ", proposal)
});

web3wallet.on("session_event", (proposal) => {
      console.log("session_event");
      console.log("session_event: ", proposal)
});

web3wallet.on("pairing_ping", (proposal) => {
      console.log("pairing ping");
      console.log('pairing ping: ', proposal);
});

web3wallet.on("pairing_delete", (proposal) => {
      console.log("pairing delete");
      console.log("pairing delete: ", proposal)
});

web3wallet.on("auth_request", (proposal) => {
      console.log("auth_request")
      console.log("auth request: ", proposal);
});

解决思路与方案

  • 固定实例生命周期:这个错误大概率是core或web3wallet实例被意外销毁/回收导致的。React-Native中如果实例在组件内部创建,组件卸载或重渲染时会丢失。把实例提升到全局作用域(比如React Context、全局变量),确保应用生命周期内实例稳定,只初始化一次。

  • 监听配对过期:WalletConnect V2配对默认有超时机制,5分钟窗口符合过期时间范围,添加监听器处理重连:

    web3wallet.on("pairing_expire", (pairing) => {
      console.log("配对已过期:", pairing);
      // 提示用户重新配对或自动发起重连
    });
    
  • 正确响应ping请求:dApp会定期发ping保持会话活跃,仅监听不够,必须响应:

    web3wallet.on("session_ping", async (event) => {
      console.log("session_ping:", event);
      await web3wallet.respondSessionPing({
        topic: event.topic
      });
    });
    
  • 处理后台事件:React-Native后台时事件监听可能暂停,用AppState API监听前后台状态,回到前台时刷新实例订阅;同时确保Core的WebSocket连接允许后台联网。

  • 规范初始化流程:把Web3Wallet.init放在App组件的useEffect中,仅执行一次,避免异步阻塞:

    useEffect(() => {
      const initWalletConnect = async () => {
        const core = new Core({ projectId: CONNECT_WALLET_PROJECT_ID });
        const metadata = {
          name: 'Wallet',
          description: 'A Wallet Application',
          url: "#",
          icons: []
        };
        const web3wallet = await Web3Wallet.init({ core, metadata });
        // 存入全局状态
        setGlobalWeb3Wallet(web3wallet);
        // 添加所有监听器
      };
      initWalletConnect();
    }, []);
    

内容的提问来源于stack exchange,提问作者Jake Mulhern

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 15:30:21