Как исправить ошибку в Ironsource Unity SDK на iOS - PullRequest
0 голосов
/ 28 февраля 2020

Я делаю игру в 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

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Таким образом, ironsource сказал, чтобы сделать это ..

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

Они также сказали: «Это ошибка Unity и Apple, но вы можете попробовать это», что, очевидно, является полной BS. Почему они просто не исправляют свой SDK, добавляя эти строки?

1 голос
/ 29 февраля 2020

У меня была такая же проблема в другом плагине, короче говоря, я изменил его на:

    PBXProject proj = new PBXProject();
    proj.ReadFromFile(projPath);
    string target = proj.TargetGuidByName("Unity-iPhone");
...