迁移到 Play 游戏服务登录 v2

本指南介绍如何将您的客户端代码从 Play 游戏服务 v1 迁移到 v2。

新 SDK 包含四项重大更改,以提高登录成功率,您应该注意这些更改

  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. 删除对注销的所有调用,因为帐户管理现在包含在操作系统和 Play 游戏应用设置中。

  3. 如果玩家成功登录,请从您的游戏中删除 Play 游戏登录按钮。如果用户在游戏启动时选择不登录,则可以选择继续显示带有 Play 游戏图标的按钮,并使用 GamesSignInClient.signIn() 触发登录过程。

  4. 验证用户已登录后,您可以检索玩家 ID 来识别用户。

    PlayGames.getPlayersClient(activity).getCurrentPlayer().addOnCompleteListener(mTask -> {
        // Get PlayerID with mTask.getResult().getPlayerId()
      }
    );
    
  5. 如果不再使用 GoogleSignIn API,请删除对它的依赖项。

更新客户端类名

创建客户端 (例如 LeaderboardsClientAchievementsClient) 时,使用 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 with the Play Games Services REST APIs.
    } else {
      // Failed to retrieve authentication code.
    }
});

删除额外范围

使用 Play 游戏服务 v2 时,您无法请求任何额外范围。如果您仍然需要请求额外范围,那么我们建议您将 Google 登录 SDK 与 Play 游戏服务一起使用。

从 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