从Unity到iOS,如何完美自动化框架、设置和plist? [英] From Unity to iOS, how to perfectly automate frameworks, settings and plist?

查看:84
本文介绍了从Unity到iOS,如何完美自动化框架、设置和plist?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在 Unity3D 中构建到 iOS Xcode 项目时,

in Unity3D when building to an iOS Xcode project,

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

how to perfectly automate all three of

  • 框架,
  • 设置,
  • plist 项目?

解决方案必须只有最现代的 2019 语法和变体,因为这些年来 Unity 中的这一点略有变化.

Solution must have only the most modern 2019 syntax and variations, as this has changed slightly in Unity over the years.

推荐答案

对于 2019 ...

文件名,BuildPostProcessor.cs

Filename, BuildPostProcessor.cs

把它放在文件夹 Assets/Editor/中.(如果文件夹不存在,只需将文件夹Editor/"放在那里即可.)

Put it in the folder Assets/Editor/ . (Just make the folder "Editor/" exactly there if it does not exist.)

这展示了如何完成所有三个框架、设置和 plist.

This shows how to do all three of frameworks, settings and 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/"方法,在本质量检查中有详细说明.

Note - the final part of the puzzle is copying across files (perhaps data files or text files). In reality it's best to just use the "StreamingAssets/" approach, explained fully in this QA.

这篇关于从Unity到iOS,如何完美自动化框架、设置和plist?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