Intégrer l'API Recall des services de jeux Play (Play Games Services ou PGS) à votre jeu

Cette page explique comment implémenter l'API Recall dans votre jeu. Elle présente d'abord comment configurer votre serveur et votre client de jeu pour qu'ils prennent en charge l'API, puis comment stocker et récupérer des jetons.

Configuration du serveur de jeu

Configurez votre serveur de jeu pour effectuer des appels de l'API Recall auprès des serveurs Google.

1. Configurer votre projet lié aux services de jeux Play

(Si ce n'est pas déjà fait) Suivez les instructions de la section Configurer les services de jeux Google Play.

2. Configurer un compte de service pour le jeu

Suivez les instructions pour créer un compte de service. À la fin, vous devriez obtenir un fichier JSON contenant les identifiants du compte de service.

3. Télécharger la bibliothèque Java côté serveur pour PlayGamesServices

Téléchargez la dernière bibliothèque google-api-services-games et importez-la dans votre serveur.

4. Préparer les identifiants pour les appels de l'API Recall

Pour en savoir plus, consultez la section Préparer un appel d'API autorisé.

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

Configuration du client de jeu

Configurez votre client de jeu de sorte qu'il récupère les ID de session de rappel utilisés par votre serveur pour communiquer avec les serveurs Google.

SDK Java

Configurez le SDK Java dans votre client et veillez à inclure com.google.android.gms:play-services-games-v2:19.0.0 et com.google.android.gms:play-services-tasks:18.0.2 ou une version ultérieure dans votre fichier Gradle.

Pour communiquer avec les serveurs de Google avec les informations correctes, vous devez demander un ID de session de rappel au SDK client, que vous envoyez au serveur de votre jeu.

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

SDK Unity

Si ce n'est pas déjà fait, configurez le SDK Unity dans votre client.

Pour communiquer avec les serveurs de Google avec les informations correctes, vous devez demander un ID de session de rappel au SDK client, puis l'envoyer au serveur de votre jeu.

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

Utiliser l'API Recall dans votre serveur de jeu

Après avoir configuré votre serveur et votre client, vous pouvez envoyer le recallSessionID de votre client de jeu à votre serveur de jeu, puis suivre les instructions ci-dessous pour commencer à utiliser l'API Java pour stocker, récupérer ou supprimer les jetons de rappel côté serveur.

Stocker des jetons

Le persona et le jeton de jeu des utilisateurs peuvent être stockés à l'aide de l'objet LinkPersonaRequest. Vous devez utiliser GoogleCredential pour appeler des Google APIs (consultez Appeler des APIs Google pour plus de contexte). Notez que, conformément à la Contrainte de cardinalité individuelle, vous ne pouvez associer qu'un seul persona à un profil PGS à la fois (et vice-versa). Vous devez définir la règle de résolution au cas où ce profil PGS a déjà été associé à un autre persona.

Vous pouvez éventuellement choisir de définir une valeur de durée de vie pour le jeton, qui déclare sa durée de validité à l'aide d'un objet Durations. Vous pouvez choisir de définir cela à l'aide de SetTtl() (comme indiqué ci-dessous), qui définit la date d'expiration à partir de la durée spécifiée dans la méthode, ou de setExpireTime(), qui vous permet de définir une valeur exacte pour l'expiration des jetons.

Vous devez chiffrer le persona et le jeton de jeu, et ils ne peuvent pas contenir d'informations permettant d'identifier personnellement l'utilisateur. Les chaînes de personas et de jetons peuvent comporter jusqu'à 256 caractères, et 20 jetons ou personas au maximum peuvent être stockés par joueur et par jeu.

Un seul jeton par persona et par joueur peut être stocké à la fois. Si vous essayez de stocker un autre jeton avec le même persona, le jeton d'origine est écrasé.

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
}

Récupérer des jetons

Vous avez le choix entre trois options pour récupérer un jeton, en fonction des besoins de vos jeux. Vous pouvez demander les éléments suivants:

  • Les jetons associés au jeu en cours, y compris les jetons de rappel de portée jeu.
  • Dernier jeton stocké dans tous les jeux appartenant au compte de développeur.
  • Compte tenu d'une liste de jeux appartenant au compte de développeur, tous les jetons de rappel associés à chaque jeu.

Jetons de rappel de portée jeu

Pour récupérer les jetons de rappel du jeu en cours, obtenez le recallSessionId auprès du client et transmettez-le à l'API retrieveTokens:

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
}

Dernier jeton de rappel pour tous les jeux appartenant au compte de développeur

Pour récupérer le jeton le plus récent stocké dans tous les jeux appartenant au compte de développeur dans la Google Play Console, vous devez obtenir le recallSessionId auprès du client et le transmettre à l'API lastTokenFromAllDeveloperGames, comme indiqué dans l'extrait de code suivant. Dans la réponse, vous pouvez inspecter l'ID d'application associé à ce jeton.

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.
}

Tous les jetons de rappel d'une liste donnée de jeux appartenant au compte de développeur

Pour récupérer tous les jetons associés à une liste de jeux appartenant à votre compte de développeur dans la Google Play Console, récupérez le recallSessionId auprès du client et transmettez-le à l'API gamesPlayerTokens. Fournissez une liste d'ID d'application.

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.
}

Supprimer le jeton de rappel

Si nécessaire, vous pouvez également supprimer le jeton de rappel à l'aide de l'appel suivant :

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

Activer le mode sans profil

Pour activer une fonctionnalité limitée de l'API Recall pour les utilisateurs qui ne disposent pas de profils de services Play Jeux, procédez comme suit:

  1. Activez le rappel sans profil pour votre projet de jeu PGS dans la Play Developer Console. Sélectionnez l&#39;option &quot;Activer le stockage&quot;.
  2. Consultez les termes supplémentaires décrits plus loin dans cette section.
  3. Ajoutez la balise de métadonnées suivante dans votre fichier manifeste d'application:
<meta-data
  android:name="com.google.android.gms.games.PROFILELESS_RECALL_ENABLED"
  android:value="true" />

Conditions supplémentaires

En plus d'être soumis aux Conditions d'utilisation des services de jeux Play, vous acceptez que si vous utilisez l'API Recall pour les utilisateurs sans profil PGS, ce qui permet de partager les données de l'utilisateur final avec Google sans qu'il dispose d'un profil de services de jeux Play, vous devez, avant de partager ces données avec Google, fournir à l'utilisateur final un avis approprié décrivant les éléments suivants:

  1. Le partage des données avec Google pour activer la fonctionnalité d'association de comptes Play Jeux
  2. Disponibilité de paramètres permettant de gérer ce partage, par exemple via les paramètres de Play Jeux.
  3. Le traitement de ces données conformément à la Politique de confidentialité de Google et l'obtention du consentement approprié des utilisateurs finaux pour ce partage, qui doit respecter toutes les exigences légales applicables.