我们正在采取措施,通过将 Games API 转移到新模型来减少登录摩擦以及向玩家提出的不必要权限请求。新的互动方式如下:
提示玩家每个帐户登录一次,而不是原来的每个游戏登录一次
玩家不再需要将帐户升级到 Google+ 来使用 Play Games 服务
玩家首次登录后,更换游戏时无需再次登录;他们将自动登录游戏
注:玩家可通过 Play Games 应用的设置关闭自动登录
优点:为尊重用户的隐私权和避免泄露其真实姓名,我们还必须更改玩家 ID 的工作方式。潜在问题大多数游戏应该不会出现服务中断或变更情况。但在少数情况下需要进行一定程度的变更。
以下是一些问题以及可能的解决方案。
这些问题是: 从您的 GoogleApiClient 结构中移除任何多余的作用域以及您不再使用的 API。
// This way you won’t get a consent screen
GoogleApiClient gac = new GoogleApiClient.Builder(this, this, this)
.addApi(Games.API)
.build();
// This way you won’t get a consent screen
对于 Google+ 用户如果您的应用使用特定 Google+ 功能,如要求访问玩家的现实世界 Google+ 社交图谱,请注意,新用户仍需拥有 G+ 个人资料,才能使用您的游戏。(将不会要求已经登录的现有用户再次同意)。
如需要求具备 Google+ 帐户才能使用您的游戏,请对您的 Games.API 声明做以下更改:
这可以确保您的游戏仍然会询问必要的权限/作用域,以便继续使用玩家的现实世界社交图谱和真实姓名个人资料。
问题:将玩家 ID 作为其他 ID 使用如果您调用 Games.getCurrentPlayerId() API,此处返回的值将是 Games 为该玩家使用的标识符。
在传统模型下,可将该值传递到 Plus.PeopleApi.load 等其他 API 中。 在新模型下则不再是这种情况。 玩家 ID 仅在与 Games API 一起使用时有效。
解决方案 – 不要混用 IDGames API(那些从 com.google.android.gms.games 访问的 API) 都使用玩家 ID,只要您只使用这些 API,它们就一定能与新 ID 配合使用。
问题:使用服务器上的移动/客户端访问令牌
我们见过的一种常见模式是:
首先并不推荐这样做,在作用域发生变化后这样做就更不可取。
不推荐的原因如下:您的应用必须了解用户当前使用的帐户,也就是说,应用必须拥有 GET_ACCOUNTS 权限。在 Android M 上,这会导致要求用户在运行时与您的应用共享其联系人,让用户感到畏惧。
tokeninfo 端点实际上并非针对这一用例开发—其主要设计用途是作为调试工具而非生产 API 使用。这意味着,如果您调用该 API,未来可能会受到请求率限制。
在新模型下,tokeninfo 返回的 user_id 可能不再存在。即便仍然存在,其值也不会与新玩家 ID 相同。(见上文的问题 2)
令牌可能随时到期(无法保证访问令牌到期时间)。
在服务器上使用客户端令牌需要进行额外的验证检查,以确保未将令牌授予其他应用。
解决方案:使用新的 GetServerAuthCode 流程幸运的是,已经找到了解决方案,并且其内容与我们针对 Web 的服务器端身份验证建议基本相同。
1. 升级到最新版本的 Google Play Services SDK—至少要升级到 8.4.87。
2. 如果您尚未创建服务器客户 ID,请创建一个
a) 转至 Google Developer Console,并选择您的项目 b) 从左侧导航栏选择 API Manager,然后选择 Credentials c) 依次选择“New Credentials”和“OAuth Client ID” d) 选择“Web Application”并为其指定对您的应用有意义的名称 e) 现在这个 Web 应用的客户 ID 即是您的服务器客户 ID。
3. 在您的游戏中,照常连接 GoogleApiClient。
4. 建立连接后调用以下 API:
a) Games.getGamesServerAuthCode(googleApiClient, “your_server_client_id”)
b) 如果您以前使用的是 GoogleAuthUtil,很可能是在后台线程中调用该 API—在这种情况下,代码将如下所示:
// Good way
{
GetServerAuthCodeResult result =
Games.getGamesServerAuthCode(gac, clientId).await();
if (result.isSuccess()) {
String authCode = result.getCode();
// Send code to server.
}
}
// Good way
5. 按照与以前完全相同的方式将身份验证代码发送至您的服务器。
a) 您需要提供服务器客户 ID、服务器客户密钥(当您创建服务器客户 ID 时,会在开发者控制台中列出)和身份验证代码。 b) 更多详情,请参阅此处:
https://developers.google.com/id ... er#handlingresponse c) 不,实际上: 您应该使用 Google API 客户端内容库来简化这一过程。
7. 获得访问令牌后,您现在可以使用它来调用
www.googleapis.com/games/v1/applications/<app_id>/verify/
a) 如下所示在标头中传递身份验证令牌:“Authorization:OAuth <access_token>” b) 响应值将包含该用户的玩家 ID。这便是供该用户使用的正确玩家 ID。
c) 可根据需要使用该访问令牌进行额外的服务器到服务器调用。
注: 如果访问令牌实际上是发放给您的 Web 应用,则此 API 将只返回 200。
总结可以非常明确的是:如果您不做任何调整,除非您显式地依赖 Google+ 功能,否则不会发现任何功能上的变化,并且登录体验会变得更加顺畅。
如果您:谢谢,请继续开发出色的游戏!