如何基于Xcode Scheme为Flutter环境链接不同的.xcframework?
基于Xcode Scheme为Flutter Flavors链接不同XCFramework
因为两个XCFramework类名完全一致,同时链接必然触发符号冲突,核心思路是让每个Scheme在构建时仅加载对应环境的框架,具体操作如下:
1. 存放框架到指定目录
在iOS项目根目录(ios/)下新建Frameworks文件夹,分别将SDKStaging.xcframework和SDKProduction.xcframework放入其中,不要直接拖入Xcode项目导航栏(避免自动全局链接)。
2. 为Scheme单独配置框架搜索路径
- 打开Xcode项目,选中
Runnertarget,切换到Build Settings标签 - 搜索
Framework Search Paths,点击右侧+添加两个路径:$(SRCROOT)/Frameworks/SDKStaging.xcframework$(SRCROOT)/Frameworks/SDKProduction.xcframework
- 关键操作:展开每个路径的设置范围(点击路径旁的
All下拉菜单),将staging路径的范围设为stagingScheme,production路径设为productionScheme。这样每个Scheme构建时只会读取自己对应的框架路径。
3. 添加构建脚本控制框架链接
通过脚本在构建前复制对应环境的框架,保证链接阶段仅存在一个框架:
- 切换到
Build Phases标签,点击+选择New Run Script Phase - 将脚本内容替换为:
# 清除换行符避免Scheme名称异常 SCHEME_NAME=$(echo "$SCHEME_NAME" | tr -d '\r') # 定义框架路径 STAGING_FRAMEWORK="${SRCROOT}/Frameworks/SDKStaging.xcframework" PRODUCTION_FRAMEWORK="${SRCROOT}/Frameworks/SDKProduction.xcframework" # 清理之前的残留框架 rm -rf "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDK*.xcframework" # 根据Scheme复制对应框架到构建目录 if [ "$SCHEME_NAME" = "staging" ]; then cp -R "$STAGING_FRAMEWORK" "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/" elif [ "$SCHEME_NAME" = "production" ]; then cp -R "$PRODUCTION_FRAMEWORK" "${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/" fi
- 将这个脚本拖到
Link Binary With Libraries阶段之前,确保先完成框架复制再执行链接。
4. 配置条件导入(可选)
在Flutter原生桥接文件(如AppDelegate.swift或自定义Channel文件)中,用编译标记控制SDK导入:
#if STAGING import SDKStaging #elseif PRODUCTION import SDKProduction #endif
- 给对应Scheme添加编译标记:回到
Build Settings,搜索Other Swift Flags,为staging Scheme添加-D STAGING,production Scheme添加-D PRODUCTION,同样要设置对应的Scheme范围。
5. 验证配置
- 切换到
stagingScheme执行构建,检查Products目录下的.app包内,仅存在SDKStaging.xcframework - 切换到
productionScheme重复构建,确认包内为SDKProduction.xcframework
内容的提问来源于stack exchange,提问作者Dread Boy
相关产品推荐
相关产品推荐

