PGS Recall API को अपने गेम में इंटिग्रेट करें

इस पेज पर, आपके गेम में Recall API को लागू करने का तरीका बताया गया है. इसमें सबसे पहले, API के साथ काम करने के लिए, अपने गेम सर्वर और क्लाइंट को सेट अप करने का तरीका बताया गया है. इसके बाद, टोकन सेव करने और उन्हें वापस पाने का तरीका बताया गया है.

गेम सर्वर सेट अप करना

Google के सर्वर पर Recall API कॉल करने के लिए, अपना गेम सर्वर सेट अप करें.

1. Play Games की सेवाओं से जुड़ा प्रोजेक्ट सेट अप करना

अगर आपने अब तक ऐसा नहीं किया है, तो Google Play की गेम सेवाएं सेट अप करना लेख में दिए गए निर्देशों का पालन करें.

2. गेम के लिए सेवा खाता सेट अप करना

सेवा खाता बनाने के लिए, दिए गए निर्देशों का पालन करें. इसके बाद, आपके पास सेवा खाते के क्रेडेंशियल वाली JSON फ़ाइल होनी चाहिए.

3. PlayGamesServices के लिए, सर्वर-साइड Java लाइब्रेरी डाउनलोड करना

google-api-services-games library डाउनलोड करें और इसे अपने सर्वर पर अपलोड करें.

4. Recall 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 सेट अप करें. साथ ही, पक्का करें कि आपने अपनी Gradle फ़ाइल में com.google.android.gms:play-services-games-v2:19.0.0 और com.google.android.gms:play-services-tasks:18.0.2 या इसके बाद के वर्शन शामिल किए हों.

Google के सर्वर से सही जानकारी के साथ कम्यूनिकेट करने के लिए, आपको क्लाइंट 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
    });

Unity SDK

अगर आपने अब तक ऐसा नहीं किया है, तो अपने क्लाइंट में Unity SDK सेट अप करें.

Google के सर्वर से सही जानकारी के साथ कम्यूनिकेट करने के लिए, आपको क्लाइंट SDK से रीकॉल सेशन आईडी का अनुरोध करना होगा. इसके बाद, इसे अपने गेम के सर्वर पर भेजना होगा.

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

v2 Native SDK (बीटा)

अगर आपने अब तक ऐसा नहीं किया है, तो C और C++ के लिए Play की गेम सेवाओं का इस्तेमाल करना शुरू करें.

// Include the following headers

#include "play_games.h"
#include "recall_client.h"
#include "pgs_status_code.h"
// Request Recall Access
// Initializes the Play Games Services v2 Native SDK (beta).
Pgs_initialize(javaVM, activity);

//Creating Recall Client
PgsRecallClient* pgs_recall_client =
      PgsRecallClient_create(activity);

// RequestRecallAccess Function
PgsRecallClient_requestRecallAccess(
    pgs_recall_client,

    // This is your callback function defined as an inline lambda
    [](PgsStatusCode status_code, char* session_id, user_data) {

        if (status_code == PGS_STATUS_SUCCESS) {
            // Recall Session Id Fetched Successfully
        } else {
            // Fetching Recall Session Id Failed
            // Handle error based on status_code.
            // Examples:
            // PGS_STATUS_NETWORK_ERROR: Check internet connection.
            // PGS_STATUS_INTERNAL_ERROR: An unexpected error occurred.
        }

        // Clean up the client instance passed as user_data
        PgsRecallClient* client = static_cast<PgsRecallClient*>(user_data);
        if (client != nullptr) {
            PgsRecallClient_destroy(client);
        }
    },

    user_data // Data to pass to the callback
);

// Shuts down the Play Games Services v2 Native SDK (beta).
Pgs_destroy()

अपने गेम सर्वर में Recall API का इस्तेमाल करना

सर्वर और क्लाइंट को कॉन्फ़िगर करने के बाद, अपने गेम क्लाइंट से recallSessionID को अपने गेम सर्वर पर भेजा जा सकता है. साथ ही, सर्वर साइड पर Recall टोकन सेव करने, उन्हें वापस पाने या मिटाने के लिए, Java API का इस्तेमाल करने के लिए यहां दिया गया तरीका अपनाएं.

टोकन सेव करना

Google Play Games Recall API में, खिलाड़ी के खाते की जानकारी के दो हिस्से होते हैं:

  • परसोना, जो इन-गेम खाते के लिए एक स्थायी आइडेंटिफ़ायर के तौर पर काम करता है
  • टोकन, जो खिलाड़ी को खाते में सुरक्षित तरीके से साइन इन करने की कुंजी के तौर पर काम करता है

LinkPersonaRequest ऑब्जेक्ट का इस्तेमाल करके, उपयोगकर्ता का परसोना और टोकन सेव किया जा सकता है. Google API को कॉल करने के लिए, GoogleCredential का इस्तेमाल करें. ज़्यादा जानकारी के लिए, Google API को कॉल करना लेख पढ़ें. परसोना के लिए 1:1 कार्डिनैलिटी कंस्ट्रेंट होता है. इसका मतलब है कि किसी PGS प्रोफ़ाइल में सिर्फ़ एक परसोना हो सकता है. साथ ही, कोई परसोना सिर्फ़ एक 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
}

टोकन वापस पाना

अपने गेम की ज़रूरतों के हिसाब से, टोकन वापस पाने के तीन विकल्प हैं. इनके लिए अनुरोध किया जा सकता है:

  • मौजूदा गेम से जुड़े टोकन. इनमें, गेम के दायरे वाले रीकॉल टोकन भी शामिल हैं.
  • डेवलपर खाते के मालिकाना हक वाले सभी गेम में सेव किया गया, सबसे नया टोकन.
  • डेवलपर खाते के मालिकाना हक वाले गेम की सूची के हिसाब से, हर गेम से जुड़े सभी रीकॉल टोकन.

गेम के दायरे वाले रीकॉल टोकन

मौजूदा गेम से रीकॉल टोकन वापस पाने के लिए, क्लाइंट से 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 में पास करना होगा. इसके लिए, कोड का यह स्निपेट देखें. रिस्पॉन्स के तौर पर, इस टोकन से जुड़े ऐप्लिकेशन आईडी की जांच की जा सकती है.

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 में पास करें. ऐप्लिकेशन आईडी की सूची दें .

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 Console में, PGS गेम प्रोजेक्ट के लिए, प्रोफ़ाइल के बिना रीकॉल की सुविधा चालू करें. &quot;स्टोरेज चालू करें&quot; लेबल वाला विकल्प चुनें.
  2. इस सेक्शन में आगे बताई गई अतिरिक्त शर्तें देखें.
  3. अपने ऐप्लिकेशन मेनिफ़ेस्ट में, यह मेटाडेटा टैग जोड़ें:
<meta-data
  android:name="com.google.android.gms.games.PROFILELESS_RECALL_ENABLED"
  android:value="true" />

अतिरिक्त शर्तें

आपको Play की गेम सेवाओं की सेवा की शर्तों का भी पालन करना होगा. अगर PGS प्रोफ़ाइल के बिना उपयोगकर्ताओं के लिए, Recall API का इस्तेमाल किया जाता है, तो आपको एंड-यूज़र का डेटा Google के साथ शेयर करना होगा. हालांकि, Google के साथ यह डेटा शेयर करने से पहले, आपको एंड-यूज़र को एक सूचना देनी होगी. इसमें यह जानकारी शामिल होनी चाहिए: