#unity/代码缓存
#ios
有一个前提:macos已经正确安装了,pod相关的工具
## PostProcessBuildClass
``` cs
#if UNITY_IOS
using System.IO;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEngine;
using UnityEditor.iOS.Xcode;
using System.Diagnostics;
using System.Threading;
using Debug = UnityEngine.Debug;
using System;
static class PostProcessBuildClass {
[PostProcessBuild]
public static void ChangeXcodePlist(BuildTarget pBuildTarget, string pPath) {
// Debug.LogError("Post process build ChangeXcodePlist");
if (pBuildTarget == BuildTarget.iOS) {
#region 添加 ATT广告跟踪权限
AddInfoByTracking(pPath);
#endregion
#region 添加Meta 广告变现平台 SKAdNetwork相关
AddSKAdNetworkItems(pPath);
#endregion
}
}
///
/// 添加广告追踪权限
///
///
private static void AddInfoByTracking(string path)
{
string plistPath = Path.Combine(path, "Info.plist");
PlistDocument plist = new PlistDocument();
plist.ReadFromFile(plistPath);
PlistElementDict rootDict = plist.root;
// 添加广告追踪权限说明
rootDict.SetString("NSUserTrackingUsageDescription", "We need your consent to track advertisements to provide better services.");
// 添加定位服务权限说明
rootDict.SetString("NSLocationWhenInUseUsageDescription", "We need your location to provide personalized services.");
File.WriteAllText(plistPath, plist.WriteToString());
}
///
/// 添加Meta 广告变现平台 SKAdNetwork相关
///
///
private static void AddSKAdNetworkItems(string path)
{
string plistPath = Path.Combine(path, "Info.plist");
PlistDocument plist = new PlistDocument();
plist.ReadFromFile(plistPath);
PlistElementDict rootDict = plist.root;
// 获取或创建SKAdNetworkItems数组
PlistElementArray skAdNetworkItems;
if (rootDict.values.ContainsKey("SKAdNetworkItems"))
{
skAdNetworkItems = rootDict["SKAdNetworkItems"].AsArray();
}
else
{
skAdNetworkItems = rootDict.CreateArray("SKAdNetworkItems");
}
// 添加SKAdNetworkIdentifier
AddSkAdNetworkIdentifier(skAdNetworkItems, "v9wttpbfk9.skadnetwork");
AddSkAdNetworkIdentifier(skAdNetworkItems, "n38lu8286q.skadnetwork");
// 保存修改
plist.WriteToFile(plistPath);
}
private static void AddSkAdNetworkIdentifier(PlistElementArray array, string identifier)
{
foreach (var element in array.values)
{
if (element.AsDict().values.ContainsKey("SKAdNetworkIdentifier") &&
element.AsDict()["SKAdNetworkIdentifier"].AsString() == identifier)
{
return; // 已存在,不重复添加
}
}
PlistElementDict dict = array.AddDict();
dict.SetString("SKAdNetworkIdentifier", identifier);
}
private static Thread podFileCheckThread;
private const int timeOutSeconds = 10;
[PostProcessBuild(1999)]
public static void OnPostProcessBuild(BuildTarget pBuildTarget, string pPath)
{
if (pBuildTarget == BuildTarget.iOS)
{
AddSDKFramework(pPath);
AddSwiftUsed(pPath);
InitPodFile(pPath);
AddAudienceNetwork(pPath);
AddSurveyMonkey(pPath);
PodInstall(pPath);
}
}
///
/// 如果podfile不存在,就自动创建一个新的
///
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);
}
}
///
/// 添加meta广告变现
///
///
private static void AddAudienceNetwork(string pPath)
{
string varPodfilePath = Path.Combine(pPath, "Podfile");
string varPodfileContent = File.ReadAllText(varPodfilePath);
// 检查是否已包含SurveyMonkey
if (!varPodfileContent.Contains("pod 'FBAudienceNetwork'"))
{
string varInsertionPoint1 = "target 'UnityFramework' do";
int varIndex1 = varPodfileContent.IndexOf(varInsertionPoint1) + varInsertionPoint1.Length;
string varToInsert1 = "\n pod 'FBAudienceNetwork'";
varPodfileContent = varPodfileContent.Insert(varIndex1, varToInsert1);
File.WriteAllText(varPodfilePath, varPodfileContent);
}
}
///
/// 添加广告SDK 相关引用依赖包
///
///
private static void AddAdvertisement(string pPath)
{
string varPodfilePath = Path.Combine(pPath, "Podfile");
string varPodfileContent = File.ReadAllText(varPodfilePath);
bool needWrite = false;
// 检查是否已包含广告引用
if (!varPodfileContent.Contains("pod 'TPNiOS'"))
{
string varInsertionPoint1 = "target 'UnityFramework' do";
int varIndex1 = varPodfileContent.IndexOf(varInsertionPoint1) + varInsertionPoint1.Length;
string varToInsert1 = "\n pod 'TPNiOS'";
varPodfileContent = varPodfileContent.Insert(varIndex1, varToInsert1);
needWrite = true;
}
if (!varPodfileContent.Contains("pod 'TPNUnityAdsSDKAdapter'"))
{
string varInsertionPoint1 = "target 'UnityFramework' do";
int varIndex1 = varPodfileContent.IndexOf(varInsertionPoint1) + varInsertionPoint1.Length;
string varToInsert1 = "\n pod 'TPNUnityAdsSDKAdapter'";
varPodfileContent = varPodfileContent.Insert(varIndex1, varToInsert1);
needWrite = true;
}
if (!varPodfileContent.Contains("pod 'TPNAdmobSDKAdapter'"))
{
string varInsertionPoint1 = "target 'UnityFramework' do";
int varIndex1 = varPodfileContent.IndexOf(varInsertionPoint1) + varInsertionPoint1.Length;
string varToInsert1 = "\n pod 'TPNAdmobSDKAdapter'";
varPodfileContent = varPodfileContent.Insert(varIndex1, varToInsert1);
needWrite = true;
}
if (needWrite)
{
File.WriteAllText(varPodfilePath, varPodfileContent);
}
}
private static void AddSDKFramework(string pPath)
{
string projPath = PBXProject.GetPBXProjectPath(pPath);
PBXProject proj = new PBXProject();
proj.ReadFromFile(projPath);
string target = proj.GetUnityMainTargetGuid();
proj.AddFrameworkToProject(target, "StoreKit.framework", false); //添加商店评价相关
proj.WriteToFile(projPath);
}
///
/// 添加 总是允许使用Swift编译
///
///
private static void AddSwiftUsed(string pPath)
{
// 获取Xcode项目路径
string projPath = PBXProject.GetPBXProjectPath(pPath);
PBXProject proj = new PBXProject();
proj.ReadFromFile(projPath);
// 获取主目标
string targetGuid = proj.GetUnityMainTargetGuid();
// 设置"Always Embed Swift Standard Libraries"为YES
proj.SetBuildProperty(targetGuid, "ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES", "YES");
// 保存修改
proj.WriteToFile(projPath);
}
///
/// 执行pod install(同步方式)
///
private static void PodInstall(string pPath)
{
Debug.Log("=== 开始执行Pod安装流程 ===");
if (!Directory.Exists(pPath))
{
Debug.LogError($"Xcode工程路径不存在: {pPath}");
return;
}
string podfilePath = Path.Combine(pPath, "Podfile");
if (!File.Exists(podfilePath))
{
Debug.LogError($"Podfile文件不存在: {podfilePath}");
return;
}
try
{
// 转义路径中的单引号
string escapedPath = pPath.Replace("'", "'\\''");
string appleScript = $@"
tell application ""Terminal""
activate
do script ""cd '{escapedPath}' && pod install && exit""
end tell";
Debug.Log($"正在启动终端执行pod install...");
using (Process process = new Process())
{
process.StartInfo = new ProcessStartInfo
{
FileName = "/usr/bin/osascript",
Arguments = $"-e '{appleScript}'",
UseShellExecute = false,
RedirectStandardError = true,
CreateNoWindow = true
};
process.Start();
process.WaitForExit();
if (process.ExitCode != 0)
{
string error = process.StandardError.ReadToEnd();
Debug.LogError($"启动终端失败: {error}");
}
else
{
Debug.Log("已启动终端执行pod install,请稍后在终端中查看结果");
}
}
}
catch (Exception ex)
{
Debug.LogError($"执行命令时发生异常: {ex}");
}
Debug.Log("=== Pod安装流程结束 ===");
}
}
#endif
```