从Unity到iOS,如何完美自动化框架、设置和plist?

From Unity to iOS, how to perfectly automate frameworks, settings and plist?

在 Unity3D 中构建 iOS Xcode 项目时,

如何完美地自动化所有三个

解决方案必须仅包含最现代的 2019 语法和变体,因为多年来这在 Unity 中略有变化。

重要提示:

非常遗憾,您可以在这里使用System.xml,因为Apple 的plist 格式很疯狂。您可能必须使用 munge。

2019 年 ...

文件名,BuildPostProcessor.cs

将其放入文件夹 Assets/Editor/ 中。 (如果文件夹“Editor/”不存在,只需将其放置在那里即可。)

这显示了如何执行所有三个框架、设置和 plist。

// filename BuildPostProcessor.cs
// put it in a folder Assets/Editor/
using System.IO;
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;

public class BuildPostProcessor {

    [PostProcessBuild]
    public static void ChangeXcodePlist(BuildTarget buildTarget, string path) {

        if (buildTarget == BuildTarget.iOS) {

            string plistPath = path + "/Info.plist";
            PlistDocument plist = new PlistDocument();
            plist.ReadFromFile(plistPath);

            PlistElementDict rootDict = plist.root;

            Debug.Log(">> Automation, plist ... <<");

            // example of changing a value:
            // rootDict.SetString("CFBundleVersion", "6.6.6");

            // example of adding a boolean key...
            // < key > ITSAppUsesNonExemptEncryption </ key > < false />
            rootDict.SetBoolean("ITSAppUsesNonExemptEncryption", false);

            File.WriteAllText(plistPath, plist.WriteToString());
        }
    }

    [PostProcessBuildAttribute(1)]
    public static void OnPostProcessBuild(BuildTarget target, string path) {

        if (target == BuildTarget.iOS) {

            PBXProject project = new PBXProject();
            string sPath = PBXProject.GetPBXProjectPath(path);
            project.ReadFromFile(sPath);

            string tn = PBXProject.GetUnityTargetName();
            string g = project.TargetGuidByName(tn);

            ModifyFrameworksSettings(project, g);

            // modify frameworks and settings as desired
            File.WriteAllText(sPath, project.WriteToString());
        }
    }

    static void ModifyFrameworksSettings(PBXProject project, string g) {

        // add hella frameworks

        Debug.Log(">> Automation, Frameworks... <<");

        project.AddFrameworkToProject(g, "blah.framework", false);
        project.AddFrameworkToProject(g, "libz.tbd", false);

        // go insane with build settings

        Debug.Log(">> Automation, Settings... <<");

        project.AddBuildProperty(g,
            "LIBRARY_SEARCH_PATHS",
            "../blahblah/lib");

        project.AddBuildProperty(g,
            "OTHER_LDFLAGS",
            "-lsblah -lbz2");

        // note that, due to some Apple shoddyness, you usually need to turn this off
        // to allow the project to ARCHIVE correctly (ie, when sending to testflight):
        project.AddBuildProperty(g,
            "ENABLE_BITCODE",
            "false");
    }

}

那就行了。

注意 - 难题的最后一部分是跨文件复制(可能是数据文件或文本文件)。实际上,最好只使用“StreamingAssets/”方法,在 .

中有完整解释

Unity 2019.3 的固定代码:

// filename BuildPostProcessor.cs
// put it in a folder Assets/Editor/
using System.IO;
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;

public class BuildPostProcessor
{

    [PostProcessBuild]
    public static void ChangeXcodePlist(BuildTarget buildTarget, string path)
    {

        if (buildTarget == BuildTarget.iOS)
        {

            string plistPath = path + "/Info.plist";
            PlistDocument plist = new PlistDocument();
            plist.ReadFromFile(plistPath);

            PlistElementDict rootDict = plist.root;

            Debug.Log(">> Automation, plist ... <<");

            // example of changing a value:
            // rootDict.SetString("CFBundleVersion", "6.6.6");

            // example of adding a boolean key...
            // < key > ITSAppUsesNonExemptEncryption </ key > < false />
            rootDict.SetBoolean("ITSAppUsesNonExemptEncryption", false);

            File.WriteAllText(plistPath, plist.WriteToString());
        }
    }

    [PostProcessBuildAttribute(1)]
    public static void OnPostProcessBuild(BuildTarget target, string path)
    {

        if (target == BuildTarget.iOS)
        {

            PBXProject project = new PBXProject();
            string sPath = PBXProject.GetPBXProjectPath(path);
            project.ReadFromFile(sPath);

            string g = project.GetUnityFrameworkTargetGuid();

            ModifyFrameworksSettings(project, g);

            // modify frameworks and settings as desired
            File.WriteAllText(sPath, project.WriteToString());
        }
    }

    static void ModifyFrameworksSettings(PBXProject project, string g)
    {

        // add hella frameworks

        Debug.Log(">> Automation, Frameworks... <<");

        project.AddFrameworkToProject(g, "blah.framework", false);
        project.AddFrameworkToProject(g, "libz.tbd", false);

        // go insane with build settings

        Debug.Log(">> Automation, Settings... <<");

        project.AddBuildProperty(g,
            "LIBRARY_SEARCH_PATHS",
            "../blahblah/lib");

        project.AddBuildProperty(g,
            "OTHER_LDFLAGS",
            "-lsblah -lbz2");

        // note that, due to some Apple shoddyness, you usually need to turn this off
        // to allow the project to ARCHIVE correctly (ie, when sending to testflight):
        project.AddBuildProperty(g,
            "ENABLE_BITCODE",
            "false");
    }

}