zoukankan      html  css  js  c++  java
  • IOS自动化打包,自动导入并修改文件

    近几日学习IOS自动化打包,特此记录下:

    #if UNITY_IOS || UNITY_IPHONE
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEditor.iOS.Xcode;
    using UnityEditor.Callbacks;
    using UnityEditor;
    using System.IO;
    using UnityEditor.XCodeEditor;
    
    public static class XcodePost
    {
       [PostProcessBuild(700)]
       public static void OnPostProcessBuild(BuildTarget target,string pathToBuildProject)
        {
            if (target != BuildTarget.iOS)
                return;
    
            //修改属性文件
            var projPath = pathToBuildProject + "/Unity-iPhone.xcodeproj/project.pbxproj";
            var proj = new PBXProject();
            proj.ReadFromFile(projPath);
            var targetGuid = proj.TargetGuidByName("Unity-iPhone");
            proj.SetBuildProperty(targetGuid, "ENABLE_BITCODE", "YES");
            proj.AddBuildProperty(targetGuid, "OTHER_LDFLAGS", "-ObjC");
            proj.AddFrameworkToProject(targetGuid, "libz.tbd", false);
            proj.AddFrameworkToProject(targetGuid, "libresolv.tbd", false);
            proj.AddFrameworkToProject(targetGuid, "libsqlite3.tbd", false);
            proj.AddFrameworkToProject(targetGuid, "CoreTelephony.framework", false);
            //proj.AddFrameworkToProject(targetGuid, "HeroStatistics.framework", true);
            proj.AddFrameworkToProject(targetGuid, "SystemConfiguration.framework", false);
    
            proj.WriteToFile(projPath);
    
    
            //复制framework包
            CopyAndReplaceDirectory("Assets/lib/HeroStatistics.framework", Path.Combine(pathToBuildProject, "Frameworks/HeroStatistics.framework"));
            proj.AddFileToBuild(targetGuid, proj.AddFile("Frameworks/HeroStatistics.framework", "Frameworks/HeroStatistics.framework", PBXSourceTree.Source));
    
    
            //修改infolist文件
            string plistPath = pathToBuildProject + "/Info.plist";
            PlistDocument plist = new PlistDocument();
            plist.ReadFromString(File.ReadAllText(plistPath));
            PlistElementDict rootDict = plist.root;
    
            PlistElementDict pedic = rootDict.CreateDict("HeroConfigInfo");
            pedic.SetString("channelname", "IOS");
            plist.WriteToFile(plistPath);
    
            //修改代码文件
            string unityAppControllerPath = pathToBuildProject + "/Classes/UnityAppController.mm";
            XClass UnityAppController = new XClass(unityAppControllerPath);
    
            string importStr = "
    " + "#import <HeroStatistics/HeroStatisticsManager.h>";
            UnityAppController.WriteBelow("#import <OpenGLES/ES2/glext.h>", importStr);
    
            string codeStr = "
    " +
                            "-(void)viewDidLoad {
    " +
                            "[[HeroStatisticsManager sharedInstance] initConfig];
    " +
                            "NSLog(@" Init Sdk ----- !!");
    }";
    
            UnityAppController.WriteBelow("- (void)preStartUnity               {}", codeStr);
    
            string insetStr = "
    " + "    [self viewDidLoad];
    ";
    
            UnityAppController.WriteBelow("UnitySetPlayerFocus(1);", insetStr);
        }
    
    
        internal static void CopyAndReplaceDirectory(string srcPath, string dstPath)
        {
            //路径下该文件夹若存在,则删除
            if (Directory.Exists(dstPath))
            {
                Directory.Delete(dstPath);
            }
            //路径下的文件若存在,则删除
            if (File.Exists(dstPath))
            {
                File.Delete(dstPath);
            }
            //创建该路径下文件夹
            Directory.CreateDirectory(dstPath);
            Debug.Log(dstPath + "----" + srcPath);
    
            foreach (var file in Directory.GetFiles(srcPath))
            {
                Debug.Log(Path.Combine(dstPath, Path.GetFileName(file)));
                File.Copy(file, Path.Combine(dstPath, Path.GetFileName(file)));
            }
    
    
            foreach (var dir in Directory.GetDirectories(srcPath))
                CopyAndReplaceDirectory(dir, Path.Combine(dstPath, Path.GetFileName(dir)));
        }
    
    }
    
    #endif

    class代码如下:

    using UnityEditor;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using UnityEngine;
    
    namespace UnityEditor.XCodeEditor
    {
        public partial class XClass : System.IDisposable
        {
    
            private string filePath;
    
            public XClass(string fPath)
            {
                filePath = fPath;
                if (!System.IO.File.Exists(filePath))
                {
                    Debug.LogError(filePath + "路径下文件不存在");
                    return;
                }
            }
    
    
            public void WriteBelow(string below, string text)
            {
                StreamReader streamReader = new StreamReader(filePath);
                string text_all = streamReader.ReadToEnd();
                streamReader.Close();
    
                int beginIndex = text_all.IndexOf(below);
                if (beginIndex == -1)
                {
                    Debug.LogError(filePath + "中没有找到标致" + below);
                    return;
                }
    
                int endIndex = text_all.LastIndexOf("
    ", beginIndex + below.Length);
    
                text_all = text_all.Substring(0, endIndex) + "
    " + text + "
    " + text_all.Substring(endIndex);
    
                StreamWriter streamWriter = new StreamWriter(filePath);
                streamWriter.Write(text_all);
                streamWriter.Close();
            }
    
            public void Replace(string below, string newText)
            {
                StreamReader streamReader = new StreamReader(filePath);
                string text_all = streamReader.ReadToEnd();
                streamReader.Close();
    
                int beginIndex = text_all.IndexOf(below);
                if (beginIndex == -1)
                {
                    Debug.LogError(filePath + "中没有找到标致" + below);
                    return;
                }
    
                text_all = text_all.Replace(below, newText);
                StreamWriter streamWriter = new StreamWriter(filePath);
                streamWriter.Write(text_all);
                streamWriter.Close();
    
            }
    
            public void Dispose()
            {
    
            }
        }
    }

    xplist

    using UnityEngine;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    
    namespace UnityEditor.XCodeEditor
    {
        public partial class XCPlist : System.IDisposable
        {
    
            private string filePath;
            List<string> contents = new List<string>();
            public XCPlist(string fPath)
            {
                filePath = Path.Combine(fPath, "info.plist");
                if (!System.IO.File.Exists(filePath))
                {
                    Debug.LogError(filePath + "路径下文件不存在");
                    return;
                }
    
                FileInfo projectFileInfo = new FileInfo(filePath);
                StreamReader sr = projectFileInfo.OpenText();
                while (sr.Peek() >= 0)
                {
                    contents.Add(sr.ReadLine());
                }
                sr.Close();
    
            }
            public void AddKey(string key)
            {
                if (contents.Count < 2)
                    return;
                contents.Insert(contents.Count - 2, key);
    
            }
    
            public void ReplaceKey(string key, string replace)
            {
                for (int i = 0; i < contents.Count; i++)
                {
                    if (contents[i].IndexOf(key) != -1)
                    {
                        contents[i] = contents[i].Replace(key, replace);
                    }
                }
            }
    
            public void Save()
            {
                StreamWriter saveFile = File.CreateText(filePath);
                foreach (string line in contents)
                    saveFile.WriteLine(line);
                saveFile.Close();
            }
    
            public void Dispose()
            {
    
            }
        }
    }
  • 相关阅读:
    PyQt QFontDialog显示中文
    zetcode :: First programs in PyQt5
    PyQt4 初试牛刀二
    PyQt5实现透明电子时钟
    配置web.xml和glassfish容器实现javaEE表单验证
    nodejs querystring踩坑笔记----只能用于表单提交
    使用JavaEE的ServerAuthModule模块和web.xml进行相应配置,实现对用户的权限控制
    CAS单点登录(SSO)服务端的部署和配置---连接MySQL进行身份认证
    Oracle中碰到的函数和关键字收集
    windows系统局域网内开启远程桌面图解
  • 原文地址:https://www.cnblogs.com/MuniuTian/p/13372196.html
Copyright © 2011-2022 走看看