Android 게임 로그인

Google Play 게임즈 서비스 기능에 액세스하려면 로그인한 플레이어의 계정을 게임에서 제공해야 합니다. 이 문서에서는 게임에서 원활한 로그인 환경을 구현하는 방법을 설명합니다.

Play 게임즈 서비스 v2 SDK는 게임에 로그인하는 사용자의 수를 늘리고 개발을 더 쉽게 할 수 있도록 도와주는 여러 개선사항을 제공합니다.

  • 사용자를 위한 개선사항
    • 기본 계정을 선택한 후 사용자는 프롬프트와 상호작용할 필요 없이 로그인하게 됩니다.
    • 사용자는 더 이상 Play 게임즈 서비스로 로그인하거나 새 계정을 만들기 위해 Play 게임즈 앱을 다운로드할 필요가 없습니다.
    • 이제 사용자는 단일 페이지에서 여러 게임의 Play 게임즈 서비스 계정을 관리할 수 있습니다.
  • 개발자를 위한 개선사항
    • 클라이언트 코드에서 더 이상 로그인 또는 로그아웃 흐름을 처리할 필요가 없습니다. 게임이 시작될 때 로그인이 자동으로 트리거되고 OS 설정에서 계정 관리가 처리되기 때문입니다.

새로운 클라이언트 통합

이 섹션에서는 Play 게임즈 서비스 로그인 v2와 새로운 클라이언트를 통합하는 방법을 보여줍니다.

종속 항목 추가

앱의 루트 수준 build.gradle 파일에 Play 게임즈 서비스 SDK 종속 항목을 추가합니다. Gradle을 사용하는 경우 다음과 같이 종속 항목을 추가하거나 업데이트할 수 있습니다.

dependencies {
 implementation "com.google.android.gms:play-services-games-v2:+"
}

프로젝트 ID 정의

Play 게임즈 서비스 SDK 프로젝트 ID를 앱에 추가하려면 다음 단계를 완료하세요.

  1. 앱의 AndroidManifest.xml 파일에서 <application> 요소에 다음 <meta-data> 요소 및 속성을 추가합니다.

    <manifest>
      <application>
        <meta-data android:name="com.google.android.gms.games.APP_ID"
                   android:value="@string/game_services_project_id"/>
      </application>
    </manifest>
    

    게임의 게임 서비스 프로젝트 ID를 값으로 사용하여 문자열 리소스 참조 @string/game_services_project_id를 정의합니다. 게임 서비스 프로젝트 ID는 Google Play Console에서 구성 페이지의 게임 이름 아래에 있습니다.

  2. res/values/strings.xml 파일에서 문자열 리소스 참조를 추가하고 프로젝트 ID를 값으로 설정합니다. Google Play Console의 구성 페이지에서 게임 이름 아래에 프로젝트 ID가 표시됩니다. 예를 들면 다음과 같습니다.

    <!-- res/values/strings.xml -->
    <resources>
      <!-- Replace 0000000000 with your game’s project id. Example value shown above.  -->
      <string translatable="false"  name="game_services_project_id"> 0000000000 </string>
    </resources>
    

SDK 초기화

Application 클래스의 onCreate(..) 콜백에서 Play 게임즈 SDK를 초기화합니다.

import com.google.android.gms.games.PlayGamesSdk;

...

@Override
public void onCreate(){
  super.onCreate();
  PlayGamesSdk.initialize(this);
}

로그인 결과 가져오기

게임이 시작되면 항상 사용자 로그인을 시도합니다. 사용자를 인증하려면 사용자가 성공적으로 로그인했는지 확인한 다음 플레이어 ID를 가져와야 합니다.

로그인 시도를 확인하려면 GamesSignInClient.isAuthenticated()를 호출하고 addOnCompleteListener를 사용하여 결과를 가져옵니다. 예를 들면 다음과 같습니다.

GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(getActivity());

