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

将React Native集成到现有iOS应用时出现NSInvalidArgumentException错误

问题描述

尝试将React Native应用集成到现有iOS应用时,抛出以下异常:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[RCTCxxBridge devSettings]: unrecognized selector sent to instance 0x14d3317c0'
*** First throw call stack:
(0x18b500f20 0x183386018 0x18b60a480 0x18b49dfb4 0x18b49d8d0 0x11232eaec 0x11232be48 0x111578b98 0x11157a7bc 0x11158ed18 0x11158f4d8 0x1e83578f8 0x1e83540cc)
libc++abi: terminating due to uncaught exception of type NSException

环境信息:

  • react版本:18.3.1
  • react-native版本:0.74.2

相关代码:

RNViewManager.swift

import Foundation
import React

class RNViewManager: NSObject {
    var bridge: RCTBridge?
    
    static let sharedInstance = RNViewManager()
    
    func createBridgeIfNeeded() -> RCTBridge {
        if bridge == nil {
            bridge = RCTBridge.init(delegate: self, launchOptions: nil)
        }
        return bridge!
    }
    
    func viewForModule(_ moduleName: String, initialProperties: [String : Any]?) -> RCTRootView {
        let viewBridge = createBridgeIfNeeded()
        let rootView: RCTRootView = RCTRootView(
            bridge: viewBridge,
            moduleName: moduleName,
            initialProperties: initialProperties)
        return rootView
    }
}

extension RNViewManager: RCTBridgeDelegate {
    func sourceURL(for bridge: RCTBridge!) -> URL! {
        #if DEBUG
            return URL(string: "http://192.168.1.25:8081/index.bundle?platform=ios")
        #else
            return Bundle.main.url(forResource: "main", withExtension: "jsbundle")
        #endif
    }
}

按钮点击触发代码

let rootView = RNViewManager.sharedInstance.viewForModule(
                   "MyReactNativeApp",
                   initialProperties: ["message_from_native": "messageFromNative"])
               
let reactNativeVC = UIViewController()
reactNativeVC.view = rootView
reactNativeVC.modalPresentationStyle = .fullScreen
present(reactNativeVC, animated: true)
解决方案

这个错误源于React Native 0.74版本中RCTCxxBridge不再暴露devSettings方法,旧的手动桥接初始化逻辑触发了未识别的方法调用。以下是三种可行的修复方案:

方案1:改用RCTRootView便捷初始化(推荐)

放弃手动管理桥接实例,让React Native内部自动处理桥接创建,避免直接操作RCTBridge:

import Foundation
import React

class RNViewManager: NSObject {
    static let sharedInstance = RNViewManager()
    
    func viewForModule(_ moduleName: String, initialProperties: [String : Any]?) -> RCTRootView {
        let rootView: RCTRootView
        
        #if DEBUG
            guard let jsCodeLocation = URL(string: "http://192.168.1.25:8081/index.bundle?platform=ios") else {
                fatalError("Invalid JS bundle URL")
            }
        #else
            guard let jsCodeLocation = Bundle.main.url(forResource: "main", withExtension: "jsbundle") else {
                fatalError("Could not find main.jsbundle in app bundle")
            }
        #endif
        
        rootView = RCTRootView(
            bundleURL: jsCodeLocation,
            moduleName: moduleName,
            initialProperties: initialProperties,
            launchOptions: nil
        )
        
        return rootView
    }
}

方案2:扩展RCTCxxBridge添加devSettings方法(临时兼容)

如果必须保留手动桥接逻辑,可以给RCTCxxBridge添加扩展,实现缺失的devSettings方法:

import React

extension RCTCxxBridge {
    @objc func devSettings() -> RCTDevSettings {
        return RCTDevSettings.shared()
    }
}

注意:该方案属于临时兼容手段,后续React Native版本更新可能失效。

方案3:检查原生依赖链接

确保React Native相关原生库已正确链接到项目:

  • 打开Xcode项目,进入Build Phases -> Link Binary With Libraries,确认libReact-RCTDevSettings.a已添加
  • 若使用CocoaPods集成,确保Podfile包含完整的React Native依赖,执行pod install重新安装依赖

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:13:25