You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含KMM shared.framework的CocoaPod SDK无法访问Objective-C头文件求助

解决CocoaPod中Swift无法访问Objective-C头文件的问题

核心问题分析

你的PodSpec缺少对Objective-C头文件的公开声明,且未正确配置Pod内部的Swift-OC桥接逻辑,导致Swift无法识别OC代码。以下是针对性修复方案:


1. 显式声明公开的Objective-C头文件

Pod默认会将source_files中的头文件标记为私有,Swift无法直接访问。需在PodSpec中指定对外暴露的OC头:

# 仅公开需要对外提供的头文件(推荐,避免暴露内部实现)
spec.public_header_files = "DemoSDKSwift/Public/*.h", "DemoSDKSwift/Core/PublicClass.h"
# 若需公开所有OC头(不推荐),可使用:
# spec.public_header_files = "DemoSDKSwift/**/*.h"

2. 配置Pod内部的桥接文件

主项目中的桥接文件对Pod无效,需在PodSpec中通过xcconfig指定桥接路径:

  1. 在SDK目录下创建桥接文件(比如DemoSDKSwift/DemoSDK-Bridging-Header.h),导入需要Swift访问的OC头:
// DemoSDK-Bridging-Header.h
#import "YourPublicOCClass.h"
#import "AnotherOCService.h"
  1. 在PodSpec的pod_target_xcconfig中添加桥接配置:
spec.pod_target_xcconfig = {
  'KOTLIN_PROJECT_PATH' => ':shared',
  'PRODUCT_MODULE_NAME' => 'shared',
  # 指定桥接文件路径(相对于Pod根目录)
  'SWIFT_OBJC_BRIDGING_HEADER' => 'DemoSDKSwift/DemoSDK-Bridging-Header.h',
  # 开启模块支持,确保Swift识别OC模块
  'CLANG_ENABLE_MODULES' => 'YES',
  # 辅助Swift编译时识别OC模块
  'OTHER_SWIFT_FLAGS' => '-Xcc -fmodules'
}

3. 处理C相关编译配置(若OC依赖C)

如果你的OC文件引用了C++代码,需确保编译兼容:

  • 将依赖C++的OC文件后缀改为.mm;
  • 或在xcconfig中添加全局编译选项:
spec.pod_target_xcconfig.merge!({
  'CLANG_CXX_LANGUAGE_STANDARD' => 'gnu++17', # 匹配你的C++版本
  'OTHER_CFLAGS' => '-x objective-c++'
})

4. 验证模块导入

Pod安装完成后,在Swift文件中需显式导入Pod模块:

import DemoSDKSwift
// 若需访问KMM的shared框架,单独导入
import shared

修改后的完整PodSpec示例

Pod::Spec.new do |spec|
  
  spec.name         = "DemoSDKSwift"
  spec.version      = "0.0.1"
  spec.summary      = "A short description of DemoSDKSwift."
  spec.description  = "A very long description of DemoSDKSwift."
  spec.homepage     = "https://BITBUCKET_URL.COM/DemoSDKSwift"
  spec.source       = { :git => "https://BITBUCKET_URL.COM/DemoSDKSwift.git", :tag => "#{spec.version}" }
  spec.license      = "MIT"
  spec.author       = { "Author Name" => "AuthorName@streamplate.com" }
  spec.source_files = "DemoSDKSwift/**/*"
  # 新增:公开OC头文件
  spec.public_header_files = "DemoSDKSwift/**/*.h"
  
  spec.platform     = :ios, "15.0"
  spec.ios.deployment_target = '15.0'

  spec.vendored_frameworks = 'Frameworks/shared.framework'
  spec.libraries           = 'c++', 'sqlite3', 'z', 'stdc++'

  spec.pod_target_xcconfig = {
    'KOTLIN_PROJECT_PATH' => ':shared',
    'PRODUCT_MODULE_NAME' => 'shared',
    # 新增:桥接文件配置
    'SWIFT_OBJC_BRIDGING_HEADER' => 'DemoSDKSwift/DemoSDK-Bridging-Header.h',
    'CLANG_ENABLE_MODULES' => 'YES',
    'OTHER_SWIFT_FLAGS' => '-Xcc -fmodules',
    # C++编译配置
    'CLANG_CXX_LANGUAGE_STANDARD' => 'gnu++17'
  }
  
end

内容的提问来源于stack exchange,提问作者Sandeep Gangajaliya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:36:30