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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 01:02:43