2016年11月15日

[Unity] AWS Mobile SDK for Unity で、iPhoneで実行時エラー(NullReferenceException)が出る

AWSの一部のサービスをUnityから動かせるSDKが出ています。

AWS Mobile SDK for Unity:
https://docs.aws.amazon.com/mobile/sdkforunity/developerguide/

サンプルプログラムが添付されているので
これは便利だということで利用し始めました。

しかし、AWS S3 のサンプルを動かそうとしたときに
Unityエディタから動きませんでした。

Unityエディタで動かすには、

AWSConfigs.HttpClient = AWSConfigs.HttpClientOption.UnityWebRequest;

の一行が必要でした。

[参考] AWS Mobile SDK for Unityを使ってサーバーレスなアプリを開発する:
http://nil-one.com/blog/article/2016/04/14/AWS_Mobile_SDK_for_Unity/

これで安心、と思いきや、実機で実行したところ
NullReferenceException
が出てしまいました↓


NullReferenceException: A null value was found where an object instance was required.
at Amazon.Runtime.Internal.DownloadHandlerBufferWrapper..cctor () [0x00000] in :0
at Amazon.Runtime.Internal.UnityMainThreadDispatcher+d__7.MoveNext () [0x00000] in :0
at UnityEngine.SetupCoroutine.InvokeMoveNext (IEnumerator enumerator, IntPtr returnValueAddress) [0x00000] in :0
at Amazon.Runtime.Internal.UnityMainThreadDispatcher.ProcessRequests () [0x00000] in :0
at Amazon.Runtime.Internal.UnityMainThreadDispatcher.Update () [0x00000] in :0
Rethrow as TypeInitializationException: The type initializer for 'Amazon.Runtime.Internal.DownloadHandlerBufferWrapper' threw an exception.
at Amazon.Runtime.Internal.UnityMainThreadDispatcher+d__7.MoveNext () [0x00000] in :0
at UnityEngine.SetupCoroutine.InvokeMoveNext (IEnumerator enumerator, IntPtr returnValueAddress) [0x00000] in :0
at Amazon.Runtime.Internal.UnityMainThreadDispatcher.ProcessRequests () [0x00000] in :0
at Amazon.Runtime.Internal.UnityMainThreadDispatcher.Update () [0x00000] in :0
Amazon.Runtime.Internal.UnityMainThreadDispatcher:ProcessRequests()
Amazon.Runtime.Internal.UnityMainThreadDispatcher:Update()


原因は、実機で動かす時に必要な「link.xml(UnityプロジェクトのResourcesディレクトリに入れる)」
の記載が Unity5.4 から変更があったようでした。

[公式]AWS Mobile SDK for Unity セットアップの仕方:
https://docs.aws.amazon.com/mobile/sdkforunity/developerguide/setup-unity.html

公式ドキュメントにはlink.xmlは

<assembly fullname="UnityEngine">
<type fullname="UnityEngine.Experimental.Networking.UnityWebRequest" preserve="all" />
……

と記載されていますが、Unity5.4以降は「Experimental」を削除した

<assembly fullname="UnityEngine">
<type fullname="UnityEngine.Networking.UnityWebRequest" preserve="all" />
……

が正しいようです。

[参考]iOS: NullReferenceException: A null value was found where an object instance was required. #435:
https://github.com/aws/aws-sdk-net/issues/435

この修正をしたところ、実機でも無事AWS S3にファイルをアップロード/ダウンロードできるように
なりました。

公式ドキュメントを信じていたので、痛い目にあいました。
この解決方法を見つけた人って凄いなー。
posted by be-style at 08:00| Comment(0) | Unity