【问题标题】:How to use Objective-C framework in Swift without Bridging Header?如何在没有桥接头的情况下在 Swift 中使用 Objective-C 框架?
【发布时间】:2025-11-22 10:20:06
【问题描述】:

我正在开发一个 Flutter 插件(在 Swift 中),试图包装一个 Obj-C 框架。我能够在 MyPlugin.h 文件中导入头文件,但现在如何在没有桥接头的情况下使用框架?我刚收到not found in scope

如果我要生成桥接头,我会遇到另一个错误 using bridging headers with framework targets is unsupported

这是我的 podspec 文件,我必须将 DEFINES_MODULE 设置为 NO 才能构建项目而不会遇到 Include of non-modular header inside framework module 错误

Pod::Spec.new do |s|
  s.name             = 'lisnr'
  s.version          = '1.0.0'
  s.summary          = 'Flutter plugin for LISNR'
  s.description      = <<-DESC
  Flutter plugin for LISNR.
                       DESC
  s.homepage         = 'redacted'
  s.license          = { :file => '../LICENSE' }
  s.author           = { 'redacted' => 'redacted' }
  s.source           = { :path => '.' }
  s.source_files = 'Classes/**/*'
  s.dependency 'Flutter'
  s.platform = :ios, '8.0'

  s.preserve_paths = 'radius.framework'
  s.xcconfig = { 'OTHER_LDFLAGS' => '-framework radius' }
  s.vendored_frameworks = 'radius.framework'

  # Flutter.framework does not contain a i386 slice.
  s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'NO', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }
  s.swift_version = '5.0'
  s.public_header_files = 'Classes/**/*.h'
end

其他代码几乎都是由 Flutter CLI 生成的。

【问题讨论】:

  • “在框架模块中包含非模块化标头”。此错误可能与框架中声明的标头的访问级别有关。您是否尝试过将通过框架的伞形标头公开的标头标记为公共而不是项目/私有?
  • 是的,plugin-umbrella.h 在 Build Phases Headers 上是公开的。我不知道这是否重要,但它属于 Pods 项目。此外,框架容器只有 Headers 文件夹,没有找到 Modules 文件夹

标签: objective-c swift flutter cocoapods flutter-plugin


【解决方案1】:

您需要一个模块映射。您可以手动编写并将其放入框架中,也可以使用脚本来完成。看看我是如何为 Spotify SDK 做的 here 这是一个 ObjC 框架。

你的脚本应该是这样的:

#!/bin/sh

MODULE_DIR="MY_PATH/radius.framework" # You framework's path
mkdir -p "${MODULE_DIR}"
printf "module radius {\n\
header \"Headers/radius.h\"\n\
export *\n\
}" > "${MODULE_DIR}/module.map"

【讨论】:

  • 做到了!谢谢!从来不知道我只需要一个模块图,我认为雨伞.h 会做到的。非常感谢!
  • 您好,感谢您的脚本,但如果 sdk 只提供二进制文件(radius.a 等),在这种情况下如何创建 module.map?
  • 如果是二进制框架应该没关系。标头仍应作为源代码公开且可见。现在,如果您只有一个“.a”文件,那么您将丢失头文件。这些应该在 SDK 供应商的“.a”文件中提供。
  • @LiuJQ 如果对您有帮助,请考虑为答案投票
  • @FotiDim 是的,我做到了。
最近更新 更多