如何基于Scheme移除「Embed watch content」仅为指定应用发布手表端
可行解决方案汇总
完全可以通过Scheme配置实现仅给指定版本App嵌入手表端的需求,以下是两种可直接落地的方案:
方案1:Build Phase 条件化配置(无脚本,稳定性最高)
该方案依赖Xcode原生的Build Phase条件判断能力,无需额外清理操作,不会产生冗余中间产物:
- 打开Xcode选中iOS主target,进入
Build Settings页面,点击左上角+号选择「Add User-Defined Setting」,新增自定义变量EMBED_WATCH_APP - 打开需要带手表端的Scheme,进入
Edit Scheme→Build→Pre-actions,添加Run Script内容为:export EMBED_WATCH_APP=YES - 打开不需要带手表端的Scheme,同样在Pre-actions里添加Run Script内容为:
export EMBED_WATCH_APP=NO - 回到主target的
Build Phases页面,找到Embed Watch Content阶段,点击右上角的Condition输入框,填入判断条件:$EMBED_WATCH_APP == YES - 配置完成后,只有对应Scheme构建时才会执行手表内容嵌入逻辑,无手表需求的包不会包含任何手表相关的二进制、资源文件。
方案2:后置清理脚本(灵活度更高,适配旧版本Xcode)
如果你的Xcode版本不支持Build Phase条件配置,或者需要同时清理其他手表相关冗余内容,可以用编译后脚本处理:
- 首先给两个Scheme分别配置编译标记:进入需要带手表端的Scheme的Build Settings,在
Swift Compiler - Custom Flags里添加-DINCLUDE_WATCH_APP,在Other C Flags里添加-DINCLUDE_WATCH_APP;不需要带手表端的Scheme不添加该标记 - 在主target的Build Phases中新增一个Run Script阶段,拖到所有阶段的最末尾,脚本内容为:
# 检查当前编译是否需要保留手表内容 if [[ ! "${OTHER_CFLAGS}" =~ "INCLUDE_WATCH_APP" ]]; then # 清理构建产物中的手表相关目录 rm -rf "${TARGET_BUILD_DIR}/${WRAPPER_NAME}/Watch" rm -rf "${TARGET_BUILD_DIR}/${WRAPPER_NAME}/Plugins"/*Watch* fi
注意:两种方案都建议你将代码中调用手表相关API的逻辑用
#if INCLUDE_WATCH_APP/#endif包裹,避免无手表需求的包出现无用符号、链接错误等问题。
内容的提问来源于stack exchange,提问作者Amit
相关产品推荐
相关产品推荐

