Xcode 15.1中Build Phase Run Script无法执行问题求助
问题背景
本人使用下述Shell脚本已有数年,用于在Xcode中根据不同构建环境(Debug、Release、dev.debug、dev.release)复制对应环境的GoogleService-Info.plist到目标目录。但升级到M3 Mac设备与Xcode 15.1后,该脚本完全不执行,日志中找不到任何脚本相关输出,直接导致FCM推送通知功能失效。已尝试过重建脚本、调整脚本在Build Phases中的位置到末尾,均无效果。
原脚本内容:
# Name of the resource to copy INFO_PLIST_FILE=GoogleService-Info.plist echo "PLIST FILE: ${INFO_PLIST_FILE}" # Get references to debug and release versions of the plist file DEBUG_INFO_PLIST_FILE="${PROJECT_DIR}/${TARGET_NAME}/Firebase/Debug/${INFO_PLIST_FILE}" RELEASE_INFO_PLIST_FILE="${PROJECT_DIR}/${TARGET_NAME}/Firebase/Release/${INFO_PLIST_FILE}" # Make sure the debug version exists echo "Looking for ${INFO_PLIST_FILE} in ${DEBUG_INFO_PLIST_FILE}" if [ ! -f "$DEBUG_INFO_PLIST_FILE" ] ; then echo "File GoogleService-Info.plist (debug) not found." exit 1 fi # Make sure the release version exists echo "Looking for ${INFO_PLIST_FILE} in ${RELEASE_INFO_PLIST_FILE}" if [ ! -f "$RELEASE_INFO_PLIST_FILE" ] ; then echo "File GoogleService-Info.plist (release) not found." exit 1 fi # Get a reference to the destination location for the plist file PLIST_DESTINATION="${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app" case "${CONFIGURATION}" in "Release" ) echo "BUILD CONFIG: RELEASE" cp -r "$RELEASE_INFO_PLIST_FILE" "$PLIST_DESTINATION" ;; "dev.release" ) echo "BUILD CONFIG: RELEASE DEV" cp -r "$RELEASE_INFO_PLIST_FILE" "$PLIST_DESTINATION" ;; "Debug" ) echo "BUILD CONFIG: DEBUG" cp -r "$DEBUG_INFO_PLIST_FILE" "$PLIST_DESTINATION" ;; "dev.debug" ) echo "BUILD CONFIG: DEBUG DEV" cp -r "$DEBUG_INFO_PLIST_FILE" "$PLIST_DESTINATION" ;; *) ;; esac
可能原因与解决步骤
1. 明确脚本的Shell解释器
Xcode 15.1在Apple Silicon设备上默认Shell可能切换为zsh,原脚本未指定解释器可能导致执行异常。在脚本第一行添加:
#!/bin/bash
强制Xcode使用bash执行脚本,避免Shell环境差异带来的问题。
2. 检查Build Phases脚本配置
- 进入目标的
Build Phases页面,确认对应Run Script阶段左侧复选框处于勾选状态(升级Xcode可能意外禁用)。 - 将
Shell字段设置为/bin/bash,而非默认的/bin/sh(M3 Mac上/bin/sh是zsh的软链接,可能引发兼容性问题)。
3. 调整脚本执行时机
将Run Script阶段移动到Copy Bundle Resources之前执行——如果放在末尾,复制的plist文件可能被后续步骤忽略或覆盖。正确顺序应为:
- Run Script(plist复制脚本)
- Copy Bundle Resources
4. 修复路径变量兼容性
Xcode 15.1对部分构建变量的处理有变化,修改目标路径定义为更可靠的资源目录路径:
PLIST_DESTINATION="${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}"
避免PRODUCT_NAME包含特殊字符或路径结构变更导致的错误。
5. 给脚本添加执行权限
在终端中进入脚本所在目录,执行命令:
chmod +x [你的脚本文件名]
确保Xcode有权限执行该脚本。
6. 启用详细日志排查
- 进入
Product > Scheme > Edit Scheme,选择Build阶段,勾选Show environment variables in build log和Show build timing summary。 - 重新构建后,在
Report Navigator中搜索脚本内的echo输出,确认脚本是否被调用、变量是否正确解析。
修改后的完整脚本
#!/bin/bash # Name of the resource to copy INFO_PLIST_FILE=GoogleService-Info.plist echo "PLIST FILE: ${INFO_PLIST_FILE}" # Get references to debug and release versions of the plist file DEBUG_INFO_PLIST_FILE="${PROJECT_DIR}/${TARGET_NAME}/Firebase/Debug/${INFO_PLIST_FILE}" RELEASE_INFO_PLIST_FILE="${PROJECT_DIR}/${TARGET_NAME}/Firebase/Release/${INFO_PLIST_FILE}" # Make sure the debug version exists echo "Looking for ${INFO_PLIST_FILE} in ${DEBUG_INFO_PLIST_FILE}" if [ ! -f "$DEBUG_INFO_PLIST_FILE" ] ; then echo "File GoogleService-Info.plist (debug) not found." exit 1 fi # Make sure the release version exists echo "Looking for ${INFO_PLIST_FILE} in ${RELEASE_INFO_PLIST_FILE}" if [ ! -f "$RELEASE_INFO_PLIST_FILE" ] ; then echo "File GoogleService-Info.plist (release) not found." exit 1 fi # Get a reference to the destination location for the plist file PLIST_DESTINATION="${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" case "${CONFIGURATION}" in "Release" ) echo "BUILD CONFIG: RELEASE" cp -f "$RELEASE_INFO_PLIST_FILE" "$PLIST_DESTINATION" ;; "dev.release" ) echo "BUILD CONFIG: RELEASE DEV" cp -f "$RELEASE_INFO_PLIST_FILE" "$PLIST_DESTINATION" ;; "Debug" ) echo "BUILD CONFIG: DEBUG" cp -f "$DEBUG_INFO_PLIST_FILE" "$PLIST_DESTINATION" ;; "dev.debug" ) echo "BUILD CONFIG: DEBUG DEV" cp -f "$DEBUG_INFO_PLIST_FILE" "$PLIST_DESTINATION" ;; *) echo "BUILD CONFIG: UNKNOWN - ${CONFIGURATION}" ;; esac
注:将cp -r改为cp -f,因为plist是单个文件,无需递归复制,-f可强制覆盖旧文件。
验证方法
构建完成后,右键点击Products目录下的App包,选择Show in Finder,查看包内是否存在正确的GoogleService-Info.plist,并检查内容是否匹配当前构建环境的配置。
内容的提问来源于stack exchange,提问作者hugger

