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

Unity 2022.3 LTS中PostProcessBuild阶段调整Embed App Extensions构建顺序以解决Xcode循环依赖问题

Unity 2022.3 LTS中PostProcessBuild阶段调整Embed App Extensions构建顺序以解决Xcode循环依赖问题

我之前刚碰到过完全一样的坑!Unity自动添加的Embed App Extensions构建阶段默认会被放在目标的最底部,刚好撞上Crashlytics的Run Script阶段,直接触发Xcode的循环依赖报错。而且确实,PBXProject没有直接提供重排现有构建阶段的API,但我们可以通过操作目标的构建阶段列表来实现,不用去碰原始的pbxproj文件,相对干净很多。

这里给你一个可行的实现思路,直接在PostProcessBuild脚本里加这段逻辑就行:

  1. 先定位到Unity-iPhone的主目标,然后把它的所有构建阶段转成可编辑的列表
  2. 分别找出Embed App Extensions阶段和Crashlytics的Run Script阶段
  3. 调整两者的顺序,把Embed阶段插到Crashlytics脚本的前面

具体的C#代码示例如下:

using System.Linq;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using UnityEngine;

public class PostBuildHandler
{
    [PostProcessBuild(999)] // 设为较高优先级,确保在其他构建阶段添加完成后执行
    public static void OnPostProcessBuild(BuildTarget target, string pathToBuiltProject)
    {
        if (target != BuildTarget.iOS) return;

        var projPath = PBXProject.GetPBXProjectPath(pathToBuiltProject);
        var proj = new PBXProject();
        proj.ReadFromString(System.IO.File.ReadAllText(projPath));

        // 获取Unity-iPhone主目标
        string mainTargetGuid = proj.GetUnityMainTargetGuid();
        var mainTarget = proj.Targets.First(t => t.Guid == mainTargetGuid);
        var buildPhases = mainTarget.BuildPhases.ToList();

        // 查找Embed App Extensions构建阶段
        var embedPhase = buildPhases.FirstOrDefault(p => p is PBXEmbedAppExtensionsBuildPhase);
        // 查找Crashlytics的Run Script阶段(根据脚本内容识别,可根据实际情况调整)
        var crashlyticsPhase = buildPhases.FirstOrDefault(p => 
            p is PBXShellScriptBuildPhase scriptPhase && 
            scriptPhase.Script.Contains("Crashlytics"));

        if (embedPhase != null && crashlyticsPhase != null)
        {
            // 移除Embed阶段,再插入到Crashlytics阶段的前面
            buildPhases.Remove(embedPhase);
            int crashlyticsIndex = buildPhases.IndexOf(crashlyticsPhase);
            buildPhases.Insert(crashlyticsIndex, embedPhase);

            // 更新目标的构建阶段列表
            mainTarget.BuildPhases = buildPhases.ToArray();

            // 保存修改
            System.IO.File.WriteAllText(projPath, proj.WriteToString());
        }
    }
}

一些需要注意的细节:

  • 把PostProcessBuild的优先级设为999,确保这段逻辑在Crashlytics脚本阶段被添加之后执行,不然会找不到目标阶段
  • 如果你的Crashlytics脚本里没有"Crashlytics"关键字,可以换成脚本里的其他独特标识,比如firebase-crashlytics之类的
  • 这种方法是利用PBXTarget的BuildPhases属性可赋值的特性,属于官方API支持的操作,比直接编辑pbxproj文件安全得多,也更易维护

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 12:19:35