如何解决React Native中RCTLinkingManager监听移除数量超出添加量报错
解决方案
- 修正
RCTLinkingManager头文件引入位置
你当前代码将#import <React/RCTLinkingManager.h>写在了#ifdef FB_SONARKIT_ENABLED条件编译块内部,当编译环境不满足Flipper开启条件时,该头文件不会被导入,会导致Linking监听逻辑异常。请将该导入语句移到条件编译块外部,和其他RCT相关导入放在同一层级,修改后示例如下:
#import <React/RCTBridge.h> #import <React/RCTBundleURLProvider.h> #import <React/RCTRootView.h> // 移动到此处 #import <React/RCTLinkingManager.h> #ifdef FB_SONARKIT_ENABLED #import <FlipperKit/FlipperClient.h> // 剩余Flipper相关导入保持不变 ...
- 检查JS侧Linking监听器的注册/移除逻辑
多数情况下该报错由JS侧监听器重复移除、或者移除时回调引用不匹配导致。请检查所有用到Linking.addEventListener的代码,确保销毁监听器的逻辑正确,推荐写法如下:
import { Linking, useEffect } from 'react-native' // 组件内使用示例 useEffect(() => { const handleUrl = (event) => { // 处理深链接逻辑 console.log('深链接地址:', event.url) } // 注册监听器 const urlListener = Linking.addEventListener('url', handleUrl) // 销毁时正确移除 return () => urlListener.remove() }, [])
不要直接调用Linking.removeEventListener,该方法在新版RN中已经废弃,容易出现引用不匹配的问题。
排查重复注册逻辑
如果你同时使用了React Navigation等自带深链接处理能力的第三方库,不需要额外在AppDelegate中手动添加openURL和continueUserActivity两个方法,可以先将这两个方法注释后重新运行,排查是否是重复注册导致的冲突。清理缓存重新构建
如果上述修改后仍报错,执行以下操作清理缓存后重新运行:- 删除项目根目录的
node_modules文件夹,重新执行包安装命令(npm install或yarn install) - 进入ios目录,删除
Podfile.lock和Pods文件夹,重新执行pod install - 删除iOS模拟器中已安装的当前App,重新执行
react-native run-ios启动项目
- 删除项目根目录的
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

