Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

in Unity3D when building to an iOS Xcode project,

how to perfectly automate all three of

  • frameworks,
  • settings,
  • plist items?

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

like image 202
Fattie Avatar asked Jan 25 '19 17:01

Fattie


People also ask

Can I use Xcode with Unity?

Build the Xcode projectDepending on your versions of Unity and Xcode, you may be able to select Build and Run instead. In this instance, Unity will automatically open the built project in Xcode and run it on a connected device, if possible.

How do you make a Unity game for iOS?

Open Unity, go to File > Build Settings, and select Switch Platform on the bottom of the window. Unity will start making the switch, once it is finished, the Unity icon will appear next to the iOS icon and the Build option will be activated.


1 Answers

Fixed code for 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");
    }

}
like image 57
Makalele Avatar answered Oct 06 '22 05:10

Makalele