xcframework集成SwiftProtobuf依赖启动崩溃解决方案咨询
崩溃根因
dyld找不到SwiftProtobuf相关符号的核心原因:默认CocoaPods集成的SwiftProtobuf为动态链接库,编译ParentSDK时仅做了符号引用、没有把SwiftProtobuf的实际实现打包进xcFramework产物;宿主工程集成时要么没有引入对应版本的SwiftProtobuf,要么引入的版本和编译ParentSDK时使用的版本不匹配,启动时dyld无法在加载的SwiftProtobuf动态库中找到对应符号就会触发崩溃。
SwiftProtobuf本地嵌入配置步骤
- 调整Podfile配置
打开ParentSDK工程的Podfile,在ParentSDK对应的target块中,将依赖的链接方式改为静态,同时锁定SwiftProtobuf版本,避免版本漂移导致符号不匹配,配置参考:
target 'ParentSDK' do use_frameworks! :linkage => :static # 替换为你之前编译使用的固定SwiftProtobuf版本 pod 'SwiftProtobuf', '1.26.0' # 其他原有私有依赖保持不变 end
配置完成后在工程根目录执行pod deintegrate && pod install,清理旧的依赖配置后重新安装依赖。
调整ParentSDK编译配置
打开ParentSDK target的Build Settings页,修改以下配置项:Other Linker Flags:添加-ObjC、-all_load两个参数,保证链接时能把SwiftProtobuf的所有类、协议、分类符号完整加载Mach-O Type:如果你的ParentSDK是静态库,值设为staticlib;如果是动态框架,额外将Dead Code Stripping设为NO、Strip Style设为Non-Global Symbols,避免链接阶段裁掉SwiftProtobuf的相关符号Build Libraries for Distribution:设为YES,保证打出的xcFramework兼容不同Xcode版本Skip Install:设为NO,避免打包时丢失依赖符号
打包并校验xcFramework
分别编译真机、模拟器架构下的ParentSDK产物,通过xcodebuild -create-xcframework命令合成最终xcFramework后,做符号校验:- 终端cd到xcFramework内对应架构的.framework目录
- 执行命令
nm -gU ParentSDK | grep "_$s13SwiftProtobuf19_ProtoNameProvidingP17_protobuf_nameMapAA01_dH0VvgZTq" - 如果命令输出对应符号条目,说明SwiftProtobuf已经被正确嵌入到ParentSDK产物中
宿主工程集成配置
用新生成的xcFramework替换旧的ParentSDK产物,注意:- 不需要在宿主工程中额外单独引入SwiftProtobuf依赖
- 清理宿主工程
Framework Search Paths中残留的旧版SwiftProtobuf搜索路径,避免dyld加载错误版本的库 - 将ParentSDK添加到宿主工程的
Embed Frameworks列表,选择Embed & Sign选项
重新编译运行宿主工程即可解决该dyld启动崩溃问题。
内容的提问来源于stack exchange,提问作者S Surya
相关产品推荐
相关产品推荐

