このページでは、ゲーム内に 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 をセットアップし、Gradle ファイルに com.google.android.gms:play-services-games-v2:19.0.0
と 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 を使用して、サーバーサイドでリコール トークンを保存、取得、削除できます。
トークンを保存する
ユーザーのペルソナとゲームトークンは、LinkPersonaRequest
オブジェクトを使用して保存できます。Google API を呼び出すには、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.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
}
トークンを取得する
トークンを取得するには、ゲームのテスト内容に応じて必要があります。Google Chat では 以下をリクエストします。
- 現在のゲームに関連付けられているトークン(ゲームスコープのリコール トークンを含む)。
- デベロッパー アカウントが所有するすべてのゲームで最後に保存されたトークン。
- デベロッパー アカウントが所有するゲームのリストでは、すべてのリコール トークンが 関連付けられています
ゲームスコープのリコール トークン
現在のゲームからリコール トークンを取得するには、
クライアントからの 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
}
デベロッパー アカウントが所有するすべてのゲームにおける最新のリコール トークン
デベロッパーが所有するすべてのゲームに保存されている最新のトークンを取得する
使用するには、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();
プロファイルレス モードを有効にする
制限付き Recall API 機能を有効にできます。 PGS プロファイルのないユーザーについては、次の手順に沿って対応してください。
- Play デベロッパーで PGS ゲーム プロジェクトのプロファイルなしのリコールを有効にする
できます。
- このセクションで後述する追加規約をご確認ください。
- アプリに次のメタデータタグを追加します。 manifest:
<meta-data
android:name="com.google.android.gms.games.PROFILELESS_RECALL_ENABLED"
android:value="true" />
追加規約
また、Google Play Games サービス利用規約 本サービスでは、 PGS プロフィールのないユーザーには Recall API を使用します。これにより、 エンドユーザーが Play Games サービス プロフィールを作成していない状態で Google に保存されること。 かかるデータを Google と共有する前に、エンドユーザーに 1)以下を有効にするために Google とのデータ共有について、 Play Gamesアカウントのリンク機能、2)管理できる設定の提供状況 Google Play Games の設定などを通じた共有、3) Google プライバシー ポリシー ポリシーを確認し、適切なエンドユーザー 適用されるすべての法的要件を満たすことへの同意。