You need to enable JavaScript to run this app. 如何在React Native中从JavaScript向Swift 5传递NSData?
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 09:54:05