GS2-Inbox

受信ボックスの管理を GS2 SDK for Unity から利用する手順を解説します。

受信ボックスを作成する

GS2マネージメントコンソールの GS2-Inbox から新しく受信ボックスを作成します。

受信ボックスは複数のアカウントのメッセージをまとめて管理する単位です。

../../../_images/step-00011.png

『受信ボックスの新規作成』をクリックします。

../../../_images/step-00021.png

受信ボックスの名前をつけます。

サービスクラスは想定されるアクセス数に応じたサイズを選択します。

開封時自動削除の設定は、メッセージ開封時にメッセージを削除したいか、既読状態でメッセージを残したいかを指定します。

連携用URL はメッセージ開封時にサーバに通知してほしい場合、URLを指定します。

これで、GS2マネージメントコンソールでおこなう準備は完了です。

受信ボックス処理を実装

ここからは Unity での実装になります。

まずはログイン処理を実装する必要があります。ログインして Gs2.GameSession を取得するまでの手順は GS2-Auth をご参照ください。

ここからはログインが完了している前提で説明を進めます。

メッセージ一覧を取得

gs2.Inbox.List (
    result => {
        if(result.Error != null) throw result.Error;
        // 取得に成功するとメッセージの一覧が取得できます
        for(int i=0; i<result.Result.Messages.Length; i++) {
            Debug.Log("[" + i + "] " + result.Result.Messages[i].Text + " " + result.Result.Messages[i].IsOpened);
        }
        // 2ページ目以降が存在する場合はページングトークン情報が格納されています
        // すべてのメッセージの取得が完了している場合は null が設定されています
        string nextPageToken = result.Result.NextPageToken;
    },
    session,           // GS2 のログインセッション
    INBOX_NAME,        // GS2-Inbox に作成した受信ボックス名
    10,                // メッセージを受信する最大件数
    null);             // 2ページ目以降を取得する場合にページングトークンを指定します(省略可・省略時は1ページ目を取得)

gs2.Inbox.List() で受信ボックスに溜まっているメッセージの一覧を取得します。

受信ボックスの内容はランダムアクセスすることは出来ず、シーケンシャルアクセスしか出来ません。

もし、取得件数として指定した件数より多くのメッセージが存在する場合は NextPageToken というパラメータが返りますので、

そのトークンを指定して再度リクエストすることで、続きの一覧を取得することが出来ます。

実装サンプル

public class GameLogic : MonoBehaviour {

    private const string CLIENT_ID = "your client id";
    private const string CLIENT_SECRET = "your client secret";

    private const string INBOX_NAME = "inbox-0001";

    Gs2.Client gs2;
    Gs2.GameSession session;

    void Start () {
        // GS2 Client を初期化
        gs2 = new Gs2.Client (new Gs2.Profile ()
            .WithClientId (CLIENT_ID)
            .WithClientSecret (CLIENT_SECRET));

        StartCoroutine (Login ());
    }

    IEnumerator Login() {
        // GS2-Account を利用して認証します
        string GAME_NAME = "game-0001";
        string KEY_NAME = "account";
        string USER_ID = "user";
        string PASSWORD = "password";
        string authenticationToken = null;
        yield return gs2.Account.Authentication (
            result => {
                if(result.Error != null) throw result.Error;
                authenticationToken = result.Result;
            },
            GAME_NAME,
            KEY_NAME,
            USER_ID,
            PASSWORD);

        // GS2-Account の認証情報を利用して GS2 にログインします
        yield return gs2.Auth.Login (
            result => {
                if(result.Error != null) throw result.Error;
                session = result.Result;
            },
            USER_ID,
            KEY_NAME,
            authenticationToken);

        StartCoroutine (ListMessage ());
    }

    IEnumerator ListMessage() {
        // 受信ボックスに溜まっているメッセージの一覧を取得します
        yield return gs2.Inbox.List (
            result => {
                if(result.Error != null) throw result.Error;
                // 取得に成功するとメッセージの一覧が取得できます
                for(int i=0; i<result.Result.Messages.Length; i++) {
                    Debug.Log("[" + i + "] " + result.Result.Messages[i].Text + " " + result.Result.Messages[i].IsOpened);
                }
                // 2ページ目以降が存在する場合はページングトークン情報が格納されています
                // すべてのメッセージの取得が完了している場合は null が設定されています
                string nextPageToken = result.Result.NextPageToken;
            },
            session,           // GS2 のログインセッション
            INBOX_NAME,        // GS2-Inbox に作成した受信ボックス名
            10,                // メッセージを受信する最大件数
            null);             // 2ページ目以降を取得する場合にページングトークンを指定します(省略可・省略時は1ページ目を取得)
    }

    void Update () {

    }
}

メッセージを開封

gs2.Inbox.Read (
    result => {
        if(result.Error != null) throw result.Error;
        // 開封に成功した場合
        Debug.Log("メッセージを既読状態にしました");
    },
    session,           // GS2 のログインセッション
    INBOX_NAME,        // GS2-Inbox に作成した受信ボックス名
    message);          // 開封するメッセージ

gs2.Inbox.Read() でメッセージを開封します。

