게임 내에서 PGS Recall API 통합

이 페이지에서는 게임 내에서 Recall API를 구현하는 방법을 설명합니다. 먼저 API를 지원하도록 게임 서버 및 클라이언트를 설정하는 방법을 살펴보고, 토큰을 저장하고 검색하는 방법을 알아봅니다.

게임 서버 설정

Recall API를 호출하는 게임 서버를 Google 서버로 설정합니다.

1. Play 게임즈 서비스 프로젝트 설정

(아직 완료하지 않은 경우) Google Play 게임즈 서비스 설정의 안내를 따릅니다.

2. 게임의 서비스 계정 설정

서비스 계정 만들기의 안내를 따르세요. 마지막에는 서비스 계정 사용자 인증 정보가 포함된 JSON 파일이 있어야 합니다.

3. PlayGamesServices용 서버 측 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.0com.google.android.gms:play-services-tasks:18.0.2 이상을 포함해야 합니다.

올바른 정보로 Google 서버와 통신하려면 클라이언트 SDK에서 리콜 세션 ID를 요청해야 하며, 이 ID는 게임 서버로 전송됩니다.

Kotlin

PlayGames.getRecallClient(getActivity())
                .requestRecallAccess()
                .addOnSuccessListener { recallAccess -> val recallSessionId: String = recallAccess.getSessionId() }
                // Send the recallSessionId to your game server

자바

PlayGames.getRecallClient(getActivity())
  .requestRecallAccess()
  .addOnSuccessListener(
    recallAccess -> {
      String recallSessionId = recallAccess.getSessionId();
      // Send the recallSessionId to your game server
    });

게임 서버 내에서 Recall API 사용

서버와 클라이언트를 구성한 후에는 게임 클라이언트에서 게임 서버로 recallSessionID를 전송하고 아래 안내에 따라 Java API를 사용하여 서버 측에서 리콜 토큰을 저장, 검색 또는 삭제할 수 있습니다.

토큰 저장

사용자의 캐릭터와 게임 토큰은 LinkPersonaRequest 객체를 사용하여 저장할 수 있습니다. GoogleCredential을 사용하여 Google API를 호출해야 합니다. 자세한 내용은 Google API 호출을 참고하세요. 1:1 카디널리티 제약 조건에 따라 한 번에 하나의 캐릭터를 하나의 PGS 프로필에만 연결할 수 있으며 반대의 경우도 마찬가지입니다. 이 PGS 프로필이 이미 다른 캐릭터와 연결된 경우 해결 정책을 설정해야 합니다.

선택적으로 토큰에 TTL을 설정할 수 있습니다. 이는 Durations 객체를 사용하여 토큰의 유효 기간을 선언합니다. 메서드에 지정된 시간으로부터 만료일을 설정하는 SetTtl()을 사용하거나(아래 참고) 토큰이 만료되는 정확한 시간을 설정할 수 있는 setExpireTime()을 사용하여 이를 설정할 수 있습니다.

캐릭터와 게임 토큰은 암호화해야 하며 개인 식별 정보를 포함할 수 없습니다. 캐릭터 및 토큰 문자열은 최대 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
}

토큰 검색

게임의 요구사항에 따라 토큰을 가져오는 방법에는 세 가지가 있습니다. 다음을 요청할 수 있습니다.

  • 게임 범위 리콜 토큰을 포함하여 현재 게임과 연결된 토큰입니다.
  • 개발자 계정이 소유한 모든 게임에 저장된 마지막 토큰입니다.
  • 개발자 계정이 소유한 게임 목록과 각 게임과 연결된 모든 리콜 토큰

게임 범위 리콜 토큰

현재 게임에서 리콜 토큰을 검색하려면 클라이언트에서 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 Console에서 PGS 게임 프로젝트에 프로필 없는 리콜을 사용 설정합니다. &#39;저장용량 사용 설정&#39; 옵션을 선택합니다.
  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. Play 게임즈 계정 연결 기능을 사용 설정하기 위해 Google과 데이터를 공유하는 경우
  2. Play 게임즈 설정을 통한 공유와 같은 공유를 관리하는 설정을 사용할 수 있는지 여부
  3. Google 개인정보처리방침에 따라 이러한 데이터를 처리하고 모든 관련 법규를 준수하는 적절한 최종 사용자 동의를 얻어 이러한 공유를 진행합니다.