728x90
반응형

이용목적

  • XcodeAPI를 이용하여 빌드 후 Xcode 설정을 자동화하기 위해서 사용한다.

 

자동화 항목

  • 빌드 설정 편집
  • 프레임 워크의 추가
  • 컴파일 플래그의 설정
  • info.plist 설정

 

PostProcessBuild(N)

  • 빌드 후 호출되는 콜백 함수
  • 유니티 내에 있는 특정파일(ex.특정 정보를 외부에서 수정할 수 있도록 빼놓은 데이터 텍스트)을 빌드 후에도 사라지지 않도록 한다.
  • 0이 내부에서 쓰이는 order이므로 1 이상을 지정한다.

 


※ 이 스크립트 파일은 macOS에 설치된 유니티 에디터를 통해 실행되므로 반드시 Editor 폴더 아래에 두어야 한다.

 

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;

using UnityEditor.iOS.Xcode;


public static class XcodeOption
{

    [PostProcessBuild(999)]
    public static void OnPostProcessBuild( BuildTarget buildTarget, string path)
    {
        if(buildTarget == BuildTarget.iOS)
        {
            string projectPath = path + "/Unity-iPhone.xcodeproj/project.pbxproj";
            PBXProject pbxProject = new PBXProject();
            pbxProject.ReadFromFile(projectPath);
            
            string target = pbxProject.TargetGuidByName("Unity-iPhone");
            
            #region [ProvisioningStyle]
            //!< 빌드 설정 추가
            pbxProject.AddBuildProperty (targetGuid, "OTHER_LDFLAGS" , "-all_load" );
            pbxProject.SetBuildProperty(target, "ENABLE_BITCODE", "NO");
            
            //!< 빌드 설정 편집, 제 3 인수는 추가 설정 제 4 인수는 삭제 설정
            pbxProject.UpdateBuildProperty (targetGuid, "OTHER_LDFLAGS" , new  string [] { "-ObjC" }, new  string [] { "- weak_framework " });
            #endregion
            
            #region [Framework]
            pbxProject.AddFrameworkToProject( targetGuid, "AuthenticationServices.framework", false );
            #endregion
            
            #region [Add Resources]
            //!< localizeList
            Dictionary<string, string> folders = new Dictionary<string, string>();
            List<string> localizeList = new List<string>();
            
            localizeList.Add( "Base.lproj" );
            localizeList.Add( "ko.lproj" );
            localizeList.Add( "zh-Hant.lproj" );
            localizeList.Add( "en.lproj" );
            
            foreach( string data in localizeList )
            {
            	if( !Directory.Exists( "./BuildOutput/XCode" + "/" + data ) )
                	Directory.CreateDirectory( "./BuildOutput/XCode" + "/" + data );
                    
                if( CopyFile( "InfoPlist.strings", "./BuildOutput/iOS_Localize/" + data, "./BuildOutput/XCode/" + data ) )
                	folders.Add( data, "./" );
            }
            
            foreach( KeyValuePair<string, string> folder in folders )
            {
            	string guid = pbxProject.AddFolderReference( folder.Value + folder.Key, folder.Key, PBXSourceTree.Source );
                pbxProject.AddFileToBuild( targetGuid, guid );
            }
            
            Dictionary<string, string> files = new Dictionary<string, string>();
            
            if( CopyFile( "GoogleService-Info.plist", "./BuildOutput/GoogleServicePlist", "./BuildOutput/XCode" ) )
            	files.Add( "GoogleService-Info.plist", "./" );
                
            foreach( KeyValuePair<string, string> file in files )
            {
            	string guid = pbxProject.AddFile( file.Value + file.Key, file.Key, PBXSourceTree.Source );
                pbxProject.AddFileToBuild( targetGuid, guid );
            }
            #endregion
            
            #region [Modify PList]
            string infoPlistPath = path + "/Info.plist";
            //string infoPlistPath = Path.Combine( path, "Info.plist" ); //!< 위와 동일
            
            PlistDocument plistDoc = new PlistDocument();
            plistDoc.ReadFromFile( infoPlistPath );
            //plistDoc.ReadFromString( File.ReadAllText( infoPlistPath ) ); //!< 위와 동일
            
            PlistElementDict plistDic = plistDoc.root;
            if ( plistDic != null)
            {
            	plistDic.SetBoolean("ITSAppUsesNonExemptEncryption", false);
                plistDic.SetString("CFBundleDisplayName", "MY APP NAME");
            }
            
            //!< UIApplicationExitsOnSuspend 제거 
            var dic = plistDic.values;
            dic.Remove( "UIApplicationExitsOnSuspend" );
            
            plistDoc.WriteToFile(infoPlistPath);
            #endregion
            
            //!< [Apply modified configuration]
            pbxProject.WriteToFile (projectPath);
            
            #region [Capabilities]
            ProjectCapabilityManager capabilityManager = new ProjectCapabilityManager( projectPath, "name.entitlements", PBXProject.GetUnityTargetName() );
            
            //!< GameCenter
            capabilityManager.AddGameCenter();
            
            //!< Push
            capabilityManager.AddPushNotifications( true );
            
            //!< In App Purchase
            capabilityManager.AddInAppPurchase();
            
            //!< Sign In with Apple
            AppSignInWithApple( capabilityManager );
            
            capabilityManager.WriteToFile();
            #endregion
        }
    }

}

 

 

 

728x90
반응형