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

React Native中Branch.io首次订阅失败后无法重试的问题求助

解决react-native-branch首次初始化失败后无法重试的问题

问题背景

使用react-native-branch@6.7.1时,首次因网络问题初始化失败后,重试调用branch.subscribe()无法触发onOpenComplete回调,推测SDK内部状态停滞。已尝试branchUnsubscribe()和await branch.logout()重置,未解决问题。

解决方案

1. 完善SDK状态重置流程

在重试前,彻底清理订阅、重置SDK状态并清理缓存,确保所有异步操作完成后再发起新订阅:

修改subscribeWithRetry函数:

const subscribeWithRetry = async (error: any) => {
  logError(error, {
    location: 'useDeepLinking.ts',
    description: `subscribeWithRetry ${retryCount} `,
  });
  if (retryCount < MAX_RETRIES) {
    retryCount++;
    // 清理现有订阅并重置引用
    if (branchUnsubscribe) {
      console.log('subscribeWithRetry clean branchUnsubscribe?.();');
      branchUnsubscribe?.();
      branchUnsubscribe = null;
    }
    // 执行logout并等待完成
    await branch.logout();
    // 清理SDK缓存(若支持该方法)
    if (branch.clearCache) {
      await branch.clearCache();
    }
    // 延迟后发起重试
    setTimeout(() => {
      console.log('subscribeWithRetry setTimeout', branchUnsubscribe);
      branchSubscribe();
    }, RETRY_DELAY_MS);
  }
};

2. 显式触发Session初始化

在订阅前手动调用branch.initSession(),强制SDK重新发起初始化请求,避免依赖内部自动触发逻辑:

修改branchSubscribe函数为异步并添加初始化步骤:

const branchSubscribe = async () => {
  console.log('branchSubscribe ' + retryCount);
  try {
    // 显式初始化Session,确保触发新的初始化流程
    await branch.initSession();
    // 注册订阅监听
    branchUnsubscribe = branch.subscribe({
      onOpenStart: ({uri, cachedInitialEvent}) => {
        console.log(
          `branchSubscribe onOpenStart, will open ${uri} cachedInitialEvent is ${cachedInitialEvent}`,
        );
      },
      onOpenComplete: ({error, params}) => {
        console.log('branchSubscribe onOpenComplete', {
          retryCount,
          error,
          params,
        });
        if (error) {
          subscribeWithRetry(error);
        } else {
          if (params?.feature) {
            if (
              appIsReady &&
              isNavigationReady &&
              storeConfig?.loadingStoreConfig !== false &&
              !['SignUpFinished', 'Login'].includes(routeNameRef.current)
            ) {
              forwardChoiceDeepLink(params);
            } else {
              saveDeeplinkDataForLater(params);
            }
          }
        }
      },
    });
  } catch (error) {
    console.log('error', error);
    subscribeWithRetry(error);
  }
};

3. 结合网络状态变化触发重置

利用isNetworkConnected状态变化,在网络恢复时自动清理状态并重新初始化,替代盲等延迟重试:

调整useEffect内的初始化逻辑:

useEffect(() => {
  let branchUnsubscribe: any;
  let retryCount = 0;

  // ... 保留原有subscribeWithRetry和branchSubscribe函数

  const initBranch = async () => {
    // 清理之前的订阅
    if (branchUnsubscribe) {
      branchUnsubscribe();
      branchUnsubscribe = null;
    }
    // 重置重试计数
    retryCount = 0;
    // 重置SDK状态
    await branch.logout();
    if (branch.clearCache) {
      await branch.clearCache();
    }
    // 启动订阅
    branchSubscribe();
  };

  if (appIsReady && isNavigationReady && isNetworkConnected === true) {
    initBranch();
  }

  return () => branchUnsubscribe?.();
}, [appIsReady, isNavigationReady, isNetworkConnected]);

4. 升级SDK版本

react-native-branch@6.7.1可能存在初始化重试的已知bug,建议升级到最新的6.x稳定版本,查看官方是否修复了该类状态停滞问题。

原理说明

首次初始化失败后,SDK内部可能留存失败状态或未完成的请求,仅调用unsubscribe和logout无法完全重置这些状态。通过显式调用initSession强制触发新的初始化流程,配合clearCache清理本地缓存,可让SDK重新进入可初始化状态。结合网络状态变化触发重置,能更精准地在网络恢复时发起重试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:54:50