You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xcode 15.1中Build Phase Run Script无法执行问题求助

Xcode 15.1 + M3 Mac 环境下构建脚本不执行导致FCM推送失效

问题背景

本人使用下述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文件可能被后续步骤忽略或覆盖。正确顺序应为:

  1. Run Script(plist复制脚本)
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 02:24:58