本指南介绍如何将您的客户端代码从 Play 游戏服务 v1 迁移到 v2。
新 SDK 包含四项重大更改,以提高登录成功率,您应该注意这些更改
- 游戏启动时会自动触发登录。您无需使用 GoogleSignIn SDK 的
GoogleSignInClient
执行登录,而是可以使用GamesSignInClient.isAuthenticated()
获取自动登录尝试的结果。 - 客户端工厂类将不再需要传入
GoogleSignInAccount
对象。无法请求额外的 OAuth 范围 (GAMES_LITE
将自动请求)。 - 现在使用 Play 游戏服务 SDK 中的
GamesSignInClient.requestServerSideAccess()
提供身份验证令牌。 - 已删除注销方法,我们不再需要游戏内按钮来登录或注销 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);
}
删除登录和注销调用
如果您未指定任何额外范围,迁移您的用例应该很简单。
删除使用 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(). } });
删除对注销的所有调用,因为帐户管理现在包含在操作系统和 Play 游戏应用设置中。
如果玩家成功登录,请从您的游戏中删除 Play 游戏登录按钮。如果用户在游戏启动时选择不登录,则可以选择继续显示带有 Play 游戏图标的按钮,并使用
GamesSignInClient.signIn()
触发登录过程。验证用户已登录后,您可以检索玩家 ID 来识别用户。
PlayGames.getPlayersClient(activity).getCurrentPlayer().addOnCompleteListener(mTask -> { // Get PlayerID with mTask.getResult().getPlayerId() } );
如果不再使用 GoogleSignIn API,请删除对它的依赖项。
更新客户端类名
创建客户端 (例如 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 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