Flutter iOS Podfile多target配置CleverTap扩展报No such module错误
问题核心原因
单独给扩展target添加pod块能在Debug模式运行但归档失败、报No such module,本质是三个配置错误:
- 扩展target没有继承Flutter默认的pod构建配置,Release归档模式下找不到对应SDK的framework和头文件路径
- 扩展target单独声明
use_frameworks!和主工程的链接方式冲突,导致架构不匹配、符号重复 - 扩展target的部署版本、签名配置和主工程不一致,归档触发校验失败
正确配置方案
第一步:修改iOS端Podfile
直接调整原有Podfile配置,注意和你工程已有配置对齐:
# 保留Podfile顶部Flutter自动生成的初始化代码,不要修改 ENV['COCOAPODS_DISABLE_STATS'] = 'true' project 'Runner', { 'Debug' => :debug, 'Profile' => :release, 'Release' => :release, } # 主工程Runner配置 target 'Runner' do # 这里保持你原工程的配置,Flutter高版本默认是静态链接 use_frameworks! :linkage => :static use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) # 主工程引入CleverTap SDK pod 'CleverTap-iOS-SDK' end # 通知服务扩展配置,和Runner平级编写 target 'CTNotificationServiceExtension' do # 不要在这里单独声明use_frameworks!,和主工程保持链接方式一致 pod 'CleverTap-iOS-SDK' end # 必须修改post_install钩子,给扩展target同步Flutter构建配置——这是解决归档失败的核心 post_install do |installer| installer.pods_project.targets.each do |target| # 给所有target(包括扩展)应用Flutter要求的构建设置 flutter_additional_ios_build_settings(target) target.build_configurations.each do |config| # 统一设置部署版本,和你主工程支持的最低iOS版本保持一致,比如12.0 config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '12.0' # 关闭扩展的强制签名校验,避免归档时签名冲突 config.build_settings['EXPANDED_CODE_SIGN_IDENTITY'] = "" config.build_settings['CODE_SIGNING_REQUIRED'] = "NO" config.build_settings['CODE_SIGNING_ALLOWED'] = "NO" # 补全framework搜索路径,解决No such module报错 config.build_settings['FRAMEWORK_SEARCH_PATHS'] = [ '$(inherited)', '${PODS_CONFIGURATION_BUILD_DIR}/CleverTap-iOS-SDK' ] end end end
第二步:清理缓存重新安装依赖
在项目根目录执行如下命令:
cd ios rm -rf Pods Podfile.lock build pod deintegrate pod install --repo-update
第三步:Xcode端配置校验
- 打开Xcode,选中
CTNotificationServiceExtensiontarget,进入Build Settings搜索Other Linker Flags,确认值包含$(inherited) - 确认扩展target的iOS Deployment Target和Podfile中设置的版本完全一致,不要出现版本差
- 不需要额外配置桥接头文件:Swift编写的扩展直接在文件顶部写
import CleverTapSDK即可;OC编写的扩展直接在.m文件中引入#import <CleverTapSDK/CleverTap.h>即可
归档失败常见排查点
- 主工程和扩展引入的
CleverTap-iOS-SDK版本必须完全一致,否则会出现符号冲突导致归档失败 - 不要在扩展target块中单独声明
use_frameworks!,否则会和主工程的静态链接配置冲突,触发架构不匹配错误 - 归档前先清理Xcode缓存:按
Cmd + Shift + K清空构建目录,同时删除~/Library/Developer/Xcode/DerivedData下对应项目的缓存文件夹
内容的提问来源于stack exchange,提问作者Ehsan Anjum
相关产品推荐
相关产品推荐

