Everyplay iOS integration issue

Hello,

I am trying to integrate Everyplay to my iOS game, and I am having some integration issue. I emailed Everyplay regarding the issue, but I have yet to receive a reply, so I decided to try the Unity Answers.

The main problem seems to be summarized by the following error:

ArgumentException: An element with the same key already exists in the dictionary.
System.Collections.Generic.Dictionary`2[TKey,TValue].Add (.TKey key, .TValue value) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Collections.Generic/Dictionary.cs:404)
Everyplay.XCodeEditor.PBXParser.ParseDictionary () (at Assets/Editor/Everyplay/XCodeEditor/PBXParser.cs:184)
Everyplay.XCodeEditor.PBXParser.ParseValue () (at Assets/Editor/Everyplay/XCodeEditor/PBXParser.cs:144)
Everyplay.XCodeEditor.PBXParser.ParseDictionary () (at Assets/Editor/Everyplay/XCodeEditor/PBXParser.cs:182)
Everyplay.XCodeEditor.PBXParser.ParseValue () (at Assets/Editor/Everyplay/XCodeEditor/PBXParser.cs:144)
Everyplay.XCodeEditor.PBXParser.Decode (System.String data) (at Assets/Editor/Everyplay/XCodeEditor/PBXParser.cs:49)
Everyplay.XCodeEditor.XCProject…ctor (System.String filePath) (at Assets/Editor/Everyplay/XCodeEditor/XCProject.cs:81)
EveryplayPostprocessor.ProcessXCodeProject (System.String path) (at Assets/Editor/Everyplay/Scripts/EveryplayPostprocessor.cs:123)
EveryplayPostprocessor.PostProcessBuild_iOS (System.String path, System.String clientId) (at Assets/Editor/Everyplay/Scripts/EveryplayPostprocessor.cs:75)
EveryplayPostprocessor.OnPostProcessBuild (BuildTarget target, System.String path) (at Assets/Editor/Everyplay/Scripts/EveryplayPostprocessor.cs:24)
UnityEditor.HostView:OnGUI()

which results in the Everyplay folder to not appear on the XCode navigator, and, as a result, makes XCode throw the error “EveryplayGlesSupport.h file not found.”

Now, the former error is thrown from the following lines of code in PBXParser class:

                    case DICTIONARY_ASSIGN_TOKEN:
                        valueObject = ParseValue();
                        dictionary.Add( keyString, valueObject );
                        break;

Now, I know nothing about iOS development, so I’ve done what little experimentations that I could, which were to change the code to several variations of the following:

                    case DICTIONARY_ASSIGN_TOKEN:
                        valueObject = ParseValue();
						if (!dictionary.ContainsKey (keyString))
						{
                        	dictionary.Add( keyString, valueObject );
						}
						else
						{
							dictionary[keyString] = valueObject;
							Debug.Log ("#### DUPLICATE ####");
							Debug.Log (keyString);
						}
						break;

Unfortunately, this results in XCode not being about to open the build folder with the following pop-up error message:

[My Project] cannot be opened because the project file cannot be parsed.

I am currently using Google Play Game Services for Unity (GitHub - playgameservices/play-games-plugin-for-unity: Google Play Games plugin for Unity), AdColony, and Everyplay - and am certain that this has something to do with the problem I am facing.

What are some things I can do to (a) zero-in on what the problem is, and/or (b) fix this issue?

Thanks!

EDIT:

So, on further investigation, I noticed that lines on porject.pbxproj seem… out of order(?) when I edit PBXParser class with the line above.

[31570-screen+shot+2014-08-26+at+11.34.35+am.png|31570]

Does this cause XCode to not be able to open the project?

The problem seems to be the Adcolony plugin. It will do some changes to the xCode project which are not readable for the xCode editor.

I found a workaround for this issue:

  1. Open the AdColonyPostProcess.cs file
  2. Change the 200 on row 302 to 1081 like this: [PostProcessBuild(1081)] // ← this is where the magic happens, this attribute triggers unity to call this method when the build process has finished

This will make AdColony plugin to run post process stuff after Everyplay so the xCode project will be still readable for Everyplay.