导出带函数参数的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ı
相关产品推荐
相关产品推荐

