게임 내에서 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

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 객체를 사용하여 저장할 수 있습니다. 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.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.Recall.RetrieveTokens;

// ...

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
}

리콜 토큰 삭제

필요한 경우 다음 호출을 사용하여 리콜 토큰을 삭제할 수도 있습니다.

import com.google.api.services.games.Games.Recall.UnlinkPersona;

// ...

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