Xcode13切换Swift5.4工具链执行pod install后nanopb报错如何解决
问题描述
背景
- 克隆现有项目后删除xcworkspace和podfile.lock,随后执行pod install,该项目共引入约20个pod依赖。
- 当前Xcode版本为13.1,因部分pod语法过时无法适配Swift5.5编译,因此切换使用了Swift5.4工具链。
目前其余报错均已消除,仅nanopb出现报错,报错示例如下:
- 语义问题:函数未返回NSString(NSBundle.h中)
- 解析问题:多个.h文件中提示无法找到Foundation模块
(截图)部分报错内容
Podfile内容
platform :ios, '13.0' use_frameworks! def projectname_pods # Pods for projectname pod 'RxSwift' pod 'RxCocoa' pod 'Action' pod 'RxAlamofire' pod 'Alamofire' pod 'SwiftyJSON' pod 'NVActivityIndicatorView/Extended' pod 'SDWebImage' pod 'Firebase/Core' pod 'Firebase/Auth' pod 'Firebase/Analytics' pod 'Firebase/Storage' pod 'Firebase/DynamicLinks' pod 'Firebase/Messaging' pod 'ActiveLabel' pod 'FBSDKShareKit' pod 'SwiftLint' pod 'DKImagePickerController' pod 'SimpleImageViewer' pod 'YouTubePlayer' pod 'DropDown' pod 'SwiftPhotoGallery' pod 'SCLAlertView' pod 'Firebase/Crashlytics' pod 'FBSDKCoreKit/Swift' pod "RxGesture" pod 'ReadMoreTextView' pod 'Socket.IO-Client-Swift' pod 'MessageKit' end target 'projectname' do projectname_pods end target 'projectname-Dev' do projectname_pods target 'projectname' do inherit! :search_paths # Pods for testing end end
已尝试的解决方案
- 清理derived data
- 删除podfile.lock、xcworkspace、Pods文件夹后重新执行pod install
解决方案
方案1:锁定nanopb兼容版本
nanopb是Firebase依赖的底层序列化库,Xcode13搭配Swift5.4工具链时,高版本nanopb会出现头文件搜索异常问题。直接在Podfile的projectname_pods依赖块中添加固定版本的nanopb声明:
pod 'nanopb', '2.30910.0'
添加后重新执行pod install即可。
方案2:添加post_install钩子自动修正编译配置
如果锁定版本后仍有报错,可在Podfile末尾添加如下脚本,自动修正nanopb的编译参数,同时统一所有Pod的Swift版本为5.4:
post_install do |installer| installer.pods_project.targets.each do |target| # 修复nanopb的头文件搜索和模块导入问题 if target.name == 'nanopb' target.build_configurations.each do |config| config.build_settings['CLANG_ENABLE_MODULES'] = 'YES' config.build_settings['CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES'] = 'YES' config.build_settings['HEADER_SEARCH_PATHS'] ||= ['$(inherited)'] config.build_settings['HEADER_SEARCH_PATHS'] << '$(SDKROOT)/System/Library/Frameworks/Foundation.framework/Headers' end end # 统一所有Pod的Swift版本为5.4,避免版本不兼容 target.build_configurations.each do |config| if config.build_settings['SWIFT_VERSION'] config.build_settings['SWIFT_VERSION'] = '5.4' end end end end
添加后重新执行pod install,清理Derived Data后再编译即可。
方案3:锁定Firebase兼容版本
如果上述方案都无效,说明当前拉取的最新版Firebase已不兼容Xcode13+Swift5.4的组合,可指定Firebase的版本为8.10.0(官方最后一个兼容Xcode13的稳定版本):
pod 'Firebase/Core', '8.10.0' pod 'Firebase/Auth', '8.10.0' pod 'Firebase/Analytics', '8.10.0' pod 'Firebase/Storage', '8.10.0' pod 'Firebase/DynamicLinks', '8.10.0' pod 'Firebase/Messaging', '8.10.0' pod 'Firebase/Crashlytics', '8.10.0'
修改后删除Podfile.lock、Pods文件夹和xcworkspace,重新执行pod install即可。
内容的提问来源于stack exchange,提问作者ilikeburntflan
相关产品推荐
相关产品推荐

