using UnityEngine; #if UNITY_IPHONE using UnityEditor; using UnityEditor.Callbacks; using UnityEditor.iOS.Xcode; using System.Collections.Generic; using System.IO; #endif public class XCodeProjectMod : MonoBehaviour { #if UNITY_IPHONE private const string SETTING_DATA_PATH = "Assets/Editor/XCodeAPI/Setting/XcodeProjectSetting.asset"; [PostProcessBuild] private static void OnPostprocessBuild(BuildTarget buildTarget, string buildPath) { Debug.LogError("ios工程=========================================="); if (buildTarget != BuildTarget.iOS) return; PBXProject pbxProject = null; XcodeProjectSetting setting = null; string pbxProjPath = PBXProject.GetPBXProjectPath(buildPath); string targetGuid = null; Debug.Log("开始设置.XCodeProj"); setting = AssetDatabase.LoadAssetAtPath(SETTING_DATA_PATH); pbxProject = new PBXProject(); pbxProject.ReadFromString(File.ReadAllText(pbxProjPath)); targetGuid = pbxProject.GetUnityFrameworkTargetGuid(); pbxProject.SetBuildProperty(targetGuid, XcodeProjectSetting.ENABLE_BITCODE_KEY, setting.EnableBitCode ? "YES" : "NO"); pbxProject.SetBuildProperty(targetGuid, XcodeProjectSetting.DEVELOPMENT_TEAM, setting.DevelopmentTeam); pbxProject.SetBuildProperty(targetGuid, XcodeProjectSetting.GCC_ENABLE_CPP_EXCEPTIONS, setting.EnableCppEcceptions ? "YES" : "NO"); pbxProject.SetBuildProperty(targetGuid, XcodeProjectSetting.GCC_ENABLE_CPP_RTTI, setting.EnableCppRtti ? "YES" : "NO"); pbxProject.SetBuildProperty(targetGuid, XcodeProjectSetting.GCC_ENABLE_OBJC_EXCEPTIONS, setting.EnableObjcExceptions ? "YES" : "NO"); var sign_type = setting.SignType.ToString(); foreach (XcodeProjectSetting.SignIdentity si in setting.SignIdentityList) { if (si.name == sign_type) { pbxProject.SetBuildProperty(targetGuid, "CODE_SIGN_IDENTITY", si.codeSign); pbxProject.SetBuildProperty(targetGuid, "PROVISIONING_PROFILE", si.profile); pbxProject.SetBuildProperty(targetGuid, "PROVISIONING_PROFILE_SPECIFIER", si.profileSpecifier); break; } } // if (!string.IsNullOrEmpty(setting.CopyDirectoryPath)) // DirectoryProcessor.CopyAndAddBuildToXcode(pbxProject, targetGuid, setting.CopyDirectoryPath, buildPath, ""); //编译器标记(Compiler flags) foreach (XcodeProjectSetting.CompilerFlagsSet compilerFlagsSet in setting.CompilerFlagsSetList) { foreach (string targetPath in compilerFlagsSet.TargetPathList) { if (!pbxProject.ContainsFileByProjectPath(targetPath)) continue; string fileGuid = pbxProject.FindFileGuidByProjectPath(targetPath); List flagsList = pbxProject.GetCompileFlagsForFile(targetGuid, fileGuid); flagsList.Add(compilerFlagsSet.Flags); pbxProject.SetCompileFlagsForFile(targetGuid, fileGuid, flagsList); } } //引用内部框架 foreach (string framework in setting.FrameworkList) { pbxProject.AddFrameworkToProject(targetGuid, framework, false); } //引用.tbd文件 foreach (string tbd in setting.TbdList) { pbxProject.AddFileToBuild(targetGuid, pbxProject.AddFile("usr/lib/" + tbd, "Frameworks/" + tbd, PBXSourceTree.Sdk)); } //设置OTHER_LDFLAGS pbxProject.UpdateBuildProperty(targetGuid, XcodeProjectSetting.LINKER_FLAG_KEY, setting.LinkerFlagArray, null); //设置Framework Search Paths pbxProject.UpdateBuildProperty(targetGuid, XcodeProjectSetting.FRAMEWORK_SEARCH_PATHS_KEY, setting.FrameworkSearchPathArray, null); File.WriteAllText(pbxProjPath, pbxProject.WriteToString()); //已经存在的文件,拷贝替换 foreach (XcodeProjectSetting.CopeFiles file in setting.CopeFilesList) { Debug.Log(Application.dataPath + file.sourcePath + " " + buildPath + file.copyPath); File.Copy(Application.dataPath + file.sourcePath, buildPath + file.copyPath, true); } //设置Plist InfoPlistProcessor.SetInfoPlist(buildPath, setting); } #endif }