Unity3d (バージョン 5.0.1p1) を使用して iOS および android 用のゲームを作成しています。Parse.com データ サービスを使用しているので、リモート プッシュ通知を実装するために当然それを使用しました。
問題は、ゲームをビルドしてテスト デバイス (iPhone 4s iOS8.1.2) で実行した後、ゲームの開始時に実行エンジンの例外が発生することです。例外は次のとおりです。
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 <filename unknown>:0
at System.Reflection.MonoProperty+GetterAdapter.Invoke (System.Object
_this) [0x00000] in <filename
unknown>:0
at AOGenerator.BlurBuffer () [0x00000] in <filename unknown>:0
at System.Reflection.MonoProperty.GetValue (System.Object obj, System.Object[] index) [0x00000] in
<filename unknown>:0
at Newtonsoft.Json.Bson.BsonRegex.get_Type () [0x00000] in <filename unknown>:0
at Parse.ParseInstallation.get_Badge () [0x00000] in <filename unknown>:0
at Parse.ParseInstallation.SetPlatformAutomaticValue () [0x00000] in <filename unknown>:0
at Parse.ParseInstallation.SetAutomaticValues () [0x00000] in <filename unknown>:0
at Parse.ParseInstallation.SaveAsync (System.Threading.Tasks.Task toAwait, CancellationToken
cancellationToken) [0x00000] in <filename unknown>:0
at Parse.PlatformHooks+<>c__DisplayClass38.<RequestAsync>b__33 (System.Threading.Tasks.Task`1 _)
[0x00000] in <filename unknown>:0
at Parse.ParseObject+<>c__DisplayClass18.<SaveAsync>b__17 (System.Threading.Tasks.Task toAwait)
[0x00000] in <filename unknown>:0
at FlurryAnalyticsIOS.SetSessionTimeout (Int32 seconds) [0x00000] in <filename unknown>: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 <filename
unknown>:0
at Parse.Internal.TaskQueue.Enqueue[Task] (System.Func`2 taskStart, CancellationToken cancellationToken)
[0x00000] in <filename unknown>:0
at Parse.ParseObject.SaveAsync (CancellationToken cancellationToken) [0x00000] in <filename unknown>:0
at Parse.ParseObject.SaveAsync () [0x00000] in <filename unknown>:0
at Parse.ParseInitializeBehaviour.<Awake>b__0 (System.Byte[] deviceToken) [0x00000] in <filename
unknown>:0
at FlurryAnalyticsIOS.SetSessionTimeout (Int32 seconds) [0x00000] in <filename unknown>:0
at Newtonsoft.Json.Bson.BsonRegex.get_Type () [0x00000] in <filename unknown>:0
at Parse.PlatformHooks+<>c__DisplayClass24.<RegisterDeviceTokenRequest>b__22 () [0x00000] in
<filename unknown>:0
at System.Action.Invoke () [0x00000] in <filename unknown>:0
at Newtonsoft.Json.Bson.BsonRegex.get_Type () [0x00000] in <filename unknown>:0
at Parse.PlatformHooks+<RunDispatcher>d__44.MoveNext () [0x00000] in <filename unknown>:0
at System.Nullable`1[System.DateTimeOffset].ToString () [0x00000] in <filename unknown>:0
System.Nullable`1:ToString()
UnityEngine.Debug:Internal_LogException(Exception, Object)
UnityEngine.Debug:LogException(Exception)
Parse.<RunDispatcher>d__44:MoveNext()
System.Nullable`1:ToString()
この問題は、新しい Unity Parse SDK 1.5 (PNS 機能を含む) で発生しました。私たちが知っていることは、空のプロジェクトを parse sdk だけで実行するとうまくいき、通知が正常に機能するということですが、実際のプロジェクトでは、例外のため、デバイスは解析で通知に登録されません。 parse と私たちが使用している他のツールの 1 つとの間の競合のようなものです。
参考までに: ユニバーサル アーキテクチャ用に IL2CPP を使用してゲームを構築しています (.Net 2.0 サブセットでも構築していますが、これが問題と関係があるとは思いません)。
お時間をいただき、ご回答いただきありがとうございます。
アップデート ::
今回は Mono(2.x) を使用してビルドしようとしましたが、ほぼ同じ例外が発生し、次のようになりました。
ExecutionEngineException: メソッドを JIT コンパイルしようとしています
'System.Reflection.MonoProperty:StaticGetterAdapterFrame
(System.Reflection.MonoProperty/StaticGetter`1,object)' aotonly で実行中。
System.Reflection.MonoProperty.GetValue (System.Object obj、System.Object[] インデックス) で
[0x00000] in :0
Parse.ParseInstallation.get_Badge () [0x00000] で:0
Parse.ParseInstallation.SetPlatformAutomaticValue () [0x00000] で
不明>:0
Parse.ParseInstallation.SetAutomaticValues () [0x00000] で:0
Parse.ParseInstallation.SaveAsync で (System.Threading.Tasks.Task toAwait、
CancellationToken cancelToken) [0x00000] in :0
Parse.ParseObject+<>c__DisplayClass18.b__17 で
(System.Threading.Tasks.Task toAwait) [0x00000] in :0
Parse.Internal.TaskQueue.Enqueue[Task] で (System.Func`2 taskStart、CancellationToken
cancelToken) [0x00000] in :0
Parse.ParseObject.SaveAsync (CancellationToken cancelToken) [0x00000] で
:0
Parse.ParseObject.SaveAsync () [0x00000] で:0
Parse.ParseInitializeBehaviour.b__0 (System.Byte[] deviceToken) [0x00000] で
:0
Parse.PlatformHooks+<>c__DisplayClass24.b__22 () で
[0x00000] in :0
Parse.PlatformHooks+d__44.MoveNext () [0x00000] で
不明>:0
UnityEngine.Debug:Internal_LogException(例外、オブジェクト)
UnityEngine.Debug:LogException(例外)
Parse.d__44:MoveNext()
問題についての詳細が得られることを願っています。
更新 2 ::
例外が発生する原因は正確にわかっていますが、残念ながらそれを制御することはできません。通知を登録するときは、次のようにします。
using NotificationServices = UnityEngine.iOS.NotificationServices;
using NotificationType = UnityEngine.iOS.NotificationType;
/*
.
.
.
*/
void ACalledFunction ()
{
// Ask for permission for push notifications (Can Receive deviceToken)
#if UNITY_IPHONE
NotificationServices.RegisterForNotifications(
NotificationType.Alert |
NotificationType.Badge |
NotificationType.Sound);
#endif
}
}
UPDATE 15/06/2015 : Parse Unity SDK 1.5.1 (il2cpp スクリプティング バックエンド)
解析 PN に登録しようとすると、同じエラーが引き続き発生します。
ExecutionEngineException: 事前 (AOT) コードが生成されていないメソッド 'System.Reflection.MonoProperty::StaticGetterAdapterFrame' を呼び出そうとしています。System.Reflection.MonoProperty+GetterAdapter.Invoke (System.Object _this) System.Reflection.MonoProperty+GetterAdapter.Invoke (System.Object _this) CurvedText.OnRectTransformDimensionsChange () System.Reflection.MonoProperty.GetValue (System.Object obj, System. Object[] index) Newtonsoft.Json.Bson.BsonString.set_IncludeLength (ブール値) Parse.ParseInstallation.get_Badge () Parse.ParseInstallation.SetPlatformAutomaticValue () Parse.ParseInstallation.SetAutomaticValues () Parse.ParseInstallation.SaveAsync (System.Threading.Tasks .Task toAwait, CancellationToken cancelToken) Parse.PlatformHooks+<>c__DisplayClass42.b__36 (System.
2 taskStart, CancellationToken cancellationToken) Parse.ParseObject.SaveAsync (CancellationToken cancellationToken) Parse.ParseObject.SaveAsync () Parse.ParseInitializeBehaviour.b__0 (System.Byte[] deviceToken) FlurryAnalyticsIOS.SetSessionTimeout (Int32 seconds) Newtonsoft.Json.Bson.BsonString.set_IncludeLength (Boolean value) Parse.PlatformHooks+<>c__DisplayClass24.b__22 () System.Action.Invoke () Newtonsoft.Json.Bson.BsonString.set_IncludeLength (Boolean value) Parse.PlatformHooks+d__44.MoveNext () System.Array+InternalEnumerator
1[System.UInt64].get_Current () UnityEngine.Debug:LogException(Exception) Parse.d__44:MoveNext() System.InternalEnumerator`1:get_Current()