React Native添加Swift文件后Turbo Module无法构建Xcode项目
React Native Turbo Module 添加Swift文件后Xcode构建失败
我在React Native中创建基础Turbo Module,未添加Swift文件时项目可正常运行,但**仅向模块中添加Swift文件(未实际使用)**后,Xcode项目便无法构建。
Podfile 内容
# Resolve react_native_pods.rb with node to allow for hoisting require Pod::Executable.execute_command('node', ['-p', 'require.resolve( "react-native/scripts/react_native_pods.rb", {paths: [process.argv[1]]}, )', __dir__]).strip platform :ios, '13.4' prepare_react_native_project! linkage = ENV['USE_FRAMEWORKS'] if linkage != nil Pod::UI.puts "Configuring Pod with #{linkage}ally linked Frameworks".green use_frameworks! :linkage => linkage.to_sym end target 'BasicApp' do config = use_native_modules! use_react_native!( :path => config[:reactNativePath], # An absolute path to your application root. :app_path => "#{Pod::Config.instance.installation_root}/.." ) target 'BasicAppTests' do inherit! :complete # Pods for testing end post_install do |installer| # https://github.com/facebook/react-native/blob/main/packages/react-native/scripts/react_native_pods.rb#L197-L202 react_native_post_install( installer, config[:reactNativePath], :mac_catalyst_enabled => false, # :ccache_enabled => true ) end end
安装Pods使用的命令
bundle install && RCT_NEW_ARCH_ENABLED=1 bundle exec "USE_FRAMEWORKS=dynamic pod install"
Xcode报错信息
Xcode构建时出现编译错误:无法找到生成的Swift桥接头文件,Swift代码未被正确集成到Turbo Module的Objective-C++编译目标中
我的计划是通过Swift实现功能,再在Objective-C++代码中调用Swift函数,最终导出到React Native。
解决方案
1. 给Turbo Module的Pod配置添加Swift支持
在你的Turbo Module对应的xxx.podspec文件中,补充Swift相关配置,让Pod能识别并编译Swift文件:
s.swift_version = '5.0' # 包含所有源文件(包括Swift) s.source_files = "ios/**/*.{h,m,swift}" # 若Swift文件集中在单独目录,可单独指定 # s.source_files = "ios/Swift/**/*.swift", "ios/**/*.{h,m}"
2. 配置Xcode桥接头文件
如果模块未自动生成桥接头,需要手动创建并配置:
- 在模块iOS目录下创建
[你的模块名]-Bridging-Header.h文件 - 选中Turbo Module的Xcode目标,进入Build Settings,搜索
Objective-C Bridging Header,设置路径为$(SRCROOT)/ios/[你的模块名]-Bridging-Header.h - 桥接头可暂时为空,后续需要暴露Swift类时再添加对应声明
3. 调整Podfile的动态框架适配
由于使用了USE_FRAMEWORKS=dynamic,需确保本地Turbo Module的Pod被正确识别为动态框架。如果是本地开发的模块,在Podfile中明确指定路径:
# 替换为你的模块实际路径 pod 'YourTurboModule', :path => '../path/to/your/module'
4. 清理并重新构建
- 删除
ios/Pods目录和Podfile.lock - 重新执行安装命令:
bundle install && RCT_NEW_ARCH_ENABLED=1 USE_FRAMEWORKS=dynamic bundle exec pod install - 关闭Xcode,清除Derived Data(路径:
Xcode -> Preferences -> Locations -> Derived Data,点击箭头打开目录后删除) - 重新打开Xcode并尝试构建
5. 确保Swift代码可被Objective-C++调用
Swift类和方法需要添加@objc和public修饰,才能在Objective-C++中访问:
@objc public class SwiftUtils: NSObject { @objc public static func getDemoString() -> String { return "来自Swift的内容" } }
之后在Objective-C++文件中导入自动生成的Swift头文件:
#import "YourTurboModule-Swift.h"
内容的提问来源于stack exchange,提问作者Gopendra Kumar
相关产品推荐
相关产品推荐

