如何在Xcode 13.2.1中按配置链接不同版本的Framework?
按配置链接不同版本Framework的解决方案(Xcode 13.2.1 + SwiftUI)
步骤1:整理Framework目录结构
将Debug版和Release版Framework分别放到项目根目录下的独立文件夹,确保两个Framework的文件名完全一致,仅所在目录区分:
- Debug版:
项目根目录/Frameworks/Debug/YourFramework.framework - Release版:
项目根目录/Frameworks/Release/YourFramework.framework
步骤2:配置Framework搜索路径
打开项目的Build Settings,找到Framework Search Paths:
- 切换到Debug配置,添加路径
$(SRCROOT)/Frameworks/Debug,若Framework嵌套在子文件夹中,勾选右侧的"Recursive"; - 切换到Release配置,添加路径
$(SRCROOT)/Frameworks/Release。
步骤3:设置条件链接与嵌入
添加Framework到项目(不关联Target)
点击项目导航栏的"+" -> "Add Files to 项目名...",分别选中Debug和Release版的Framework并添加。在右侧文件检查器中,取消所有Target的Membership勾选,避免Xcode自动全局引用。配置链接器参数
在Build Settings中找到Other Linker Flags,针对Debug和Release配置都添加:-framework YourFrameworkXcode会根据当前配置的
Framework Search Paths,自动匹配对应版本的Framework完成链接。添加Run Script实现条件嵌入
由于General标签无法按配置嵌入,通过脚本手动处理:- 打开Build Phases,点击左上角"+",选择"New Run Script Phase";
- 将脚本拖动到
Embed Frameworks阶段之前; - 替换脚本内容(把
YourFramework替换为你的Framework名称):if [ "${CONFIGURATION}" = "Debug" ]; then FRAMEWORK_SOURCE="${SRCROOT}/Frameworks/Debug/YourFramework.framework" else FRAMEWORK_SOURCE="${SRCROOT}/Frameworks/Release/YourFramework.framework" fi FRAMEWORK_DEST="${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/YourFramework.framework" # 清理旧Framework rm -rf "${FRAMEWORK_DEST}" # 复制对应版本Framework到目标目录 cp -R "${FRAMEWORK_SOURCE}" "${FRAMEWORK_DEST}" # 重新签名Framework(适配代码签名要求) if [ -n "${EXPANDED_CODE_SIGN_IDENTITY}" ]; then codesign -f -s "${EXPANDED_CODE_SIGN_IDENTITY}" "${FRAMEWORK_DEST}" fi
验证
分别切换到Debug和Release配置构建项目,右键点击生成的App包 -> "显示包内容",查看Frameworks目录下的Framework版本是否符合当前配置。
内容的提问来源于stack exchange,提问作者GilroyKilroy
相关产品推荐
相关产品推荐

