如何获取SPM包路径以配合-force_load替代-ObjC链接器标志?
获取SPM引入的Objective-C SDK完整路径用于-force_load
方法1:用Xcode内置SPM变量直接拼接
Xcode自带几个专门针对Swift Package Manager的环境变量,能快速拼出XCFramework的完整路径:
$(SOURCE_PACKAGES_DIR):对应DerivedData/<项目名>/SourcePackages目录,刚好是你路径里checkouts的父目录$(SWIFT_PACKAGE_NAME):自动获取当前引入的SPM包名称(如果客户直接引入你的SDK包,这个就是你的包名)
结合你的XCFramework路径结构,直接在Other Linker Flags里写:
-force_load $(SOURCE_PACKAGES_DIR)/checkouts/$(SWIFT_PACKAGE_NAME)/Sources/你的SDK名称.xcframework/ios-arm64_armv7/你的SDK名称.framework/你的SDK名称
注意:把
你的SDK名称换成实际文件名,同时根据目标架构调整ios-arm64_armv7——比如iOS模拟器用ios-x86_64-simulator,通用架构包用ios-universal,具体看你XCFramework的打包结构。
方法2:用构建脚本动态获取路径(适配多架构)
如果内置变量不够灵活,或者客户的项目架构复杂,可以加个构建脚本自动找路径:
- 打开客户的Xcode项目,进入Build Phases,点+号添加Run Script阶段,把它拖到Link Binary With Libraries前面
- 粘贴以下脚本(记得替换占位符):
# 替换成你的SPM包名和XCFramework文件名 SDK_PACKAGE="你的SPM包名" SDK_XCFW="你的SDK.xcframework" # 查找XCFramework的根目录 SDK_ROOT=$(find "$SOURCE_PACKAGES_DIR/checkouts/$SDK_PACKAGE" -name "$SDK_XCFW" -type d) # 根据当前编译架构选择对应的framework文件 case "${ARCHS}" in arm64) FRAMEWORK_FILE="$SDK_ROOT/ios-arm64_armv7/${SDK_XCFW%.xcframework}.framework/${SDK_XCFW%.xcframework}" ;; x86_64) FRAMEWORK_FILE="$SDK_ROOT/ios-x86_64-simulator/${SDK_XCFW%.xcframework}.framework/${SDK_XCFW%.xcframework}" ;; *) FRAMEWORK_FILE="$SDK_ROOT/ios-universal/${SDK_XCFW%.xcframework}.framework/${SDK_XCFW%.xcframework}" ;; esac # 把路径写入输出文件,供后续构建阶段使用 echo "FORCE_LOAD_PATH=$FRAMEWORK_FILE" >> "$SCRIPT_OUTPUT_FILE_0"
- 在Run Script的Output Files里添加
$(BUILD_DIR)/force_load_path.xcconfig - 到项目的Build Settings,添加一个User-Defined Setting,命名为
FORCE_LOAD_PATH,值填$(inherited) - 最后在Other Linker Flags里加:
-force_load $(FORCE_LOAD_PATH)
方法3:从SDK端解决(最省心,推荐)
作为SDK开发团队,你可以直接在Package.swift里配置链接器标志,让客户无需手动操作:
修改你的Package.swift中target的配置,添加linkerSettings:
.target( name: "你的SDK名称", dependencies: [], linkerSettings: [ .unsafeFlags(["-ObjC"]) ] )
这样客户通过SPM引入时,Xcode会自动把-ObjC加到链接器标志里,彻底绕开客户手动设置路径的问题。
内容的提问来源于stack exchange,提问作者derekahc
相关产品推荐
相关产品推荐

