GS2 Blog

Game Server Services(https://gs2.io/) の最新情報をお届けします

【新サービス提供開始】チャットとゲーム内プッシュ通知

みなさんこんにちは。GS2 CEOの丹羽です。

先日概要をお伝えしていた GS2-Chat / GS2-InGamePushNotification のサービス提供を開始しました。
GS2-SDK for Unity も同時にリリースしており、今すぐ Unity からサービスをご利用いただけます。

GS2-InGamePushNotification の使用例

通知サーバに接続するためにクライアント証明書を取得する必要があります。
GS2-Auth で認証をした GS2セッション と、通知サーバの識別子である GS2-InGamePushNotificationゲーム名 を指定して取得します。

yield return gs2.InGamePushNotification.CreateCertificate(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
        else
        {
            Certificate certificate = r.Result;
        }
    },
    Session, // GS2セッション
    GameName // GS2-InGamePushNotification ゲーム名
    );

次に通知サーバに接続し、通知を受け取るための通知セッションを作成します。

yield return gs2.InGamePushNotification.CreateSession(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
        InGamePushNotificationSession session = r.Result;
        session.OnConnect += () =>
        {
            // 通知サーバに接続に成功した場合に呼び出されます。
        };
        session.OnReceive += (subject, body) =>
        {
            // 通知を受信したときに呼び出されます。
        };
        session.OnClose += () =>
        {
            // 何らかの理由により通知サーバから切断された場合に呼び出されます。
        };
    },
    Session, // GS2セッション
    GameName, // GS2-InGamePushNotification ゲーム名
    certificate  // クライアント証明書
    );

あとは通知セッションにイベントハンドラを登録すれば通知を受けることが出来ます。

session.OnConnect += () =>
{
    // 通知サーバとの接続に成功した場合に呼び出されます。
}

session.OnReceive += (subject, body) =>
{
    // 通知を受け取った場合に呼び出されます。
}

session.OnClose += () =>
{
    // 通知サーバから切断された場合に呼び出されます。
}

イベントハンドラは以下の種類があります。

OnConnect()
通知サーバとのセッションが確立できたときに呼び出されます。
このコールバックが戻るまでは通知を受け取ることが出来ません。

OnReceive(string subject, string body)
通知を受け取ったときに呼び出されます。

OnClose()
何らかの理由でセッションが切断されたときに呼び出されます。
再接続するなど、必要な処理を実装してください。

通知の送信は GS2-Matchmaking / GS2-Chat といったGS2のサービスから出せるのは当然として、
サーバサイドSDKを使用することで、自分で作成したサーバプログラムから送信することも出来ます。
マネージメントコンソールからGUIを通して通知を送信し、動作確認も行えますのでお気軽にお試しください。

GS2-Chat の使用例

GS2-Chat ではまずルームを作成する必要があります。
しかし、Unity-SDK からはデフォルトで割り当てられたアクセスポリシーではルームを作成する権限を付与していません。
これはルームの作成を無秩序に行われることを望まない開発者がいることを想定しているためです。
ポリシーに権限を割り当てることで、Unityクライアントからルームを作成したり削除する権限を付与することも可能です。

ルームはマネージメントコンソールからGUIを通して作成することも出来ますし、サーバサイドSDKを通して作成することもできます。

作成したルームにメッセージを送信する場合は以下のようなコードになります。

yield return gs2.Chat.Send(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
    },
    Session,    // ゲームセッション
    LobbyName,  // ロビー名
    RoomId,     // ルームID
    "Hello",    // メッセージテキスト
    "meta",     // メッセージメタデータ
    null        // パスワード(ルームにパスワードが設定されている場合に必要)
);

ルームに届いたメッセージを受信する場合は以下です。

yield return gs2.Chat.List(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
        if (r.Result.Count > 0)
        {
            // メッセージの受信処理
            foreach (var message in r.Result)
            {
                Debug.Log("From: " + message.From);
                Debug.Log("Text: " + message.Text);
                Debug.Log("Meta: " + message.Meta);
                Debug.Log("SendDate: " + message.SendDate);    // 最後に受信したメッセージの送信時刻を、次回以降メッセージを取得する際の startAt に指定することでメッセージをストリーム出来ます。 
            }
        }
    },
    Session,    // ゲームセッション
    LobbyName,  // ロビー名
    RoomId,     // ルームID
    10,         // メッセージの取得件数
    startAt     // メッセージの取得開始日時(現在時刻から1時間前まで指定可能)
    );

次に、ルームに新着メッセージが届いたことを知らせて欲しい場合はどうするか?です。
まず、新着メッセージの通知を受けたいルームを購読します。

yield return Gs2.Chat.Subscribe(
    r =>
    {
        if (r.Error != null)
        {
            // 例外が発生
        }
    },
    Session,    // ゲームセッション
    LobbyName,  // ロビーの名前
    RoomId,     // 購読するルームID
    false,      // 通知を送信したときにユーザがオフラインだったときに転送するか
    null        // オフライン転送時のモバイルプッシュ通知転送の通知音に使用するファイル名
);

サーバからの新着メッセージ通知はWebHookまたは、GS2-InGamePushNotification を組み合わせて実現します。
Unity SDK では GS2-InGamePushNotification との連携がインテグレートされています。

Gs2.Chat.OnReceiveMessage += notification =>
{
    Debug.Log("RoolID: " + notification.RoomId);
    Debug.Log("UserId: " + notification.UserId);
    Debug.Log("Message.Text: " + notification.Message.Text);
    Debug.Log("Message.Meta: " + notification.Message.Meta);
};
Gs2.Chat.SetInGamePushNotificationSession(session);

session は GS2-InGamePushNotification の通知サーバとの接続セッションです。
これで、新着メッセージを受信したときにイベントハンドラが呼び出されるようになります。
たったこれだけのコードでスケールし、オフライン時にモバイルプッシュ通知を受けられるチャットシステムをご利用いただけます。
ぜひ、ご検討ください。

それでは、また。

(C) Game Server Services, Inc.