Вход в игры для Android

Чтобы получить доступ к функциям игровых сервисов Google Play, ваша игра должна предоставить учетную запись игрока, вошедшего в систему. В этой документации описывается, как реализовать удобный вход в игру.

Play Games Services v2 SDK содержит ряд улучшений, которые увеличивают количество пользователей, вошедших в вашу игру, и упрощают разработку:

  • Улучшения для пользователей:
    • После выбора учетной записи по умолчанию пользователи входят в систему без необходимости взаимодействовать с подсказкой.
    • Пользователям больше не нужно загружать приложение Play Games, чтобы войти в Play Games Services или создать новую учетную запись.
    • Теперь пользователи могут управлять своими учетными записями игровых сервисов Play для нескольких игр с одной страницы.
  • Улучшения для разработчиков:
    • Клиентскому коду больше не нужно обрабатывать процесс входа или выхода, так как вход в систему запускается автоматически при запуске игры, а управление учетной записью осуществляется в настройках ОС.

Интеграция нового клиента с Play Games Services Sign In v2

В этом разделе показано, как выполнить интеграцию нового клиента с Play Games Services Sign In v2.

Добавьте зависимость SDK Play Games Services.

Добавьте зависимость Play Game Services SDK в файл build.gradle корневого уровня вашего приложения. Если вы используете Gradle, вы можете добавить или обновить зависимость следующим образом:

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

Определите идентификатор проекта Play Games Services

Чтобы добавить идентификатор проекта Play Games Services SDK в свое приложение, выполните следующие действия:

  1. В файле AndroidManifest.xml вашего приложения добавьте следующий элемент <meta-data> и атрибуты к элементу <application> :

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

    Определите ссылку на ресурс String @string/game_services_project_id используя идентификатор проекта игровых сервисов вашей игры в качестве значения. Идентификатор вашего проекта игровых сервисов можно найти под названием вашей игры на странице конфигурации в консоли Google Play.

  2. В файле res/values/strings.xml добавьте ссылку на строковый ресурс и установите идентификатор проекта в качестве значения. В Google Play Console вы можете найти идентификатор своего проекта под названием вашей игры на странице конфигурации . Например:

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

Инициализируйте Play Games SDK в обратном вызове onCreate(..) вашего класса Application .

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

...

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

Получить результат входа

Когда ваша игра запускается, она всегда будет пытаться войти в систему пользователя. Чтобы аутентифицировать пользователя, вы должны убедиться, что пользователь успешно вошел в систему, а затем получить его идентификатор игрока.

Чтобы проверить попытку входа, вызовите 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().
  }
});

Если пользователь решит не входить в систему при запуске игры, вы можете по желанию продолжать показывать кнопку со значком «Играть в игры» и попытаться снова войти в систему, вызвав GamesSignInClient.signIn() , если пользователь нажимает кнопку.

Убедившись, что пользователь вошел в систему, вы можете получить идентификатор игрока, чтобы идентифицировать пользователя. Например:

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

Переход на Play Games Services Вход v2

В этом разделе описывается, как перенести код клиента с Play Games Services v1 на v2.

Новый SDK содержит четыре основных изменения для повышения эффективности входа, о которых вам следует знать:

  1. Вход в систему запускается автоматически при запуске игры. Вместо использования GoogleSignInClient из GoogleSignIn SDK для выполнения входа вы можете использовать GamesSignInClient.isAuthenticated() для получения результата попытки автоматического входа.
  2. Классы Client Factory больше не будут нуждаться в передаче объекта GoogleSignInAccount . Нельзя запрашивать дополнительные области действия OAuth ( GAMES_LITE будет запрашиваться автоматически).
  3. Токены аутентификации теперь предоставляются с помощью GamesSignInClient.requestServerSideAccess() в SDK Play Games Services.
  4. Метод выхода удален, и нам больше не потребуется внутриигровая кнопка для входа или выхода из игровых сервисов Play.

Кроме того, в вашей игре будут возникать дополнительные входы в систему из-за автоматического входа при запуске игры. В результате вам следует пересмотреть управление квотами , чтобы убедиться, что ваша игра не превышает квоту запросов на вход.

Нацельтесь на новый репозиторий SDK Maven.

Если вы используете систему сборки Gradle, это можно сделать, изменив зависимость на артефакт com.google.android.gms:play-services-games-v2:+ в файле build.gradle вашего модуля. Например:

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

Инициализировать SDK

Инициализируйте Play Games SDK в обратном вызове onCreate(..) вашего класса Application . Например:

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. Удалите все призывы к выходу, так как управление учетной записью теперь содержится в настройках ОС и приложения Play Games.

  3. Если игрок успешно вошел в систему, удалите кнопку входа в Play Games из своей игры. Если пользователь решит не входить в систему при запуске игры, вы можете при желании продолжать показывать кнопку со значком «Играть в игры» и запускать процесс входа с помощью GamesSignInClient.signIn() .

  4. Убедившись, что пользователь вошел в систему, вы можете получить идентификатор игрока, чтобы идентифицировать пользователя.

    PlayGames.getPlayersClient(activity).getCurrentPlayer().addOnCompleteListener(mTask -> {
        // Get PlayerID with mTask.getResult().getPlayerId()
      }
    );
    
  5. Удалите свою зависимость от API GoogleSignIn, если он больше не используется.

Обновить имена клиентских классов

При создании клиентов (например LeaderboardsClient или AchievementsClient ) используйте PlayGames.getFooClient() , а не Games.getFooClient() .

Запросить доступ на стороне сервера

При запросе доступа на стороне сервера используйте GamesSignInClient.requestServerSideAccess() вместо 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.
    }
});

Удалить дополнительные области

В Play Games Services v2 вы не можете запрашивать дополнительные области действия. Если вам по-прежнему необходимо запрашивать дополнительные области действия, мы рекомендуем вам использовать SDK Google Sign In вместе с игровыми сервисами Play.

Миграция с GoogleApiClient

Для более старых существующих интеграций ваша игра может зависеть от версии GoogleApiClient API SDK Play Games Services. Это устарело в конце 2017 года и заменено клиентами без подключения. Для миграции вы можете заменить класс GoogleApiClient эквивалентом «без установления соединения». Затем вам также придется следовать приведенным выше инструкциям, чтобы перенести игру с версии 1 на версию 2. Ниже приведено сопоставление общих классов:

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