xcode打包后处理通过podfile添加第三方库.md 4.3 KB

#unity/代码缓存

PostProcessBuildClass

#if UNITY_IOS

using System.Diagnostics;
using System.IO;
using System.Threading;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using Debug = UnityEngine.Debug;

/// <summary>
/// xcode打包后处理
/// </summary>
static class PostProcessBuildClass
{
    private static Thread podFileCheckThread;
    private const int timeOutSeconds = 10;
    
    [PostProcessBuild(1999)]
    public static void OnPostProcessBuild(BuildTarget pBuildTarget, string pPath)
    {
        if (pBuildTarget == BuildTarget.iOS)
        {
            InitPodFile(pPath);
            AddSurveyMonkey(pPath);
            PodInstall(pPath);
        }
    }

    /// <summary>
    /// 如果podfile不存在,就自动创建一个新的
    /// </summary>
    private static void InitPodFile(string pPath)
    {
        string podfilePath = Path.Combine(pPath, "Podfile");
        if (!File.Exists(podfilePath))
        {
            string podFileContent = @"
source 'https://cdn.cocoapods.org/'

platform :ios, '12.0'

target 'UnityFramework' do

end
target 'Unity-iPhone' do

end";
            File.WriteAllText(podfilePath, podFileContent);
        }
    }
    
    private static void AddSurveyMonkey(string pPath)
    {
        string varPodfilePath = Path.Combine(pPath, "Podfile");

        string varPodfileContent = File.ReadAllText(varPodfilePath);

        // 检查是否已包含SurveyMonkey
        if (!varPodfileContent.Contains("pod 'surveymonkey-ios-sdk', '~> 2.1.2'"))
        {
            string varInsertionPoint1 = "target 'UnityFramework' do";
            int varIndex1 = varPodfileContent.IndexOf(varInsertionPoint1) + varInsertionPoint1.Length;
            string varToInsert1 = "\n  pod 'surveymonkey-ios-sdk', '~> 2.1.2'";
            varPodfileContent = varPodfileContent.Insert(varIndex1, varToInsert1);
            
            string varInsertionPoint2 = "target 'Unity-iPhone' do";
            int varIndex2 = varPodfileContent.IndexOf(varInsertionPoint2) + varInsertionPoint2.Length;
            string varToInsert2 = "\n  pod 'surveymonkey-ios-sdk', '~> 2.1.2'";
            varPodfileContent = varPodfileContent.Insert(varIndex2, varToInsert2);
            File.WriteAllText(varPodfilePath, varPodfileContent);
        }
    }
    
    /// <summary>
    /// 在pod 设置插件库之后. 执行pod install
    /// </summary>
    /// <param name="pPath"></param>
    private static void PodInstall(string pPath)
    {
        Debug.Log(pPath);
        string varPodfilePath = Path.Combine(pPath, "Podfile");
        void CheckFile()
        {
            int elapsedSeconds = 0;  
  
            while (elapsedSeconds < timeOutSeconds)  
            {  
                if (File.Exists(varPodfilePath))  
                {  
                    // Run pod install or update
                    string code = $"-c \"cd '{pPath}' && pod install\"";
                    ProcessStartInfo varProcessStartInfo = new ProcessStartInfo("sh", code)
                    {
                        UseShellExecute = false,
                        RedirectStandardOutput = true,
                        RedirectStandardError = true,
                        CreateNoWindow = true
                    };

                    Process varProcess = new Process();
                    varProcess.StartInfo = varProcessStartInfo;
                    varProcess.StartInfo.EnvironmentVariables["LC_ALL"] = "en_US.UTF-8";
                    varProcess.StartInfo.EnvironmentVariables["LANG"] = "en_US.UTF-8";
                    varProcess.EnableRaisingEvents = true;
                    varProcess.Start();

                    string varOutput = varProcess.StandardOutput.ReadToEnd();
                    string varErr = varProcess.StandardError.ReadToEnd();
                    varProcess.WaitForExit();

                    Debug.Log("======> Pod install output: " + varOutput);
                    if (!string.IsNullOrEmpty(varErr))
                    {
                        Debug.LogError("======> Pod install error: " + varErr);
                    }
                    break;  
                }  
  
                Thread.Sleep(1000); // 等待一秒再检查  
                elapsedSeconds++;  
            }  
        }

        podFileCheckThread = new Thread(CheckFile);
        podFileCheckThread.Start();

    }
}

#endif