gamesSignInClient.isAuthenticated().addOnCompleteListener(isAuthenticatedTask -> {
  boolean isAuthenticated =
    (isAuthenticatedTask.isSuccessful() &&
     isAuthenticatedTask.getResult().isAuthenticated());

  if (isAuthenticated) {
    // Continue with Play Games Services
  } else {
    // Disable your integration with Play Games Services or show a
    // login button to ask  players to sign-in. Clicking it should
    // call GamesSignInClient.signIn().
  }
});

사용자가 게임이 시작될 때 로그인하지 않도록 선택하는 경우 선택적으로 Play 게임즈 아이콘이 있는 버튼을 계속 표시하고 사용자가 버튼을 누르면 GamesSignInClient.signIn()을 호출하여 사용자 로그인을 다시 시도할 수 있습니다.

사용자가 로그인되어 있는지 확인한 후에는 플레이어 ID를 가져와 사용자를 식별할 수 있습니다. 예를 들면 다음과 같습니다.

PlayGames.getPlayersClient(activity).getCurrentPlayer().addOnCompleteListener(mTask -> {
    // Get PlayerID with mTask.getResult().getPlayerId()
  }
);

Play 게임즈 서비스 로그인 v2로 이전

이 섹션에서는 Play 게임즈 서비스 v1에서 v2로 클라이언트 코드를 이전하는 방법을 설명합니다.

새 SDK에는 로그인 성공을 높이기 위한 다음 4가지 주요 변경사항이 있습니다. 이러한 사항은 개발자가 인지하고 있어야 합니다.

  1. 게임 시작 시 로그인이 자동으로 트리거됩니다. GoogleSignIn SDK의 GoogleSignInClient를 사용하여 로그인을 실행하는 대신 GamesSignInClient.isAuthenticated()를 사용하여 자동 로그인 시도 결과를 가져올 수 있습니다.
  2. 클라이언트 팩토리 클래스에는 더 이상 GoogleSignInAccount 객체를 전달할 필요가 없습니다. 추가 OAuth 범위는 요청할 수 없습니다(GAMES_LITE가 자동으로 요청됨).
  3. 이제 Play 게임즈 서비스 SDK 내에서 인증 토큰이 GamesSignInClient.requestServerSideAccess()를 통해 제공됩니다.
  4. 로그아웃 방법이 삭제되었으며, Play 게임즈 서비스에 로그인하거나 로그아웃할 때 더 이상 게임 내 버튼이 필요하지 않습니다.

또한 게임이 시작될 때의 자동 로그인으로 인해 게임에서 추가 로그인이 발생합니다. 따라서 할당량 관리를 검토하여 게임이 로그인 요청 할당량을 초과하지 않도록 해야 합니다.

새 SDK Maven 저장소 타겟팅

Gradle 빌드 시스템을 사용한다면 모듈의 build.gradle 파일에 있는 com.google.android.gms:play-services-games-v2:+ 아티팩트의 종속 항목을 변경하면 됩니다. 예를 들면 다음과 같습니다.

dependencies {
 implementation "com.google.android.gms:play-services-games-v2:+"
}

SDK 초기화

Application 클래스의 onCreate(..) 콜백에서 Play 게임즈 SDK를 초기화합니다. 예를 들면 다음과 같습니다.

import com.google.android.gms.games.PlayGamesSdk;

...

@Override
public void onCreate(){
  super.onCreate();
  PlayGamesSdk.initialize(this);
}

로그인 및 로그아웃 호출 삭제

