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にファイルをアップロード/ダウンロードできるように
なりました。
公式ドキュメントを信じていたので、痛い目にあいました。
この解決方法を見つけた人って凄いなー。