Unity3D
Unity
Parse

【Unity】Android実機でParseが動かない場合の対処法

More than 3 years have passed since last update.

解決にかなりの時間をくってしまったので備忘メモ。

(※2015/06/17時点 Unity5.0.2f1での情報です)

Unity Editor上だとParseと通信出来ていたのに、Android実機だとParseと通信出来ず下記のようなエラーが発生しました。

I/Unity(5080): MissingMethodException: Method not found: 'Default constructor not found...ctor() of Parse.PlatformHooks'.

I/Unity(5080): at System.Activator.CreateInstance (System.Type type, Boolean nonPublic) [0x00000] in <filename unknown>:0
I/Unity(5080): at System.Activator.CreateInstance (System.Type type) [0x00000] in <filename unknown>:0
I/Unity(5080): at Parse.ParseClient..cctor () [0x00000] in <filename unknown>:0
I/Unity(5080): Rethrow as TypeInitializationException: An exception was thrown by the type initializer for Parse.ParseClient
I/Unity(5080): at Parse.ParseInitializeBehaviour.Initialize () [0x00000] in <filename unknown>:0
I/Unity(5080): at Parse.ParseInitializeBehaviour.Awake () [0x00000] in <filename unknown>:0

Stripping Levelが臭いかも?と思ったのでAndroidの

Player Settings→Other Settings→Stripping Levelを「Disabled」に変更してみたところ、エラーが変化。

I/Unity(6634): AndroidJavaException: java.lang.ClassNotFoundException: com.parse.ParsePushUnityHelper

I/Unity(6634): at UnityEngine.AndroidJNISafe.CheckException () [0x00000] in <filename unknown>:0
I/Unity(6634): at UnityEngine.AndroidJNISafe.CallStaticObjectMethod (IntPtr clazz, IntPtr methodID, UnityEngine.jvalue[] args) [0x00000] in <filename unknown>:0
I/Unity(6634): at UnityEngine.AndroidJavaObject._CallStatic[AndroidJavaObject] (System.String methodName, System.Object[] args) [0x00000] in <filename unknown>:0
I/Unity(6634): at UnityEngine.AndroidJavaObject.CallStatic[AndroidJavaObject] (System.String methodName, System.Object[] args) [0x00000] in <filename unknown>:0
I/Unity(6634): at UnityEngine.AndroidJavaObject.FindClass (System.String name) [0x00000] in <filename unknown>:0
I/Unity(6634): at UnityEngine.AndroidJavaClass._AndroidJavaClass (System.String className) [0x00000] in <filename unknown>:0
I/Unity(6634): at UnityEngine.AndroidJavaClass..ctor (System.String className) [0x00000] in <filename unknown>:0
I/Unity(6634): at System.Reflection.MonoCMethod.Invoke (System.Object obj, BindingFlags invokeAttr, S

ClassNotFoundExceptionて。。PUSH通知周りのClassが足りんらしいです。

Parse公式のUnityのBlank Projectをベースにいじってるのに何故こんなエラーが出るんだろう、と散々調べまわった結果が↓。


[解決策] Asset StoreからParseのAssetを入れよう

結論、コレだけ。

Parse公式サイトからUnityのBlank Projectが落とせますが、現時点(v1.5.2)ではこれをベースに進めようとするとマルチプラットフォーム対応でハマります。

(Android実機で前述の問題が出てしまいます)

ParseのAssetはその辺も考えて作られているようなので、素直にこちらを使うのが吉。

もちろん無料です。


Assetを入れた後にやること

Assetを入れたらPlugins/Android/AndroidManifest.xml開いて下記の記述を探します。

<activity android:name=".UnityPlayerActivity">

このままだとActivityが見つからずエラーになるので、

<activity android:name="com.unity3d.player.UnityPlayerActivity">

に変更します。これで万事OK。

ちなみに、このあとStripping Levelを「Use micro mscorlib」に戻してもちゃんと動きました。