본문 바로가기
문제해결

PostProcessBuild - iOS 빌드 시 xCode에서 하고 있는 설정들을 자동화하자

by samosa 2024. 7. 24.

원래 이렇게 수동으로 해줬었다.

Info.plist 파일에 항목 추가 -> App Uses Non-Exempt Encryption : NO

 

Signing & Capabilities 추가

 

Always Embed Swift Standard Libraries : NO


알고보니 (역시나) 이 값들 포함, 이런저런 세팅을 유니티에서 post process build로 자동화할 수 있다 !!

 

오후 동안 잠시 삽질 후, 모든 설정이 xCode에서 잘 반영된 것을 확인한 스크립트 공유:

아래 코드를 Editor 폴더에 넣어주면 된다.

 

using System.IO;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;

namespace PostProcessBuild.Editor
{
    public static class BuildPostProcessor
    {
        private const string BuildPathRoot = "/Users/_____/Build";

        private const string ProjectPath = "/Users/_____/Build/Unity-iPhone.xcodeproj/project.pbxproj";

        [PostProcessBuild(2)]
        public static void OnPostProcessBuild(BuildTarget buildTarget, string path)
        {
            if (buildTarget == BuildTarget.iOS)
                PostProcessBuildForIOS();
        }

        private static void PostProcessBuildForIOS()
        {
            ModifyPlist();
            ModifyFrameworksSettings();
            AddCapabilities();
        }

        private static void ModifyPlist()
        {
            var plistPath = BuildPathRoot + "/Info.plist";
            var plist = new PlistDocument();
            plist.ReadFromFile(plistPath);

            var rootDict = plist.root;
            rootDict.SetBoolean("ITSAppUsesNonExemptEncryption", false);
            rootDict.SetString("LSApplicationCategoryType", "_____"); // ex. public.app-category.puzzle-games
            rootDict.SetString("CFBundleDisplayName", "_____");
            
            File.WriteAllText(plistPath, plist.WriteToString());
        }
        
        private static void AddCapabilities()
        {
            var proj = new PBXProject();
            proj.ReadFromString(File.ReadAllText(ProjectPath));

            var projCapability = new ProjectCapabilityManager(ProjectPath, "Unity-iPhone/com._____._____.entitlements", "Unity-iPhone");
            projCapability.AddGameCenter();
            projCapability.AddInAppPurchase();
            projCapability.AddPushNotifications(true);
            projCapability.WriteToFile();
        }
        
        private static void ModifyFrameworksSettings()
        {
            var project = new PBXProject();
            project.ReadFromFile(ProjectPath);

            var unityFrameworkTargetGuid = project.GetUnityFrameworkTargetGuid();
            project.SetBuildProperty(unityFrameworkTargetGuid, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "NO");
            project.WriteToFile(ProjectPath);
        }
    }
}