iosunity-game-engineironsource

How to fix bug in Ironsource Unity SDK on iOS


I'm making a game in Unity for mobile. I'm using Ironsource as an ad mediator. Ive added the SDK to my project and its working on Android.

If I switch build targets to iOS I get a compiler error..

Assets\IronSource\Editor\IronSourceBuildPostprocessor.cs(53,48): error CS0619: 'PBXProject.GetUnityTargetName()' is obsolete: 'This function is deprecated. There are two targets now, call GetUnityMainTargetGuid() - for app or GetUnityFrameworkTargetGuid() - for source/plugins to get Guid instead of calling to TargetGuidByName(GetUnityTargetName()).'

I'm on Unity 2019.3.2f1 In anything beyond 2019.3 that function is deprecated.

So, instead of waiting for a fix or an answer from ironsource I could just fix this myself by replacing the deprecated function with either one suggested in the error...

But which one? I have no idea what that function does.. Heres the whole class from the ironsource sdk where the line in question is.. The file is called IronSourceBuildPostprocessor.cs Ive marked the bad line.

#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

Solution

  • So ironsource said to do this..

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

    They also said "This is Unity's and Apple's bug but you can try this" which is obviously total BS. Why dont they just fix their SDK by adding those lines?