0

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+InternalEnumerator1[System.UInt64].get_Current () UnityEngine.Debug:LogException(Exception) Parse.d__44:MoveNext() System.InternalEnumerator`1:get_Current()

4

1 に答える 1

1

AOT ビルドでリフレクションを使用することができます (Mono スクリプティング バックエンドと IL2CPP スクリプティング バックエンドの両方を使用)。制限は、実際にはSystem.Reflection.Emit名前空間で何かを使用することです。

Unity バージョンの Mono に同梱されている mscorlib.dll アセンブリの一部は、AOT コード パスに適しておらずSystem.Reflection.MonoProperty::StaticGetterAdapterFrame、その 1 つです。このコードは AOT ビルドでは機能しませんが、残念ながら Unity がコンパイル時に判断できるものではないため、エラーは実行時にのみ発生します。

これはおそらく、Parse SDK フォーラムで提起される問題です。この問題を回避するために、SDK を別の方法で使用できる場合があります。

于 2015-05-29T11:45:13.013 に答える