1

我正在 Unity 中为移动设备制作游戏。我使用 Ironsource 作为广告中介。我已将 SDK 添加到我的项目并在 Android 上运行。

如果我将构建目标切换到 iOS,我会收到编译器错误..

Assets\IronSource\Editor\IronSourceBuildPostprocessor.cs(53,48):错误 CS0619:'PBXProject.GetUnityTargetName()' 已过时:'此函数已弃用。现在有两个目标,调用 GetUnityMainTargetGuid() - 用于应用程序或 GetUnityFrameworkTargetGuid() - 用于源/插件获取 Guid,而不是调用 TargetGuidByName(GetUnityTargetName())。

我在 Unity 2019.3.2f1 在 2019.3 之后的任何内容中,该功能已被弃用。

所以,与其等待修复或来自ironsource的答案,我可以通过用错误中建议的任何一个替换已弃用的函数来自己解决这个问题......

但是哪一个?我不知道那个函数是做什么的..这是来自 Ironsource sdk 的整个类,其中有问题的行是..文件名为 IronSourceBuildPostprocessor.cs 我标记了坏行。

#if UNITY_IOS 

using UnityEngine;
using UnityEditor;
using UnityEditor.Callbacks;
using UnityEditor.iOS.Xcode;
using System;
using System.IO;
using System.Linq;
using System.Text.RegularExpressions;
using System.Reflection;

namespace IronSource.Editor
{
    public class IronSourceBuildPostprocessor
    {
        [PostProcessBuild]
        public static void OnPostprocessBuild (BuildTarget buildTarget, string buildPath)
        {
            if (buildTarget == BuildTarget.iOS) {
                string projectPath = buildPath + "/Unity-iPhone.xcodeproj/project.pbxproj";
                string dirpath = Application.dataPath + "/IronSource/Editor/";
                string currentNamespace = MethodBase.GetCurrentMethod().DeclaringType.Namespace;

                updateProject (buildTarget, projectPath);

                if (Directory.Exists (dirpath)) {
                    //Match the classes that has "Settings" in their name, and don't start with "I"
                    var files = Directory.GetFiles (dirpath, "*.cs", SearchOption.TopDirectoryOnly).Where (file => Regex.IsMatch (Path.GetFileName (file), "^(?!IAdapter).+Settings.*$"));

                    //Go over all the adapter settings classes, and call their updateProject method
                    foreach (string file in files) {
                        string classname = Path.GetFileNameWithoutExtension (file);

                        if (!String.IsNullOrEmpty (classname)) {
                            IAdapterSettings adapter = (IAdapterSettings)Activator.CreateInstance (Type.GetType (currentNamespace + "." + classname));
                            adapter.updateProject (buildTarget, projectPath);
                        }
                    }
                }
            }

            Debug.Log ("IronSource build postprocessor finished");
        }

        private static void updateProject (BuildTarget buildTarget, string projectPath)
        {
            Debug.Log ("IronSource - Update project for IronSource");

            PBXProject project = new PBXProject ();
            project.ReadFromString (File.ReadAllText (projectPath));

            string targetId = project.TargetGuidByName (PBXProject.GetUnityTargetName ()); // THIS IS BAD LINE!!!

            // Required System Frameworks
            project.AddFrameworkToProject (targetId, "AdSupport.framework", false);
            project.AddFrameworkToProject (targetId, "AudioToolbox.framework", false);
            project.AddFrameworkToProject (targetId, "AVFoundation.framework", false);
            project.AddFrameworkToProject (targetId, "CoreGraphics.framework", false);
            project.AddFrameworkToProject (targetId, "CoreMedia.framework", false);
            project.AddFrameworkToProject (targetId, "CoreTelephony.framework", false);
            project.AddFrameworkToProject (targetId, "CoreVideo.framework", false);
            project.AddFrameworkToProject (targetId, "CFNetwork.framework", false);     
            project.AddFrameworkToProject (targetId, "Foundation.framework", false);
            project.AddFrameworkToProject (targetId, "MobileCoreServices.framework", false);
            project.AddFrameworkToProject (targetId, "QuartzCore.framework", false);
            project.AddFrameworkToProject (targetId, "Security.framework", false);
            project.AddFrameworkToProject (targetId, "StoreKit.framework", false);
            project.AddFrameworkToProject (targetId, "SystemConfiguration.framework", false);
            project.AddFrameworkToProject (targetId, "WebKit.framework", false);


            project.AddFileToBuild (targetId, project.AddFile ("usr/lib/libz.tbd", "Frameworks/libz.tbd", PBXSourceTree.Sdk));

            // Custom Link Flag
            project.AddBuildProperty (targetId, "OTHER_LDFLAGS", "-ObjC");

            File.WriteAllText (projectPath, project.WriteToString ());
        }
    }
}
#endif
4

2 回答 2

9

所以ironsource说要这样做..

#if UNITY_2019_3_OR_NEWER
string targetId = project.GetUnityFrameworkTargetGuid();
#else
string targetId = project.TargetGuidByName(PBXProject.GetUnityTargetName());
#endif

他们还说“这是 Unity 和 Apple 的错误,但你可以试试这个”,这显然是完全的 BS。他们为什么不通过添加这些行来修复他们的 SDK?

于 2020-03-18T04:19:31.477 回答
1

我在其他插件中遇到了同样的问题,长话短说,我将其更改为:

    PBXProject proj = new PBXProject();
    proj.ReadFromFile(projPath);
    string target = proj.TargetGuidByName("Unity-iPhone");
于 2020-02-29T20:35:55.050 回答