迁移到 Play 游戏服务登录 v2

本页介绍了如何将客户端代码从 Play 游戏服务 v1 迁移到 v2。

新的 SDK 包含以下五项您应当了解的重要变更,将大大提高您的登录成功率:

  1. 当您的游戏启动时,系统会自动触发登录。您可以使用 GamesSignInClient.isAuthenticated() 获取自动登录尝试的结果,而不是使用 GoogleSignIn SDK 的 GoogleSignInClient 执行登录。
  2. 客户端工厂类不再需要传入 GoogleSignInAccount 对象。无法请求额外的 OAuth 范围(系统会自动请求 GAMES_LITESCOPE_APPFOLDER)。
  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);
}

移除登录和退出调用

如果您没有指定除 GAMESGAMES_LIGHTSCOPE_APPFOLDER 以外的额外范围,则迁移用例应该很简单。

  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 via the Play Games Services REST APIs.
    } else {
      // Failed to retrieve authentication code.
    }
});

移除额外的作用域

对于 Play 游戏服务 v2,您无法请求任何额外的作用域。如果您仍然需要请求额外的作用域,我们建议您结合使用 Google Sign In SDK 和 Play 游戏服务。

从 GoogleApiClient 迁移

对于较旧的现有集成,您的游戏可能依赖于 Play 游戏服务 SDK 的 GoogleApiClient API 变体。此 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