משלבים את PGS Recall API במשחק

בדף הזה מוסבר איך להטמיע את Recall API ב במשחק שלך. קודם כל צריך להגדיר את שרת המשחק ואת הלקוח כדי לתמוך API, ואז נלמד איך לאחסן ולאחזר אסימונים.

הגדרה של שרת משחקים

צריך להגדיר את שרת המשחקים כדי לבצע קריאות ל-Recall API לשרתים של Google.

1. הגדרת פרויקט ב-Play Games Services

(אם עדיין לא ביצעת את הפעולה הזו) פועלים לפי ההוראות בהגדרת Google Play. שירותי משחקים.

2. הגדרה של חשבון שירות למשחק

מבצעים את ההוראות ליצירת שירות. חשבון. בסוף צריך להיות קובץ JSON עם פרטי כניסה של חשבון שירות.

3. הורדת ספריית Java בצד השרת עבור PlayGamesServices

מורידים את הגרסה האחרונה של 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.

ערכת Java SDK

להגדיר את Java SDK בתוך הלקוח, וכן חשוב לכלול את הטקסט com.google.android.gms:play-services-games-v2:19.0.0 ו-com.google.android.gms:play-services-tasks:18.0.2 או יותר ב- GRidle.

כדי לתקשר עם השרתים של Google עם המידע הנכון, צריך לבקש מזהה סשן ריקול מה-SDK של הלקוח, שנשלח אל ה-SDK של המשחק השרת.

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

אם עדיין לא עשית את זה, יש להגדיר את Unity SDK בתוך הלקוח.

כדי לתקשר עם השרתים של Google עם המידע הנכון, צריך לבקש מזהה סשן ריקול מה-SDK של הלקוח ולשלוח אותו השרת.

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

שימוש ב-Recall API בשרת המשחק

אחרי הגדרת השרת והלקוח, אפשר לשלוח את recallSessionID מלקוח המשחק לשרת המשחק, ופועלים לפי ההנחיות שבהמשך כדי להתחיל באמצעות Java API כדי לאחסן, לאחזר או למחוק את אסימוני Recall בצד השרת.

אסימוני אחסון

משתמשים אפשר לשמור פרסונה ואסימון משחק באמצעות LinkPersonaRequest לאובייקט. עליך להשתמש ב-GoogleCredential כדי לקרוא ל-Google APIs (ראו שיחות) Google ממשקי API לקבלת הקשר). שימו לב שלפי העוצמה (cardinality) 1:1 אילוץ, אפשר לקשר רק פרסונה אחת. לפרופיל PGS אחד בכל פעם (ולהיפך).עליך להגדיר את הרזולוציה המדיניות במקרה שפרופיל PGS הזה כבר קושר לפרסונה אחרת.

אפשר גם להגדיר TTL באסימון, שמציין כמה זמן האסימון חוקי באמצעות משכי זמן לאובייקט. אפשר להגדיר את האפשרות הזו באמצעות SetTtl() (כפי שמוצג בהמשך), שמגדיר את תאריך התפוגה מתוך משך הזמן שצוין בשיטה, או setExpireTime(), שמאפשר להגדיר את הזמן המדויק שבו פג התוקף של האסימונים.

עליך להצפין את הפרסונה ואת אסימון המשחק, והם לא יכולים להכיל מידע אישי פרטים מזהים (PII). מחרוזות פרסונה ואסימון יכולות להיות עד 256 באורך של תווים, ויכולות להיות לכל היותר 20 אסימונים או פרסונות לכל היותר שחקן לכל משחק.

ניתן לאחסן אסימון אחד בלבד לכל פרסונה לכל שחקן ברגע נתון. מתבצע ניסיון אחסון של אסימון אחר עם אותה פרסונה מחליף את האסימון המקורי.

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
}

אחזור אסימונים

יש שלוש אפשרויות לאחזור אסימון, בהתאם למשחקים שלך לצרכים שלכם. אפשר לבקש את הפרטים הבאים:

  • האסימונים שמשויכים למשחק הנוכחי, כולל אסימוני זיכרון ברמת המשחק.
  • האסימון האחרון שמאוחסן בכל המשחקים שבבעלות חשבון הפיתוח.
  • כשיש רשימה של משחקים בבעלות חשבון הפיתוח, כל אסימוני Recall הקיימים שמשויכים לכל משחק.

אסימוני Recall ברמת המשחק

כדי לאחזר את אסימוני Recall מהמשחק הנוכחי, צריך לקבל את ה recallSessionId מהלקוח ומעבירים אותו ל-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
}

אסימון הריקול האחרון בכל המשחקים שבבעלות חשבון הפיתוח

כדי לאחזר את האסימון העדכני ביותר שמאוחסן בכל המשחקים שבבעלות המפתח ב-Google Play Console, עליך לקבל את recallSessionId מהלקוח ולהעביר אותו ל-API של lastTokenFromAllDeveloperGames, כמו שמוצגת בקטע הקוד הבא. כחלק מהתשובה, ניתן לבדוק מזהה האפליקציה שמשויך אליו באמצעות האסימון הזה.

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

כל אסימוני Recall ברשימה נתונה של משחקים שבבעלות חשבון הפיתוח

כדי לאחזר את כל האסימונים המשויכים לרשימת משחקים שבבעלותם חשבון הפיתוח שלך ב-Google Play Console צריך לקבל recallSessionId מהלקוח ולהעביר אותו ל-API של gamesPlayerTokens. ספק הרשימה של מזהי האפליקציות.

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. עבור משתמשים שאין להם פרופיל Play Games Services:

  1. הפעלת ריקול ללא פרופיל לפרויקט המשחק שלך ב-Play Games Services ב-Play Developer מסוף. בוחרים באפשרות &#39;הפעלה&#39;.
אחסון&quot;.
  2. אפשר לעיין בתנאים הנוספים שמתוארים בהמשך הקטע הזה.
  3. הוספת תג המטא-נתונים הבא לאפליקציה מניפסט:
<meta-data
  android:name="com.google.android.gms.games.PROFILELESS_RECALL_ENABLED"
  android:value="true" />

תנאים נוספים

בנוסף לציות לתנאים של Play Games Services: שירות, את/ה מסכים/ה לכך השתמשת ב-Recall API למשתמשים ללא פרופיל PGS, מה שמאפשר שיתוף בנתונים של משתמש הקצה ב-Google בלי שיהיה לו פרופיל ב-Play Games Services, לפני שתשתף נתונים כאלה עם Google, עליך לספק למשתמש הקצה הודעה הולמת שמתארת 1) שיתוף הנתונים שלך עם Google כדי לאפשר Play Games תכונת קישור החשבונות, 2) זמינות ההגדרות לניהול כמו שיתוף, למשל דרך ההגדרות של Play Games, וגם 3) עיבוד של במסגרת מדיניות מדיניות הפרטיות של Google מדיניות, ומשיגים משתמשי קצה מתאימים לקבל הסכמה לשיתוף כזה שעומד בכל הדרישות המשפטיות הרלוונטיות.