추가 범위를 지정하지 않은 경우 사용 사례 이전은 간단합니다.

  1. GoogleSignIn API를 사용하여 로그인 호출을 삭제합니다. 로그인은 게임 시작 시 항상 실행됩니다. 대신 GamesSignInClient.isAuthenticated()를 사용하여 자동 로그인 시도 결과를 수신 대기하세요.

    GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(getActivity());
    
    gamesSignInClient.isAuthenticated().addOnCompleteListener(isAuthenticatedTask -> {
      boolean isAuthenticated =
        (isAuthenticatedTask.isSuccessful() &&
         isAuthenticatedTask.getResult().isAuthenticated());
    
      if (isAuthenticated) {
        // Continue with Play Games Services
      } else {
        // Disable your integration with Play Games Services or show a
        // login button to ask  players to sign-in. Clicking it should
        // call GamesSignInClient.signIn().
      }
    });
    
  2. 이제 계정 관리가 OS 및 Play 게임즈 앱 설정에 포함되므로 모든 로그아웃 호출을 삭제합니다.

  3. 플레이어가 로그인되었다면 게임에서 Play 게임즈 로그인 버튼을 삭제합니다. 사용자가 게임이 시작될 때 로그인하지 않도록 선택하는 경우 선택적으로 Play 게임즈 아이콘이 있는 버튼을 계속 표시하고 GamesSignInClient.signIn()으로 로그인 프로세스를 트리거할 수 있습니다.

  4. 사용자가 로그인되어 있는지 확인한 후에는 플레이어 ID를 가져와 사용자를 식별할 수 있습니다.

    PlayGames.getPlayersClient(activity).getCurrentPlayer().addOnCompleteListener(mTask -> {
        // Get PlayerID with mTask.getResult().getPlayerId()
      }
    );
    
  5. 더 이상 사용되지 않는 GoogleSignIn API 종속 항목을 삭제합니다.

클라이언트 클래스 이름 업데이트

클라이언트(예: LeaderboardsClient 또는 AchievementsClient)를 만들 때는 Games.getFooClient() 대신 PlayGames.getFooClient()를 사용합니다.

서버 측 액세스 요청

서버 측 액세스를 요청할 때는 GoogleSignInAccount.getServerAuthCode() 대신 GamesSignInClient.requestServerSideAccess()를 사용합니다.

GamesSignInClient gamesSignInClient = PlayGames.getGamesSignInClient(this);
gamesSignInClient
  .requestServerSideAccess(OAUTH_2_WEB_CLIENT_ID,
                           /*forceRefreshToken=*/ false)
  .addOnCompleteListener( task -> {
    if (task.isSuccessful()) {
      String serverAuthToken = task.getResult();
      // Send authentication code to the backend game server to be
      // exchanged for an access token and used to verify the
      // player via the Play Games Services REST APIs.
    } else {
      // Failed to retrieve authentication code.
    }
});

추가 범위 삭제

Play 게임즈 서비스 v2에서는 추가 범위를 요청할 수 없습니다. 그래도 추가 범위를 요청해야 하는 경우 Play 게임즈 서비스와 함께 Google Sign In SDK를 사용하는 것이 좋습니다.

GoogleApiClient에서 이전

이전 통합의 경우 게임이 Play 게임즈 서비스 SDK의 GoogleApiClient API 변형에 종속되어 있을 수 있습니다. 이는 2017년 말 지원 중단되었으며 '연결 없는' 클라이언트로 대체되었습니다. 이전하려면 GoogleApiClient 클래스를 그에 대응하는 '연결 없는' 클래스로 대체하면 됩니다. 그런 다음 위의 안내에 따라 게임을 v1에서 v2로 이전해야 합니다. 다음은 공통 클래스의 매핑입니다.

com.google.android.gms.games.achievement.Achievements ->
    com.google.android.gms.games.AchievementsClient

com.google.android.gms.games.leaderboard.Leaderboard ->
    com.google.android.gms.games.LeaderboardsClient

com.google.android.gms.games.snapshot.Snapshots ->
    com.google.android.gms.games.SnapshotsClient

com.google.android.gms.games.stats.PlayerStats ->
    com.google.android.gms.games.PlayerStatsClient

com.google.android.gms.games.Players ->
    com.google.android.gms.games.PlayersClient

com.google.android.gms.games.GamesStatusCodes ->
    com.google.android.gms.games.GamesClientStatusCodes