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

导出带函数参数的Swift方法到React Native时调用闪退如何解决

问题原因

你当前的实现存在两个核心错误,不符合React Native iOS原生模块的桥接规则,因此触发类型不匹配崩溃:

  • Swift代码中直接使用普通(String) -> Void闭包作为回调参数,React Native规定原生侧接收JS回调必须使用指定的RCTResponseSenderBlock类型
  • OC桥接文件中自定义的回调函数指针写法不符合RN的桥接规范
修正方案

1. 修改RNMyClass.swift文件

需要先导入React头文件识别RN内置的回调类型,同时标记回调为逃逸闭包(因为通常回调都是异步调用):

import Foundation
import React // 必须引入React模块

@objc(RNMyClass)
class RNMyClass: NSObject {
  @objc func someMethod(_ successCallback: @escaping RCTResponseSenderBlock) -> Void {
    // 你的业务代码...
    // RCTResponseSenderBlock的入参固定为数组,按位置传参即可,比如第一个元素传错误位,第二个传成功结果
    successCallback([NSNull(), "要返回的字符串结果"])
  }
}

2. 修改RNMyClass.m桥接文件

直接使用RN内置的RCTResponseSenderBlock声明回调类型即可,不需要自定义函数指针:

#import <Foundation/Foundation.h>
#import <React/RCTBridgeModule.h>

@interface RCT_EXTERN_MODULE(RNMyClass, NSObject)

RCT_EXTERN_METHOD(someMethod:(RCTResponseSenderBlock)successCallback)

@end

推荐优化方案

如果需要在JS侧支持async/await调用,建议直接使用RN提供的Promise写法,适配性更高:

Swift侧代码:

@objc func someMethod(_ resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) -> Void {
    // 成功逻辑
    resolve("成功返回的结果")
    // 失败逻辑
    // reject("错误码", "错误描述", 自定义错误对象)
}

对应OC桥接代码:

RCT_EXTERN_METHOD(someMethod:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
崩溃根因说明

你之前使用的普通Swift闭包和自定义函数指针,和RN桥接层传入的回调类型不兼容,JS调用原生方法时底层无法完成类型转换,直接触发非法内存访问导致闪退。

内容的提问来源于stack exchange,提问作者Emre Tapcı

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 21:39:02