如何在React Native中从JavaScript向Swift 5传递NSData?
实现方案
React Native 原生桥不支持直接传递 NSData 类型参数,通常可通过以下两种稳定方案实现数据传递:
方案1:Base64 字符串传递(兼容性最高,推荐)
1. 调整原生 Swift 方法&导出配置
首先修改你的 Swift 方法,将入参改为接收 Base64 字符串,原生侧再转成 Data 类型:
@objc func write(_ serviceUUID: String, characteristicUUID: String, base64Data: String) { // 把Base64字符串转成蓝牙写入需要的Data类型 guard let data = Data(base64Encoded: base64Data) else { // 此处可添加错误回调,通知JS侧参数格式非法 return } // 后续调用你原有CoreBluetooth的写入逻辑即可 }
在你的 OC 桥接文件(一般为项目名-Bridging-Header.h)中添加导出宏,注意替换类名为你自己的 Swift 类名:
#import <React/RCTBridgeModule.h> @interface RCT_EXTERN_MODULE(BluetoothManager, NSObject) RCT_EXTERN_METHOD(write:(NSString *)serviceUUID characteristicUUID:(NSString *)characteristicUUID base64Data:(NSString *)base64Data) @end
2. JS 侧调用示例
需要先把要发送的二进制数据转成 Base64 格式,推荐使用buffer库处理:
import { NativeModules } from 'react-native'; import { Buffer } from 'buffer'; // 示例:要发送的二进制数据 const sendBytes = [0x01, 0x02, 0x03, 0x04]; const base64Str = Buffer.from(sendBytes).toString('base64'); // 调用原生蓝牙写入方法 NativeModules.BluetoothManager.write( '你的服务UUID', '你的特征UUID', base64Str );
方案2:UInt8 数组传递(适合大数据量场景,性能更高)
如果你的写入数据量较大,不想承担 Base64 编解码的开销,可以直接传递字节数组:
1. 原生侧代码
@objc func write(_ serviceUUID: String, characteristicUUID: String, byteArray: [UInt8]) { let data = Data(byteArray) // 后续蓝牙写入逻辑 }
桥接文件导出宏:
RCT_EXTERN_METHOD(write:(NSString *)serviceUUID characteristicUUID:(NSString *)characteristicUUID byteArray:(NSArray<NSNumber *> *)byteArray)
2. JS 侧调用示例
import { NativeModules } from 'react-native'; NativeModules.BluetoothManager.write( '你的服务UUID', '你的特征UUID', [0x01, 0x02, 0x03, 0x04] );
注意事项
- 你的 Swift 类和暴露给 RN 的方法都需要添加
@objc标记,否则无法被桥接层识别 - 你原有代码里的
charecteristicsUUID拼写有误,注意修正为characteristicUUID,避免方法匹配失败 - 写入操作执行前请确保已经成功发现对应服务和特征,且特征支持写入属性,否则会写入失败
- 如果需要返回写入结果,可以给方法添加 Promise 相关入参,支持 JS 侧用异步方法等待写入结果
内容的提问来源于stack exchange,提问作者RushDroid
相关产品推荐
相关产品推荐

