Login em jogos para Android

Para acessar a funcionalidade dos serviços relacionados a jogos do Google Play, seu jogo precisa fornecer a conta do jogador conectado. Esta documentação descreve como implementar uma experiência de login perfeita no seu jogo.

O SDK dos serviços relacionados a jogos do Google Play v2 traz uma série de melhorias que aumentam o número de usuários conectados ao jogo e facilitam o desenvolvimento:

  • Melhorias para os usuários:
    • Depois de selecionar uma conta padrão, os usuários fazem login sem precisar interagir com uma solicitação.
    • Os usuários não precisam mais fazer o download do app Play Games para fazer login nos serviços relacionados a jogos do Google Play nem criar uma nova conta.
    • Agora os usuários podem gerenciar as contas dos serviços relacionados a jogos do Google Play para vários jogos em uma única página.
  • Melhorias para desenvolvedores:
    • O código do cliente não precisa mais processar o fluxo de login ou saída, já que o login é acionado automaticamente quando o jogo é iniciado e o gerenciamento da conta é processado nas configurações do SO.

Integração de novos clientes

Esta seção mostra como fazer uma integração de novos clientes com o login dos serviços relacionados a jogos do Google Play v2.

Adicionar a dependência

Adicione a dependência do SDK dos serviços relacionados a jogos do Google Play ao arquivo build.gradle no nível raiz do app. Se você estiver usando o Gradle, vai poder adicionar ou atualizar a dependência da seguinte maneira:

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

Definir o ID do projeto

Para adicionar o ID do projeto do SDK dos serviços relacionados a jogos do Google Play ao seu app, siga estas etapas:

  1. No arquivo AndroidManifest.xml do seu app, adicione o seguinte elemento <meta-data> e atributos ao elemento <application>:

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

    Defina a referência @string/game_services_project_id do recurso de string usando o ID do projeto do jogo nos serviços relacionados a jogos como o valor. O ID do projeto nos serviços relacionados a jogos pode ser encontrado abaixo do nome do jogo na página Configuração do Google Play Console.

  2. No seu arquivo res/values/strings.xml, adicione uma referência de recurso de string e defina o ID do projeto como o valor. No Google Play Console, você encontra o ID do projeto abaixo do nome do jogo na página Configuração. Exemplo:

    <!-- 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>
    

Inicializar o SDK

Inicialize o SDK do Play Games no callback onCreate(..) da classe Application.

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

...

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

Acessar o resultado de login

Quando o jogo é iniciado, ele sempre tenta fazer o login do usuário. Para autenticar o usuário, você precisa verificar se ele fez login e, em seguida, receber o ID do jogador.

Para verificar a tentativa de login, chame GamesSignInClient.isAuthenticated() e use addOnCompleteListener para recuperar os resultados. Exemplo:

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

Se o usuário opta por não fazer login quando o jogo é iniciado, você pode continuar exibindo o botão com o ícone do Play Games e tentar fazer login dele novamente chamando GamesSignInClient.signIn(), se o usuário pressionar o botão.

Depois de verificar se o usuário está conectado, você pode recuperar o ID do jogador para identificá-lo. Exemplo:

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

Migrar para o login nos serviços relacionados a jogos do Google Play v2

Esta seção descreve como migrar seu código de cliente dos serviços relacionados a jogos do Google Play v1 para v2.

O novo SDK contém quatro mudanças importantes para aprimorar o login que você precisa conhecer:

  1. O login é acionado automaticamente quando o jogo é iniciado. Em vez de usar o GoogleSignInClient do SDK GoogleSignIn para fazer login, você pode usar GamesSignInClient.isAuthenticated() para buscar o resultado da tentativa de login automático.
  2. As classes do Client Factory não precisam mais que um objeto GoogleSignInAccount seja transmitido. Escopos OAuth adicionais não podem ser solicitados (GAMES_LITE será solicitado automaticamente).
  3. Os tokens de autenticação agora são fornecidos usando GamesSignInClient.requestServerSideAccess() no SDK dos serviços relacionados a jogos do Google Play.
  4. O método de saída do jogo foi removido, e não vamos exigir mais que um botão seja exibido no jogo para fazer login ou sair dos serviços relacionados a jogos do Google Play.

Além disso, o jogo passará por logins adicionais devido ao login automático quando for iniciado. Por isso, veja o tópico gerenciamento de cotas para garantir que o jogo não exceda á cota de solicitações de login.

Direcionar ao novo repositório Maven do SDK

Se você estiver usando o sistema de compilação do Gradle, isso poderá ser feito mudando sua dependência para o artefato com.google.android.gms:play-services-games-v2:+ no arquivo build.gradle do módulo. Exemplo:

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

Inicializar o SDK

Inicialize o SDK do Play Games no callback onCreate(..) da sua classe Application. Exemplo:

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

...

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

Remover chamadas de login e de saída

Se você não especificar escopos extras, a migração do caso de uso será simples.

  1. Remova chamadas de login usando a API GoogleSignIn. O login sempre será executado na inicialização do jogo. Em vez disso, detecte o resultado da tentativa de login automático usando 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. Remova todas as chamadas para sair, já que o gerenciamento de contas agora está contido nas configurações do app do SO e do Play Games.

  3. Se o jogador tiver feito login, remova o botão de login do Play Games do seu jogo. Se o usuário opta por não fazer login quando o jogo é iniciado, você pode continuar a exibir um botão com o ícone do Play Games e acionar o processo de login com GamesSignInClient.signIn().

  4. Depois de verificar se o usuário está conectado, você pode recuperar o ID do jogador para identificá-lo.

    PlayGames.getPlayersClient(activity).getCurrentPlayer().addOnCompleteListener(mTask -> {
        // Get PlayerID with mTask.getResult().getPlayerId()
      }
    );
    
  5. Remova a dependência da API GoogleSignIn, caso ela não esteja mais sendo usada.

Atualizar nomes de classes do cliente

Ao criar clientes (por exemplo, LeaderboardsClient ou AchievementsClient) use PlayGames.getFooClient() em vez de Games.getFooClient().

Solicitar acesso do lado do servidor

Ao solicitar acesso do lado do servidor, use GamesSignInClient.requestServerSideAccess(), em vez de GoogleSignInAccount.getServerAuthCode().

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

Remover escopos extras

Com os serviços relacionados a jogos do Google Play v2, não é possível solicitar escopos adicionais. Se você ainda precisar solicitar escopos adicionais, recomendamos usar o SDK de Login do Google com os serviços relacionados a jogos do Google Play.

Migração do GoogleApiClient

Para integrações já existentes mais antigas, seu jogo pode depender da variação da API GoogleApiClient do SDK dos serviços relacionados a jogos do Google Play. Ela foi descontinuada no final de 2017 e substituída por clientes "sem conexão". Para migrar, substitua a classe GoogleApiClient por uma equivalente "sem conexão". Também será necessário seguir as orientações acima para migrar o jogo da v1 para a v2. Veja abaixo um mapeamento de classes comuns:

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