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脚本里加这段逻辑就行:
- 先定位到Unity-iPhone的主目标,然后把它的所有构建阶段转成可编辑的列表
- 分别找出
Embed App Extensions阶段和Crashlytics的Run Script阶段 - 调整两者的顺序,把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
相关产品推荐
相关产品推荐

