Unity AWS SDKを使って、AWS SNSでPush通知(APNs,FCM)をおくる

AWS Mobile SDK for Unityのサンプル SNSExample を使ってPush通知を登録&送信(AWS SNSにエンドポイント登録して、Publish to endpoint)するまでです。
iOSとAndroidの両方でPush通知を行います。
AndroidはFirebaseを使って、FCM経由で通知させます。

AWS(Cognito,SNS)の設定

AWS Cognitoおよび、AWS SNSの設定は他のサイトに詳しく説明があるので割愛しますが、ざっくり以下の対応が必要です。
・Cognitoは”フェデレーテッドアイデンティティの管理”から、”新しいIDプール”を作成する必要があります。
・AWS SNSでApplicationを追加する必要があります。SNSでApplicationを追加する場合、AndroidはAPIキー、iOSはP12ファイル(開発をプロダクションそれぞれ)が必要となります。
Applicationを登録すると降り出されるEndpoints ARN(iOS開発用、iOS商用、Android)の3つが必要です。(テストだけならiOSはテスト用のEndpoints ARNだけでOK)

公式ドキュメント&SDKダウンロード

http://docs.aws.amazon.com/mobile/sdkforunity/developerguide/setup-unity.html
↑SDKはこのページの中の”download the AWS Mobile SDK for Unity”リンクからDLできます。
http://docs.aws.amazon.com/mobile/sdkforunity/developerguide/sns.html

AWS SDKをインポートする

ダウンロードしたAWS Uniry SDKを展開し、パッケージをインポートします。
AWSSDK.SimpleNotificationService.3.3.0.20.unitypackage
インポートすると、Project/Examples/SNSExampleにサンプルのシーンがあるので開きます。
Hierarchy/SNSExample のInspectorに必要な内容を埋めます。
SNSExample_Inspector

Identity Pool IdはAWS CognitoにてIDを振り出しします。
Android/iOS Application ArnはAWS SNSでEndpointを取得します。
Google Console Project Idは Firebaseコンソールの 設定>クラウドメッセージング から確認できます。
Regionを設定する項目が2つありますが、アジアパシフィック(東京)の場合には”ap-northeast-1″を設定します。

Google Console Project Id

Firebase_console1

Firebase_console2

Unity(iOS,Android共通)の設定

Resourcesフォルダを作成します。
作成したResourcesフォルダ内にawsconfig.xml を作成します。

Resources/awsconfig.xml

<?xml version="1.0" encoding="utf-8"?>
<aws region="ap-northeast-1" correctForClockSkew="true">
    <logging logTo="UnityLogger"
             logResponses="Always"
             logMetrics="true"
             logMetricsFormat="JSON" />
    <s3 useSignatureVersion4="true" />
</aws>

同様にResources/link.xmlを作成します。

Resources/link.xml

<linker>
<assembly fullname="UnityEngine">
        <type fullname="UnityEngine.Networking.UnityWebRequest" preserve="all" />
    <type fullname="UnityEngine.Experimental.Networking.UploadHandlerRaw" preserve="all" />
    <type fullname="UnityEngine.Experimental.Networking.UploadHandler" preserve="all" />
    <type fullname="UnityEngine.Experimental.Networking.DownloadHandler" preserve="all" />
    <type fullname="UnityEngine.Experimental.Networking.DownloadHandlerBuffer" preserve="all" />
</assembly>
<assembly fullname="mscorlib">
    <namespace fullname="System.Security.Cryptography" preserve="all"/>
</assembly>
<assembly fullname="System">
    <namespace fullname="System.Security.Cryptography" preserve="all"/>
</assembly>
<assembly fullname="AWSSDK.Core" preserve="all"/>
<assembly fullname="AWSSDK.CognitoIdentity" preserve="all"/>
<assembly fullname="AWSSDK.SecurityToken" preserve="all"/>
</linker>

公式ドキュメントに記載にある内容をベースに下記の様に修正するとうまく動きます。

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

iTunes Connect,AppleDevelopper

割愛しますが、証明書周りの準備が面倒に感じました。

GooglePlayDevelopperConsole,Firebase

割愛しますが、AWS SNSの設定時にサーバーキー(トークン)が必要となります。

Unity側でのiOS用固有の設定

とくにありません。
開発環境でのテストの際には、”Push notification platform”の選択の際にApple Developmentを指定して作成したARNを設定する必要があります。

Unity側でのAndroid用固有の設定

Plugins/Android 配下に以下の2つのファイルを追加
android-support-v4.jar
google-play-services.jar
この2つのファイルはネットでDL先を探すがみつからず、ローカルな開発環境(Mac)の中で発見したファイルを使いました。

FCMを使う為のAndroidManifest.xmlの設定

FCM(Firebase)用の設定をAndroidManifest.xmlに追記します。

AndroidManifest.xml

<service android:name=".MyFcmListenerService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

Xcode側での設定

Capabilitiesの設定にて、”Push Notifications”をONにするのを忘れずに。

一斉通知を行う場合

この手順で出来るのは端末(Enpoint ARN)を指定したpush通知なので、一斉通知する為にはTopicsを作成し、Topicsに取得したEnpoint ARN登録する方法などが必要です。

参考URL

[Unity] AWS Mobile SDK for Unity で、iPhoneで実行時エラー(NullReferenceException)が出る: ものづくりログ
AWS Mobile SDK for Unity で、iPhoneで実行時エラー(NullReferenceException)が出る,ものづくりの中で、気づいたこととかメモとか。