We're creating a game for iOS and android using Unity3d (version 5.0.1p1), and since we are using Parse.com data services we naturally went with it to implement the remote push notifications.
The problem is that after building the game and running it on a test device (iPhone 4s iOS8.1.2) we get at game start an execution engine exception that we cant figure out. Here is the exception :
ExecutionEngineException: Attempting to call method
'System.Reflection.MonoProperty::StaticGetterAdapterFrame' for which no ahead of time (AOT) code was
generated.
at System.Reflection.EventInfo+AddEventAdapter.Invoke (System.Object _this, System.Delegate dele)
[0x00000] in :0
at System.Reflection.MonoProperty+GetterAdapter.Invoke (System.Object _this) [0x00000] in :0
at AOGenerator.BlurBuffer () [0x00000] in :0
at System.Reflection.MonoProperty.GetValue (System.Object obj, System.Object[] index) [0x00000] in:0
at Newtonsoft.Json.Bson.BsonRegex.get_Type () [0x00000] in :0
at Parse.ParseInstallation.get_Badge () [0x00000] in :0
at Parse.ParseInstallation.SetPlatformAutomaticValue () [0x00000] in :0
at Parse.ParseInstallation.SetAutomaticValues () [0x00000] in :0
at Parse.ParseInstallation.SaveAsync (System.Threading.Tasks.Task toAwait, CancellationToken
cancellationToken) [0x00000] in :0
at Parse.PlatformHooks+<>c__DisplayClass38.b__33 (System.Threading.Tasks.Task`1 _)
[0x00000] in :0
at Parse.ParseObject+<>c__DisplayClass18.b__17 (System.Threading.Tasks.Task toAwait)
[0x00000] in :0
at FlurryAnalyticsIOS.SetSessionTimeout (Int32 seconds) [0x00000] in :0
at
System.Collections.Generic.Dictionary`2[System.Int64,System.Boolean].Do_ICollectionCopyTo[KeyValuePair`2]
(System.Array array, Int32 index, System.Collections.Generic.Transform`1 transform) [0x00000] in :0
at Parse.Internal.TaskQueue.Enqueue[Task] (System.Func`2 taskStart, CancellationToken cancellationToken)
[0x00000] in :0
at Parse.ParseObject.SaveAsync (CancellationToken cancellationToken) [0x00000] in :0
at Parse.ParseObject.SaveAsync () [0x00000] in :0
at Parse.ParseInitializeBehaviour.b__0 (System.Byte[] deviceToken) [0x00000] in :0
at FlurryAnalyticsIOS.SetSessionTimeout (Int32 seconds) [0x00000] in :0
at Newtonsoft.Json.Bson.BsonRegex.get_Type () [0x00000] in :0
at Parse.PlatformHooks+<>c__DisplayClass24.b__22 () [0x00000] in:0
at System.Action.Invoke () [0x00000] in :0
at Newtonsoft.Json.Bson.BsonRegex.get_Type () [0x00000] in :0
at Parse.PlatformHooks+d__44.MoveNext () [0x00000] in :0
at System.Nullable`1[System.DateTimeOffset].ToString () [0x00000] in :0
System.Nullable`1:ToString()
UnityEngine.Debug:Internal_LogException(Exception, Object)
UnityEngine.Debug:LogException(Exception)
Parse.d__44:MoveNext()
System.Nullable`1:ToString()
The problem just appeared with the new Unity Parse SDK 1.5 (which contains the PNS feature). What we know is that running an empty project with just the parse sdk goes fine and the notifications work just fine, but in our actual project, because of the exception, devices dont register for the notifications in parse, so we are assuming there is a kind of a conflict between parse and one of the other tools we are using.
FYI : We are building the game using IL2CPP for a universal architecture (we re also building with .Net 2.0 subset, but I dont think that this has something to do with the problem).
Thank you for your time and for your answers.
**UPDATE 1 ::**
We tried to build using Mono(2.x) this time and we have pretty much the same exception that turned into this :
ExecutionEngineException: Attempting to JIT compile method
'System.Reflection.MonoProperty:StaticGetterAdapterFrame
(System.Reflection.MonoProperty/StaticGetter`1,object)' while running with aotonly.
at System.Reflection.MonoProperty.GetValue (System.Object obj, System.Object[] index)
[0x00000] in :0
at Parse.ParseInstallation.get_Badge () [0x00000] in :0
at Parse.ParseInstallation.SetPlatformAutomaticValue () [0x00000] in :0
at Parse.ParseInstallation.SetAutomaticValues () [0x00000] in :0
at Parse.ParseInstallation.SaveAsync (System.Threading.Tasks.Task toAwait,
CancellationToken cancellationToken) [0x00000] in :0
at Parse.ParseObject+<>c__DisplayClass18.b__17
(System.Threading.Tasks.Task toAwait) [0x00000] in :0
at Parse.Internal.TaskQueue.Enqueue[Task] (System.Func`2 taskStart, CancellationToken
cancellationToken) [0x00000] in :0
at Parse.ParseObject.SaveAsync (CancellationToken cancellationToken) [0x00000] in:0
at Parse.ParseObject.SaveAsync () [0x00000] in :0
at Parse.ParseInitializeBehaviour.b__0 (System.Byte[] deviceToken) [0x00000] in:0
at Parse.PlatformHooks+<>c__DisplayClass24.b__22 ()
[0x00000] in :0
at Parse.PlatformHooks+d__44.MoveNext () [0x00000] in :0
UnityEngine.Debug:Internal_LogException(Exception, Object)
UnityEngine.Debug:LogException(Exception)
Parse.d__44:MoveNext()
Hopes it bring you guys more details about the problem.
**UPDATE 2 ::**
We know exactly what causes the exception to happen and unfortunately we have no control over it, its when we register for notification, we do it this way :
using NotificationServices = UnityEngine.iOS.NotificationServices;
using NotificationType = UnityEngine.iOS.NotificationType;
public class UpdateScript : MonoBehaviour
{
void Start ()
{
// Ask for permission for push notifications (Can Receive deviceToken)
#if UNITY_IPHONE
NotificationServices.RegisterForNotifications(
NotificationType.Alert |
NotificationType.Badge |
NotificationType.Sound);
#endif
}
}
↧