如何使用纯Swift创建React Native原生模块,消除Objective-C代码?
完全消除React Native Swift模块的Objective-C桥接代码方案
有两种靠谱的方法可以彻底摆脱手动维护Objective-C桥接文件的麻烦:
方法一:使用React Native 0.68+的原生Swift模块支持
从RN 0.68版本开始,官方已经支持直接用Swift编写原生模块,不需要额外的Objective-C文件。只要按以下规则编写Swift代码即可:
- 让你的Swift类继承
NSObject并实现RCTBridgeModule协议 - 实现
moduleName()静态方法指定模块名称(对应JS里调用的模块名) - 用
@objc标记需要暴露给JS的方法 - 可选实现
requiresMainQueueSetup()指定模块初始化线程
示例代码:
// Calendar.swift import React @objc(Calendar) class Calendar: NSObject, RCTBridgeModule { // 必须实现:返回模块名称,和JS里调用的名字一致 static func moduleName() -> String! { return "Calendar" } // 可选:指定是否在主线程初始化模块,默认返回true static func requiresMainQueueSetup() -> Bool { return true } // 用@objc标记暴露给JS的方法 @objc func createEvent(_ title: String, location: String) { print(title, location) } }
注意事项:
- 确保你的RN版本在0.68及以上,低版本不支持这个特性
- Swift类必须属于项目的主target,不能是静态库(如果是静态库需要额外配置)
- 方法参数类型要和RN JS端兼容,比如
String对应JS的字符串,NSNumber对应JS的数字/布尔值
方法二:用代码生成工具自动生成Objective-C桥接文件
如果你的RN版本较低,或者有特殊需求不能升级,可以用代码生成工具自动生成Objective-C桥接文件,避免手动维护。推荐用Sourcery(一个Swift代码生成工具):
- 安装Sourcery:用Homebrew安装
brew install sourcery,或者通过CocoaPods集成 - 创建Sourcery模板文件(比如
BridgeModule.stencil),内容如下:
{% for type in types.classes where type.annotations.bridgeModule %} #import <React/RCTBridgeModule.h> @interface RCT_EXTERN_MODULE({{ type.name }}, NSObject) {% for method in type.methods where method.isObjc %} {% let selector = method.objcSelector %} RCT_EXTERN_METHOD({{ selector }}) {% endfor %} @end {% endfor %}
- 在你的Swift类上添加自定义注释
@bridgeModule,标记需要生成桥接的模块:
// Calendar.swift @objc(Calendar) @bridgeModule class Calendar: NSObject { @objc func createEvent(_ title: String, location: String) { print(title, location) } }
- 运行Sourcery命令生成Objective-C文件:
sourcery --sources ./path/to/swift/files --templates ./path/to/BridgeModule.stencil --output ./path/to/output/folder
你可以把这个命令加到Xcode的Build Phases里,每次编译自动生成最新的桥接文件,完全不用手动修改Objective-C代码。
内容的提问来源于stack exchange,提问作者iUrii
相关产品推荐
相关产品推荐

