报错:
Exception: Calling TargetGuidByName with name='Unity-iPhone' is deprecated. There are two targets now, call GetUnityMainTargetGuid() - for app or GetUnityFrameworkTargetGuid() - for source/plugins to get Guid instead.
UnityEditor.iOS.Xcode.PBXProject.TargetGuidByName (System.String name) (at /Users/builduser/buildslave/unity/build/External/XcodeAPI/Xcode/PBXProject.cs:170)
ByteDance.Union.XCodePostProcess.OnPostProcessBuild (UnityEditor.BuildTarget target, System.String pathToBuiltProject) (at Assets/LightGameSDK/Scripts/iOS/Editor/XCodePostProcess.cs:33)
System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <437ba245d8404784b9fbab9b439ac908>:0)
Rethrow as TargetInvocationException: Exception has been thrown by the target of an invocation.
System.Reflection.MonoMethod.Invoke (System.Object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at <437ba245d8404784b9fbab9b439ac908>:0)
System.Reflection.MethodBase.Invoke (System.Object obj, System.Object[] parameters) (at <437ba245d8404784b9fbab9b439ac908>:0)
UnityEditor.Build.BuildPipelineInterfaces+AttributeCallbackWrapper.OnPostprocessBuild (UnityEditor.Build.Reporting.BuildReport report) (at /Users/unity/buildslave/unity/build/Editor/Mono/BuildPipeline/BuildPipelineInterfaces.cs:177)
UnityEditor.Build.BuildPipelineInterfaces+<>c__DisplayClass17_0.<OnBuildPostProcess>b__1 (UnityEditor.Build.IPostprocessBuildWithReport bpp) (at /Users/unity/buildslave/unity/build/Editor/Mono/BuildPipeline/BuildPipelineInterfaces.cs:433)
UnityEditor.Build.BuildPipelineInterfaces.InvokeCallbackInterfacesPair[T1,T2] (System.Collections.Generic.List`1[T] oneInterfaces, System.Action`1[T] invocationOne, System.Collections.Generic.List`1[T] twoInterfaces, System.Action`1[T] invocationTwo, System.Boolean exitOnFailure) (at /Users/unity/buildslave/unity/build/Editor/Mono/BuildPipeline/BuildPipelineInterfaces.cs:391)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr) (at /Users/unity/buildslave/unity/build/Modules/IMGUI/GUIUtility.cs:197)
原因:
有两个Guid,需要区分。
解决:
GetUnityMainTargetGuid(),用于app获取Guid;GetUnityFrameworkTargetGuid(),用于插件获取Guid。
//var targetGUID = proj.TargetGuidByName("Unity-iPhone");
var targetGUID = proj.GetUnityMainTargetGuid();
可用于打包后处理,修改XCode工程设置,示例:
using UnityEngine;
using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System.IO;
public class BuildCallback : IPreprocessBuildWithReport, IPostprocessBuildWithReport
{
int IOrderedCallback.callbackOrder { get { return 0; } }
System.DateTime startTime;
//打包前事件
void IPreprocessBuildWithReport.OnPreprocessBuild(BuildReport report)
{
startTime = System.DateTime.Now;
Debug.Log("开始打包 : " + startTime);
}
//打包后事件
void IPostprocessBuildWithReport.OnPostprocessBuild(BuildReport report)
{
System.TimeSpan buildTimeSpan = System.DateTime.Now - startTime;
Debug.Log("打包成功,耗时 : " + buildTimeSpan);
}
//回调 打包后处理
[PostProcessBuild(1)]
public static void OnPostProcessBuild(BuildTarget target,string pathToBuiltProject)
{
if(target != BuildTarget.iOS)
{
return;
}
var projPath = pathToBuiltProject + "/Unity-iPhone.xcodeproj/project.pbxproj";
var proj = new PBXProject();
proj.ReadFromFile(projPath);
//var targetGUID = proj.TargetGuidByName("Unity-iPhone");
//var targetGUID = proj.GetUnityMainTargetGuid();
var targetGUID = proj.GetUnityFrameworkTargetGuid();
proj.AddBuildProperty(targetGUID,"OTHER_LDFLAGS","-ObjC");
proj.SetBuildProperty(targetGUID,"ENABLE_BITCODE","NO");
// framework to project
proj.AddFrameworkToProject(targetGUID,"WebKit.framework",false);
proj.AddFrameworkToProject(targetGUID,"VideoToolbox.framework",false);
proj.AddFrameworkToProject(targetGUID,"SystemConfiguration.framework",false);
proj.AddFrameworkToProject(targetGUID,"StoreKit.framework",false);
proj.AddFrameworkToProject(targetGUID,"Security.framework",false);
proj.AddFrameworkToProject(targetGUID,"ReplayKit.framework",false);
proj.AddFrameworkToProject(targetGUID,"Photos.framework",false);
proj.AddFrameworkToProject(targetGUID,"MultipeerConnectivity.framework",false);
proj.AddFrameworkToProject(targetGUID,"MobileCoreServices.framework",false);
proj.AddFrameworkToProject(targetGUID,"MetalPerformanceShaders.framework",false);
proj.AddFrameworkToProject(targetGUID,"MediaToolbox.framework",false);
proj.AddFrameworkToProject(targetGUID,"MediaPlayer.framework",false);
proj.AddFrameworkToProject(targetGUID,"libresolv.9.tbd",false);
proj.AddFrameworkToProject(targetGUID,"libiconv.tbd",false);
proj.AddFrameworkToProject(targetGUID,"libcompression.tbd",false);
proj.AddFrameworkToProject(targetGUID,"libc++abi.tbd",false);
proj.AddFrameworkToProject(targetGUID,"JavaScriptCore.framework",false);
proj.AddFrameworkToProject(targetGUID,"GLKit.framework",false);
proj.AddFrameworkToProject(targetGUID,"CoreTelephony.framework",false);
proj.AddFrameworkToProject(targetGUID,"AVFoundation.framework",false);
proj.AddFrameworkToProject(targetGUID,"AudioToolbox.framework",false);
proj.AddFrameworkToProject(targetGUID,"AssetsLibrary.framework",false);
proj.AddFrameworkToProject(targetGUID,"Accelerate.framework",false);
proj.AddFrameworkToProject(targetGUID,"AuthenticationServices.framework",false);
proj.AddFrameworkToProject(targetGUID,"libil2cpp.a",false);
proj.AddFrameworkToProject(targetGUID,"libiPhone-lib.a",false);
proj.AddFrameworkToProject(targetGUID,"AuthenticationServices.framework",false);
proj.AddFrameworkToProject(targetGUID,"CoreText.framework",false);
proj.AddFrameworkToProject(targetGUID,"AVKit.framework",false);
proj.AddFrameworkToProject(targetGUID,"CFNetwork.framework",false);
proj.AddFrameworkToProject(targetGUID,"CoreGraphics.framework",false);
proj.AddFrameworkToProject(targetGUID,"CoreMedia.framework",false);
proj.AddFrameworkToProject(targetGUID,"CoreMotion.framework",false);
proj.AddFrameworkToProject(targetGUID,"CoreVideo.framework",false);
proj.AddFrameworkToProject(targetGUID,"Foundation.framework",false);
proj.AddFrameworkToProject(targetGUID,"OpenAL.framework",false);
proj.AddFrameworkToProject(targetGUID,"OpenGLES.framework",false);
proj.AddFrameworkToProject(targetGUID,"QuartzCore.framework",false);
proj.AddFrameworkToProject(targetGUID,"UIKit.framework",false);
proj.AddFrameworkToProject(targetGUID,"libiconv.2.dylib",false);
proj.AddFrameworkToProject(targetGUID,"LightGameSDK.framework",false);
proj.AddFrameworkToProject(targetGUID,"Metal.framework",false);
proj.AddFrameworkToProject(targetGUID,"libresolv.9.tbd",false);
proj.AddFrameworkToProject(targetGUID,"libc++.tbd",false);
proj.AddFrameworkToProject(targetGUID,"libz.tbd",false);
proj.AddFrameworkToProject(targetGUID,"CoreLocation.framework",false);
proj.AddFrameworkToProject(targetGUID,"ImageIO.framework",false);
proj.AddFrameworkToProject(targetGUID,"AdSupport.framework",false);
proj.WriteToFile(projPath);
var plistPath = Path.Combine(pathToBuiltProject,"Info.plist");
var plist = new PlistDocument();
plist.ReadFromFile(plistPath);
PlistElementDict rootDict = plist.root;
plist.root.SetString("NSPhotoLibraryAddUsageDescription","需要相册权限");
plist.root.SetString("NSPhotoLibraryUsageDescription","需要相册权限");
plist.root.SetString("NSCalendarsUsageDescription","需要日历权限");
plist.root.SetString("NSMicrophoneUsageDescription","录制屏幕需要麦克风权限");
plist.root.SetString("NSCameraUsageDescription","需要相机权限");
plist.root.SetString("NSLocationWhenInUseUsageDescription","需要定位权限");
PlistElementArray queriesSchemes = rootDict.CreateArray("LSApplicationQueriesSchemes");
queriesSchemes.AddString("douyinsharesdk");
queriesSchemes.AddString("douyinopensdk");
queriesSchemes.AddString("snssdk1128");
queriesSchemes.AddString("toutiaoopensdk");
plist.WriteToFile(plistPath);
UnityEngine.Debug.Log("Xcode 后续处理完成");
}
}