iOS開發之與unity生成Xcode工程后執行操作


我們用unity項目生成xcode工程后,我們自己可以做一些xcode的配置工作,比如資源拷貝、引用系統庫、修改bulid setting信息等。

然后需要注意的是這個C#文件需要放到Editor目錄下面,不然那會報錯

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.IO;

public class ECKiOSBuild : MonoBehaviour {

        //這個修飾很重要,就是通過這個來表示xcode工程創建之后自動執行此方法
    [PostProcessBuild]
    public static void ECKExecuteAfteriOSBuild(BuildTarget buildTarget, string path)
    {
        if (BuildTarget.iOS == buildTarget)
        {
            //復制資源文件夾
            ECKCopyiOSResource(path);
            //修改工程文件
            ECKModifyPBXProject(path);
        }
    }

    private static void ECKModifyPBXProject(string path)
    {
        string projPath = PBXProject.GetPBXProjectPath(path);
        PBXProject proj = new PBXProject();

        proj.ReadFromString(File.ReadAllText(projPath));
        string target = proj.TargetGuidByName("Unity-iPhone");

        //添加 -ObjC標記
        proj.AddBuildProperty(target, "OTHER_LDFLAGS", "-ObjC");

        //引用資源文件夾
        string resourceDirectoryPath = "Libraries/Plugins/ECKChatSDK/iOS/Resource";
        ECKAddResourceGroupToiOSProject(path, proj, target, resourceDirectoryPath);

     //引用系統庫
     proj.AddFrameworkToProject(target, "libicucore.tbd", false);
//引用資源文件夾,直接添加文件夾,以Create folder references 形式添加
        /*
        string resourcePath = "Libraries/Plugins/ECKChatSDK/iOS/Resource";
        //string fileGuid = proj.AddFolderReference(Path.Combine(path, resourcePath), resourcePath, PBXSourceTree.Source);
        string fileGuid = proj.AddFolderReference(Path.Combine(path, resourcePath), resourcePath);
        proj.AddFileToBuild(target, fileGuid);*/

        //保存工程文件
        File.WriteAllText(projPath, proj.WriteToString());
    }

    //在工程文件添加資源文件夾引用,以 Create Group 形式加到工程文件
    private static void ECKAddResourceGroupToiOSProject(string xcodePath, PBXProject proj, string target, string resourceDirectoryPath)
    {
        string dirFullPath = Path.Combine(xcodePath, resourceDirectoryPath);
        //添加文件引用
        string[] files = Directory.GetFiles(dirFullPath);
        foreach (string s in files)
        {
            string fileExtension = Path.GetExtension(s);
            if (fileExtension.Equals(".DS_Store")) {
                continue;
            }
            string fileName = Path.GetFileName(s);
            string targetFilePath = Path.Combine(resourceDirectoryPath, fileName); 
            string fileGuid = proj.AddFolderReference(targetFilePath, targetFilePath);
            proj.AddFileToBuild(target, fileGuid);
        }
        //添加子文件夾
        string[] subDirectorys = Directory.GetDirectories(dirFullPath);
        foreach (string s in subDirectorys)
        {
            string fileName = Path.GetFileName(s);
            string subDirPath = Path.Combine (resourceDirectoryPath, fileName); 
            string fileExtension = Path.GetExtension(s);
            if (fileExtension.Equals (".xcassets")) {
                string fileGuid = proj.AddFile(subDirPath, subDirPath);
                proj.AddFileToBuild(target, fileGuid);
            } else {
                ECKAddResourceGroupToiOSProject (xcodePath, proj, target, subDirPath);
            }
        }
    }

    //復制ios多語言文件和圖片資源
    private static void ECKCopyiOSResource(string path)
    {
        string fromDir = Application.dataPath+"/Plugins/ECKChatSDK/iOS/Resource/";
        string targetDir = path + "/Libraries/Plugins/ECKChatSDK/iOS/Resource/";

        ECKCopyDirectoryFiles (fromDir, targetDir);
    }

    /** 將文件夾下面的所有非.meta文件(不包括子文件夾)復制到iOS工程目錄下*/
    private static void ECKCopyDirectoryFiles(string fromDir, string targetDir)
    {
        if (!Directory.Exists(targetDir))
        {
            Directory.CreateDirectory(targetDir);
        }

        //復制所有文件
        string[] files = Directory.GetFiles(fromDir);

        // Copy the files and overwrite destination files if they already exist.
        foreach (string s in files)
        {
            string extension = Path.GetExtension(s);
            if (extension.Equals(".meta")) 
            {
                continue;
            }
            string fileName = Path.GetFileName(s);
            string targetFilePath = Path.Combine(targetDir, fileName);
            File.Copy(s, targetFilePath, true);
        }

        //復制所有子文件夾
        string[] subDirectorys = Directory.GetDirectories(fromDir);

        // Copy the files and overwrite destination files if they already exist.
        foreach (string s in subDirectorys)
        {
            string dirName = Path.GetFileName(s);
            string targetDirPath = Path.Combine(targetDir, dirName);
            ECKCopyDirectoryFiles (s, targetDirPath);
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM