M1设备Swift Package引入RealmSwift遇x86_64架构匹配问题求助
问题解决方案
一、RealmSwift作为SP引入的架构不匹配问题
核心原因
你全局排除了arm64模拟器架构,但RealmSwift的SP包默认适配arm64/x86_64双架构,导致项目构建x86_64目标时,找不到对应架构的RealmSwift模块。
解决方法
拆分架构排除范围
不要在项目级别全局设置Excluded Architectures,仅给那个仅支持x86_64的Kotlin多平台框架的Target单独设置排除arm64。主项目和RealmSwift的Target保持默认架构设置,这样主项目可通过Rosetta运行x86_64的Kotlin框架,同时正常使用arm64的RealmSwift。强制RealmSwift构建x86_64版本
如果必须全局排除arm64,可在Xcode中选中RealmSwift的Swift Package,进入它的Build Settings:- 找到
Valid Architectures,添加x86_64; - 找到
Excluded Architectures,清空或确保不排除x86_64; - 清理Derived Data(执行命令
rm -rf ~/Library/Developer/Xcode/DerivedData),重启Xcode后重新构建。
- 找到
本地引入RealmSwift源码作为SP
下载RealmSwift对应版本的源码,本地添加为Swift Package,手动调整它的架构编译参数,确保生成x86_64架构的模块。
二、创建依赖现有Pod框架的自定义Swift Package
方案1:将Pod框架打包为XCFramework后引入
这是最规范的方式,步骤如下:
- 找到对应Pod的
.podspec文件,执行命令打包为XCFramework:pod package YourPodName.podspec --force --library --xcframework - 在自定义SP的
Package.swift中,添加binary target引入该XCFramework:let package = Package( name: "YourCustomSP", products: [ .library(name: "YourCustomSP", targets: ["YourCustomSP"]), ], targets: [ .target( name: "YourCustomSP", dependencies: [ .target(name: "YourPodFramework") ] ), .binaryTarget( name: "YourPodFramework", path: "./path/to/YourPodFramework.xcframework" ) ] )
方案2:直接链接Pod的静态/动态库
如果不想打包XCFramework,可直接处理Pod的产物:
- 静态库(.a/.framework):
在Package.swift的target中添加链接设置和头文件路径:.target( name: "YourCustomSP", linkerSettings: [ .linkedFramework("YourPodFramework"), .unsafeFlags(["-L", "./path/to/pod/framework/binary"]), .unsafeFlags(["-I", "./path/to/pod/framework/headers"]) ] ) - 动态库(.framework):
把动态库加入SP的resources,设置复制规则,同时在linkerSettings中链接:.target( name: "YourCustomSP", resources: [ .copy("./path/to/YourPodFramework.framework") ], linkerSettings: [ .linkedFramework("YourPodFramework") ] )
内容的提问来源于stack exchange,提问作者Hawkeye
相关产品推荐
相关产品推荐

