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

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

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

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

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

まだ行っていない場合は、Google Play Games サービスを設定するの手順に沿って操作します。

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

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

3. PlayGamesService 用のサーバーサイド Java ライブラリをダウンロードする

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

4. 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 をセットアップし、com.google.android.gms:play-services-games-v2:19.0.0 が含まれていることを確認します。

gradle ファイルで com.google.android.gms:play-services-tasks:18.0.2 以上に設定します。

正しい情報を使用して Google のサーバーと通信するには、クライアント SDK からリコール セッション 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
    });

Unity SDK

まだ実施していない場合は、クライアント内に Unity SDK をセットアップします。

正しい情報を使用して Google のサーバーと通信するには、クライアント SDK からリコール セッション ID をリクエストし、それをゲームのサーバーに送信する必要があります。

PlayGamesPlatform.Instance.RequestRecallAccess(
    recallAccess => {
        string recallSessionId = recallAccess.sessionId;
        // Send the recallSessionId to your game server
    });

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

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

トークンを保存する

Google Play Games Recall API のプレーヤー アカウントは、次の 2 つの情報で構成されます。

  • ゲーム内アカウントの安定した識別子として機能するペルソナ
  • プレーヤーをアカウントに安全にログインさせるためのキーとして機能するトークン

ユーザーのペルソナとトークンは、LinkPersonaRequest オブジェクトを使用して保存できます。Google API を呼び出すには、GoogleCredential を使用します(コンテキストについては、Google API の呼び出しをご覧ください)。ペルソナには 1 対 1 のカーディナリティ制約があります。つまり、1 つの PGS プロファイルには 1 つのペルソナしか含めることができず、ペルソナは 1 つの PGS プロファイルにしか存在できません。競合するリンクの解決ポリシーを設定して、1 対 1 のカーディナリティ制約の違反を解決する方法を定義します。

必要に応じて、トークンの有効期限を設定します。SetTtl()Durations オブジェクトを使用して、有効期間を設定するか、setExpireTime() で正確な有効期限を指定します。

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

import com.google.api.services.games.Games.Recall.LinkPersona;
import com.google.api.services.games.model.LinkPersonaRequest;
import com.google.api.services.games.model.LinkPersonaResponse;
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
}

トークンを取得する

ゲームのニーズに応じて、トークンを取得する方法は 3 つあります。次のことをリクエストできます。

  • 現在のゲームに関連付けられたトークン(ゲーム スコープの呼び出しトークンなど)。
  • デベロッパー アカウントが所有するすべてのゲームで保存された最後のトークン。
  • デベロッパー アカウントが所有するゲームのリストと、各ゲームに関連付けられているすべてのリコール トークン。

ゲームスコープの再現トークン

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

import com.google.api.services.games.Games;
import com.google.api.services.games.model.RetrievePlayerTokensResponse;
import com.google.api.services.games.model.RecallToken;

// ...

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
}

デベロッパー アカウントが所有するすべてのゲームの最新のリコール トークン

Google Play Console のデベロッパー アカウントが所有するすべてのゲームに保存されている最新のトークンを取得するには、次のコード スニペットに示すように、クライアントから recallSessionId を取得して lastTokenFromAllDeveloperGames API に渡す必要があります。レスポンスの一部として、このトークンに関連付けられているアプリケーション ID を確認できます。

import com.google.api.services.games.Games;
import com.google.api.services.games.model.RetrieveDeveloperGamesLastPlayerTokenResponse;
import com.google.api.services.games.model.GamePlayerToken;
import com.google.api.services.games.model.RecallToken;

// ...

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

RetrieveDeveloperGamesLastPlayerTokenResponse response =
        gamesApi.recall().lastTokenFromAllDeveloperGames(recallSessionId)
        .execute();

if (response.hasGamePlayerToken()) {
    GamePlayerToken gamePlayerToken = response.getGamePlayerToken();

    // The ID of the application that the token is associated with.
    String applicationId = gamePlayerToken.getApplicationId();

    // Same string as was written in LinkPersona call.
    RecallToken recallToken = gamePlayerToken.getRecallToken();

    // Decrypt and recover in-game account.
}

デベロッパー アカウントが所有するゲームのリスト全体で、すべての呼び出しトークン

Google Play Console のデベロッパー アカウントが所有するゲームのリストに関連付けられているすべてのトークンを取得するには、クライアントから recallSessionId を取得して gamesPlayerTokens API に渡します。アプリケーション ID のリストを指定します。

import com.google.api.services.games.Games;
import com.google.api.services.games.model.RetrieveGamesPlayerTokensResponse;
import com.google.api.services.games.model.GamePlayerToken;
import com.google.api.services.games.model.RecallToken;

// ...

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

// Application IDs for which you would like to retrieve the recall tokens.
List<String> applicationIds = ...

RetrieveGamesPlayerTokensResponse response =
gamesApiClient
        .recall()
        .gamesPlayerTokens(recallSessionId)
        .setApplicationIds(applicationIds)
        .execute();

for (GamePlayerToken gamePlayerToken : response.getGamePlayerTokens()) {
    // The ID of the application that the token is associated with.
    String applicationId  = gamePlayerToken.getApplicationId();

    // Same string as was written in LinkPersona call.
    RecallToken recallToken = gamePlayerToken.getRecallToken();

    // Decrypt and recover in-game account.
}

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

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

import com.google.api.services.games.Games;
import com.google.api.services.games.model.UnlinkPersonaRequest;
import com.google.api.services.games.model.UnlinkPersonaResponse;

// ...

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();

boolean unlinked = unlinkPersonaResponse.isUnlinked();

プロファイルなしモードを有効にする

PGS プロファイルがないユーザーに対して制限付きの Recall API 機能を有効にするには、次の手順を行います。

  1. Play Developer Console で、PGS ゲーム プロジェクトのプロファイルなしリコールを有効にします。[ストレージをオンにする] というラベルの付いたオプションを選択します。
  2. このセクションで後述する追加の条件を確認します。
  3. アプリ マニフェストに次のメタデータタグを追加します。
<meta-data
  android:name="com.google.android.gms.games.PROFILELESS_RECALL_ENABLED"
  android:value="true" />

追加規約

Play ゲームサービス利用規約に加えて、PGS プロファイルのないユーザー向けに Recall API を使用して、エンドユーザーが Play ゲームサービス プロファイルを持っていなくても、エンドユーザーのデータを Google と共有できるようにする場合、そのようなデータを Google と共有する前に、エンドユーザーに次の内容を説明する適切な通知を提供することに同意するものとします。

  1. Google Play ゲームのアカウント リンク機能を有効にするために、Google とデータを共有すること。
  2. Play ゲームの設定など、共有を管理するための設定の利用可能性。
  3. Google のプライバシー ポリシーに基づく当該データの処理、および適用されるすべての法的要件を満たす当該共有について適切なエンドユーザーの同意を得ること。