PGS Recall API をゲームに統合する

このページでは、ゲーム内に Recall API を実装する方法について説明します。まず、API をサポートするゲームサーバーとクライアントのセットアップについて説明し、次にトークンの保存と取得の方法について説明します。

ゲームサーバーのセットアップ

Google サーバーに対して Recall API 呼び出しを行うようにゲームサーバーをセットアップします。

Play Games サービス プロジェクトをセットアップする

(まだ実施していない場合)Google Play Games サービスを設定する手順に沿って操作します。

ゲームのサービス アカウントをセットアップする

サービス アカウントの作成の手順に沿って操作します。最後に、サービス アカウントの認証情報を含む JSON ファイルを作成する必要があります。

Play Games サービス用のサーバーサイド Java ライブラリをダウンロードする

最新の google-api-services-games ライブラリをダウンロードして、サーバーにアップロードします。

Recall API 呼び出し用の認証情報を準備する

詳しくは、委任 API 呼び出しの準備をご覧ください。

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.games.Games;
import com.google.api.services.games.GamesScopes;

// ...

GoogleCredential credential =
  GoogleCredential.fromStream(new FileInputStream("<credentials>.json"))
    .createScoped(Collections.singleton(GamesScopes.ANDROIDPUBLISHER));

Games gamesApi =
    new Games.Builder(httpTransport, JSON_FACTORY, credential).build();

ゲーム クライアントのセットアップ

サーバーが Google サーバーと通信するために使用するリコール セッション ID を取得するようにゲーム クライアントを設定します。

Java SDK

クライアント内に Java SDK をセットアップし、Gradle ファイルに com.google.android.gms:play-services-games-v2:19.0.0com.google.android.gms:play-services-tasks:18.0.2 以上が含まれていることを確認します。

正しい情報を使用して Google のサーバーと通信するには、クライアント SDK から再現セッション ID をリクエストします。この ID をゲームのサーバーに送信します。

Kotlin

PlayGames.getRecallClient(getActivity())
  .requestRecallAccess()
  .addOnSuccessListener { recallAccess -> val recallSessionId: String = recallAccess.getSessionId() }
  // Send the recallSessionId to your game server

Java

PlayGames.getRecallClient(getActivity())
  .requestRecallAccess()
  .addOnSuccessListener(
    recallAccess -> {
      String recallSessionId = recallAccess.getSessionId();
      // Send the recallSessionId to your game server
  });

ゲームサーバー内で Recall API を使用する

サーバーとクライアントを構成すると、recallSessionID をゲーム クライアントからゲームサーバーに送信し、以下のガイダンスに沿って Java API を使用して、サーバーサイドでリコール トークンを保存、取得、削除できます。

トークンを保存する

LinkPersonaRequest オブジェクトを使用して、ユーザーのペルソナとゲームトークンを保存します。GoogleCredential を使用して Google API を呼び出します1 対 1 のカーディナリティ制約に従うには、一度に 1 つのペルソナを 1 つの PGS プロファイルにのみリンクできます。その逆も同様です。この PGS プロファイルがすでに別のペルソナにリンクされている場合に備え、解決ポリシーを設定します。

必要に応じて、トークンに TTL を設定することもできます。これは、Durations オブジェクトを使用してトークンの有効期間を宣言するものです。メソッドに指定された期間から有効期限を設定する SetTtl() を使用して、この値を設定することもできます。または、setExpireTime() を使用すると、トークンの有効期限が切れる正確な時刻を設定できます。

ペルソナとゲームトークンは暗号化する必要があります。個人を特定できる情報を含めることはできません。ペルソナとトークンの文字列は最大 256 文字で、各ゲームのプレーヤーごとに最大 20 個のトークンまたはペルソナを保存できます。

各プレーヤーのペルソナごとに、所定の時間に 1 つのトークンのみを保存できます。同じペルソナを持つ別のトークンを保存しようとすると、元のトークンは上書きされます。

import com.google.api.services.games.Games.Recall.LinkPersona;
import com.google.protobuf.util.Durations;

// ...

Games gamesApi =
    new Games.Builder(httpTransport, JSON_FACTORY, credential).build();

String recallSessionId = ... // recallSessionID from game client
String persona = ... // encrypted opaque string, stable for in-game account
String token = ... // encrypted opaque string encoding the progress line

LinkPersonaRequest linkPersonaRequest =
  LinkPersonaRequest.newBuilder()
    .setSessionId(recallSessionId)
    .setPersona(persona)
    .setToken(token)
    .setCardinalityConstraint(ONE_PERSONA_TO_ONE_PLAYER)
    .setConflictingLinksResolutionPolicy(CREATE_NEW_LINK)
    .setTtl(Durations.fromDays(7)) // Optionally set TTL for token
    .build();

LinkPersonaResponse linkPersonaResponse =
  gamesApi.recall().linkPersona(linkPersonaRequest).execute();

if (linkPersonaResponse.getState() == LINK_CREATED) {
  // success
}

トークンを取得する

リコール トークンを取得するには、クライアントから recallSessionId を取得して、retrieveTokens API に渡します。

import com.google.api.services.games.Games.Recall.RetrieveTokens;

// ...

String recallSessionId = ... // recallSessionID from game client

RetrievePlayerTokensResponse retrievePlayerTokensResponse =
  gamesApi.recall().retrieveTokens(recallSessionId).execute();

for (RecallToken recallToken : retrievePlayerTokensResponse.getTokens()) {
  String token recallToken.getToken();
  // Same string as was written in LinkPersona call
  // decrypt and recover in-game account
}

リコール トークンを削除する

必要に応じて、次の呼び出しでリコール トークンを削除することもできます。

import com.google.api.services.games.Games.Recall.UnlinkPersona;

// ...

String recallSessionId = ...
String persona = ...
String token = ...

Games gamesApi =
    new Games.Builder(httpTransport, JSON_FACTORY, credential).build();

UnlinkPersonaRequest unlinkPersonaRequest =
  UnlinkPersonaRequest.newBuilder()
    .setSessionId(recallSessionId)
    .setPersona(persona)
    // .setToken(token) - alternatively set token, but not both
    .build();

UnlinkPersonaResponse unlinkPersonaResponse =
  gamesApi.recall().unlinkPersona(unlinkPersonaRequest).execute();

// Confirm that the unlinking process completed successfully.
boolean unlinked = unlinkPersonaResponse.isUnlinked();