Unity取消勾选Development Build时自动禁用iOS的Settings.bundle
解决Unity构建阶段移除iOS开发版偏好设置的问题
你遇到的核心问题是DEVELOPMENT_BUILD宏仅在运行时生效,编辑器的构建后处理代码无法读取这个宏。要在构建阶段判断是否为开发构建,你可以通过BuildReport或构建前记录配置的方式实现,具体方案如下:
方法一:使用BuildReport参数(Unity 2018.3及以上版本)
Unity 2018.3之后,PostProcessBuild支持接收BuildReport参数,其中直接包含了构建是否为开发版的标记:
using UnityEngine; using UnityEditor; using UnityEditor.Callbacks; using UnityEditor.iOS.Xcode; using System.IO; public class iOSBuildPostprocessor { [PostProcessBuild(1)] public static void ChangeXcodePlist(BuildTarget buildTarget, string pathToBuiltProject, BuildReport report) { // 判断当前是否为非开发构建 if (!report.summary.options.HasFlag(BuildOptions.Development) && buildTarget == BuildTarget.iOS) { var plistPath = Path.Combine(pathToBuiltProject, "Frameworks/Plugins/iOS/Settings.bundle/Root.plist"); if (!File.Exists(plistPath)) { Debug.LogWarning($"未找到Settings.plist,路径:{plistPath}"); return; } PlistDocument settingsPlist = new PlistDocument(); settingsPlist.ReadFromString(File.ReadAllText(plistPath)); var rootDict = settingsPlist.root; // 清空PreferenceSpecifiers数组(若只需移除特定开发项,可替换为遍历删除逻辑) rootDict.SetArray("PreferenceSpecifiers"); File.WriteAllText(plistPath, settingsPlist.WriteToString()); Debug.Log("已从Settings.bundle中移除开发版专属偏好设置"); } } }
方法二:兼容旧版本Unity(构建前记录配置)
如果你的Unity版本低于2018.3,可以通过监听构建开始事件,提前记录当前构建是否为开发版:
using UnityEngine; using UnityEditor; using UnityEditor.Callbacks; using UnityEditor.iOS.Xcode; using System.IO; public class iOSBuildPostprocessor { private static bool _isDevelopmentBuild; [InitializeOnLoadMethod] static void Initialize() { // 注册构建处理回调,记录构建类型 BuildPlayerWindow.RegisterBuildPlayerHandler(BuildHandler); } static void BuildHandler(BuildPlayerOptions options) { _isDevelopmentBuild = options.development; // 执行默认构建流程 BuildPlayerWindow.DefaultBuildMethods.BuildPlayer(options); } [PostProcessBuild(1)] public static void ChangeXcodePlist(BuildTarget buildTarget, string pathToBuiltProject) { if (!_isDevelopmentBuild && buildTarget == BuildTarget.iOS) { var plistPath = Path.Combine(pathToBuiltProject, "Frameworks/Plugins/iOS/Settings.bundle/Root.plist"); if (!File.Exists(plistPath)) { Debug.LogWarning($"未找到Settings.plist,路径:{plistPath}"); return; } PlistDocument settingsPlist = new PlistDocument(); settingsPlist.ReadFromString(File.ReadAllText(plistPath)); var rootDict = settingsPlist.root; var specifiersArray = rootDict.GetArray("PreferenceSpecifiers"); // 遍历数组,移除标记为开发专属的项(需给开发项添加自定义key,比如"DevelopmentOnly") for (int i = specifiersArray.values.Count - 1; i >= 0; i--) { var itemDict = specifiersArray.values[i] as PlistElementDict; if (itemDict != null && itemDict.ContainsKey("DevelopmentOnly")) { specifiersArray.values.RemoveAt(i); } } File.WriteAllText(plistPath, settingsPlist.WriteToString()); Debug.Log("已从Settings.bundle中移除开发版专属偏好设置"); } } }
额外提示
- 用
Path.Combine替代字符串拼接路径,避免跨平台路径分隔符问题。 - 操作Plist前先检查文件是否存在,防止构建过程中报错。
- 若不需要清空所有偏好,建议给开发专属项添加自定义标识key,通过遍历删除的方式精准移除,保留正式版需要的配置。
内容的提问来源于stack exchange,提问作者Daniele
相关产品推荐
相关产品推荐