マネージメントコンソールで開封通知を有効にしている場合は、ここで 連携用URL が呼び出されます。

連携用URL の呼び出しに失敗すると開封に失敗し、result.Error に失敗された内容が通知されます。

実装サンプル

public class GameLogic : MonoBehaviour {

    private const string CLIENT_ID = "your client id";
    private const string CLIENT_SECRET = "your client secret";

    private const string INBOX_NAME = "inbox-0001";

    Gs2.Client gs2;
    Gs2.GameSession session;

    void Start () {
        // GS2 Client を初期化
        gs2 = new Gs2.Client (new Gs2.Profile ()
            .WithClientId (CLIENT_ID)
            .WithClientSecret (CLIENT_SECRET));

        StartCoroutine (Login ());
    }

    IEnumerator Login() {
        // GS2-Account を利用して認証します
        string GAME_NAME = "game-0001";
        string KEY_NAME = "account";
        string USER_ID = "user";
        string PASSWORD = "password";
        string authenticationToken = null;
        yield return gs2.Account.Authentication (
            result => {
                if(result.Error != null) throw result.Error;
                authenticationToken = result.Result;
            },
            GAME_NAME,
            KEY_NAME,
            USER_ID,
            PASSWORD);

        // GS2-Account の認証情報を利用して GS2 にログインします
        yield return gs2.Auth.Login (
            result => {
                if(result.Error != null) throw result.Error;
                session = result.Result;
            },
            USER_ID,
            KEY_NAME,
            authenticationToken);

        StartCoroutine (ListMessage ());
    }

    IEnumerator ListMessage() {
        // 受信ボックスに溜まっているメッセージの一覧を取得します
        Gs2.Inbox.Message message = null;
        yield return gs2.Inbox.List (
            result => {
                if(result.Error != null) throw result.Error;
                message = result.Result.Messages[0];
            },
            session,
            INBOX_NAME,
            10);

        StartCoroutine (ReadMessage (message));
    }

    IEnumerator ReadMessage(Gs2.Inbox.Message message) {
        // メッセージを開封します
        yield return gs2.Inbox.Read (
            result => {
                if(result.Error != null) throw result.Error;
                // 開封に成功した場合
                Debug.Log("メッセージを既読状態にしました");
            },
            session,           // GS2 のログインセッション
            INBOX_NAME,        // GS2-Inbox に作成した受信ボックス名
            message);          // 開封するメッセージ
    }

    void Update () {

    }
}

メッセージを削除

gs2.Inbox.Delete (
    result => {
        if(result.Error != null) throw result.Error;
        // 削除に成功した場合
        Debug.Log("メッセージを削除しました");
    },
    session,        // GS2 のログインセッション
    INBOX_NAME,        // GS2-Inbox に作成した受信ボックス名
    message);        // 削除するメッセージ

gs2.Inbox.Delete() でメッセージを削除できます。

未開封のメッセージも引数に指定すれば削除できます。

都合がわるい場合は、ゲームの実装側でそのような呼び出しができないよう工夫する必要があります。

public class GameLogic : MonoBehaviour {

    private const string CLIENT_ID = "your client id";
    private const string CLIENT_SECRET = "your client secret";

    private const string INBOX_NAME = "inbox-0001";

    Gs2.Client gs2;
    Gs2.GameSession session;

    void Start () {
        // GS2 Client を初期化
        gs2 = new Gs2.Client (new Gs2.Profile ()
            .WithClientId (CLIENT_ID)
            .WithClientSecret (CLIENT_SECRET));

        StartCoroutine (Login ());
    }

    IEnumerator Login() {
        // GS2-Account を利用して認証します
        string GAME_NAME = "game-0001";
        string KEY_NAME = "account";
        string USER_ID = "user";
        string PASSWORD = "password";
        string authenticationToken = null;
        yield return gs2.Account.Authentication (
            result => {
                if(result.Error != null) throw result.Error;
                authenticationToken = result.Result;
            },
            GAME_NAME,
            KEY_NAME,
            USER_ID,
            PASSWORD);

        // GS2-Account の認証情報を利用して GS2 にログインします
        yield return gs2.Auth.Login (
            result => {
                if(result.Error != null) throw result.Error;
                session = result.Result;
            },
            USER_ID,
            KEY_NAME,
            authenticationToken);

        StartCoroutine (ListMessage ());
    }

    IEnumerator ListMessage() {
        // 受信ボックスに溜まっているメッセージの一覧を取得します
        Gs2.Inbox.Message message = null;
        yield return gs2.Inbox.List (
            result => {
                if(result.Error != null) throw result.Error;
                message = result.Result.Messages[0];
            },
            session,
            INBOX_NAME,
            10);

        StartCoroutine (DeleteMessage (message));
    }

    IEnumerator DeleteMessage(Gs2.Inbox.Message message) {
        // メッセージを削除します
        yield return gs2.Inbox.Delete (
            result => {
                if(result.Error != null) throw result.Error;
                // 削除に成功した場合
                Debug.Log("メッセージを削除しました");
            },
            session,        // GS2 のログインセッション
            INBOX_NAME,        // GS2-Inbox に作成した受信ボックス名
            message);        // 削除するメッセージ
    }

    void Update () {

    }
}