Skip to main content

Android

本文旨在介绍如何设置 Google 身份验证,让您的游戏可以使用 Player Network 登录鉴权服务通过 Google 渠道登录。

前提条件

1. 在 Google Play 管理中心设置您的游戏
note

对于 IEGG 项目,请联系 [miaruan (Ruan Mingjun)] 进行 Google 应用的注册和配置。

1. 创建 Google 应用

按照提示在 Google Play Console 上注册账号。

info

Google 收取25美元的服务费。请提前准备好信用卡。

  1. 进入 Google Play Console
  2. All apps 页面,点击 Create app,创建游戏应用。
    图片:Google - create a game app
  3. 输入应用信息。
    图片:Google - enter information for the app
2. 配置 Play 游戏服务

设置 Play 游戏服务,以管理游戏元数据并自动执行游戏制作和分发任务。

  1. 进入 Google Play Console
  2. 在左侧导航栏中,选择 Grow users > Play Games Services > Setup and management > Configuration
  3. Which Play Games Services project do you want to use 下,选择对应的选项来创建 Play 游戏服务项目。 图片:Google service creation
  4. Properties 部分,点击 Edit Properties
  5. 输入游戏基本信息,然后点击 Save changes图片:Google basic game information
3. 添加一个凭证,将 OAuth 2.0 客户端 ID 与游戏连接起来
  1. 进入 Google Cloud Platform
  2. 在左侧导航栏中,点击 OAuth consent screen
  3. 按照说明设置 OAuth consent screen
    图片:Google, consent to the agreement
  4. 在左侧导航栏上点击 Clients
  5. Clients 页面,选择 CREATE CLIENT > Create OAuth Client ID,创建 OAuth 客户端 ID。
    图片:Google, create OAuth clients
  6. Application type 列表中,点击 Android
  7. 输入 Package NameSHA-1 Certificate Fingerprint
    与开发团队确认 Package NameSHA-1 Certificate Fingerprint。Android 的 OAuth 客户端要求用户在 KeyStore 中配置 SHA-1 证书指纹和软件包名称。请确保这两个值正确无误。否则,登录过程将出现异常。
    图片:Google, create an Android client
  8. 点击 SAVE 完成配置。
  9. 进入 Android app 的详细信息页面,查看客户 ID 和客户密文。
  10. 点击 Audience > ADD USERS 添加登录测试用户。
    图片:Google, add test users
4. 添加游戏测试人员
  1. 进入 Google Play Console
  2. 在左侧导航栏中,选择 Grow users > Play Games Services > Setup and management > Testers
  3. Testers 选项卡中,点击 Add testers 为您的游戏添加测试人员。
    图片:Google testers
note

在游戏应用发布之前,只有测试人员可以登录。请确保应用处于测试状态.

5. 配置成就和排行榜

Play 游戏服务 菜单下找到 成就排行榜 功能,并根据需要进行配置。

图片:Google leaderboard

6. 获取 Google API ID

Google 云端平台 面板访问信息中心。Google API ID 就是此页面上的 Project No.

图片:Google ID

7. 获取 Client ID 和 Client secret

按照 添加凭证以将 OAuth 2.0 客户端 ID 与游戏链接 中的步骤获取应用信息。

图片:Google Web Client ID and Secret

  1. 获取 Player Network 控制台登录账号
  2. 为游戏创建新项目,或加入已有项目
  3. 下载 SDK
  4. 接入 SDK
  5. 在 Player Network 控制台添加 Google 为业务的登录鉴权方式

步骤1:为 Google 登录配置 SDK

  1. AndroidManifest 文件中,确保添加了所需权限。Google 需要访问网络。
<uses-permission android:name="android.permission.INTERNET"/>
  1. 打开项目的 INTLConfig.ini 文件:
INTLConfig.ini
[INTL environment]
# WARNING: You should change this URL to the production environment when you release your game.
INTL_URL = https://test.intlgame.com
GAME_ID = {INTL_GAME_ID}
SDK_KEY = {INTL_SDK_KEY}
[INTL Log]
LOG_LEVEL = 1
LOG_CONSOLE_OUTPUT_ENABLE = 1
LOG_FILE_OUTPUT_ENABLE = 1
LOG_ENCRYPT_ENABLE = 0
LOG_COMPRESS_ENABLE = 0
[Android LifeCycle]
LIFECYCLE = Google
[Google]
GOOGLE_CLIENT_KEY_ANDROID = {INTL_GOOGLE_CLIENT_KEY}
  • 将 SDK 后端环境设置为 INTL_URL = https://test.intlgame.com
  • {INTL_GAME_ID}{INTL_SDK_KEY} 替换为 Player Network 控制台 分配的 GAME_IDSDK_KEY 的值。
  • 设置 LOG_LEVEL = 1LOG_CONSOLE_OUTPUT_ENABLE = 1LOG_FILE_OUTPUT_ENABLE = 1LOG_ENCRYPT_ENABLE = 0LOG_COMPRESS_ENABLE = 0,以便在不加密或压缩输出的情况下输出控制台日志和日志文件。
  • LIFECYCLE 中添加 Google。有关更多信息,请参见 SDK 环境
  • {INTL_GOOGLE_CLIENT_KEY} 替换为 Web 客户端密钥
    这是 API OAuth 配置过程中 Credentials 部分中网络应用的客户端 ID,在 API OAuth 2.5 配置过程中也称为 Server Client ID。
  1. 在 gradle 文件中定义 manifestPlaceholders,将 {INTL_GOOGLE_APP_ID} 替换为 Google App ID。

    mainTemplate.gradle
    android {
    defaultConfig {
    manifestPlaceholders = ["GOOGLE_APPID":"{INTL_GOOGLE_APP_ID}"]
    }
    }

步骤2:添加 Google 登录

所有 Google 操作都需要连接到 Google 服务。

自动登录 (AuthLogin)

在自动登录期间,设备可能无法连接到 Google 服务。因此推荐在默认情况下,让 Player Network SDK 在自动登录时连接 Google 服务。(游戏团队可在 INTLConfig 配置文件的 Google渠道配置 部分配置配置 GOOGLE_LOGOUT_NEED_CONNECT 字段来禁止此连接。)

登录

在调用 Google 登录之前,Player Network SDK 将检查 Google 移动服务(GMS)是否可用。只有当 GMS 可用时,才能调用登录服务。如果 GMS 不可用,Player Network SDK 将通过 INTLAuthResultThirdCode 字段向游戏返回 Google 发送的错误代码。

返回代码返回值错误描述
SERVICE_MISSING1设备上的 GMS 不可用。
SERVICE_VERSION_UPDATE_REQUIRED2已安装的 GMS 版本已过期。
SERVICE_DISABLED3GMS 已禁用。
SERVICE_INVALID9安装的 GMS 版本不正确。
SERVICE_UPDATING18设备上的 GMS 正在更新。

更多信息,请参见 Google DocsGoogle 常见问题

  1. 注册登录相关回调。

    // Add callbacks
    public void AddAuthObserver()
    {
    INTLAPI.AddAuthResultObserver(OnAuthResultEvent);
    }

    // Remove callbacks
    public void RemoveAuthObserver()
    {
    INTLAPI.RemoveAuthResultObserver(OnAuthResultEvent);
    }

    // Process the INTLAuthResult callback
    public void OnAuthResultEvent(INTLAuthResult AuthResult)
    {
    Debug.Log($"MethodID: {AuthResult.MethodId}");

    string methodTag = "";
    switch (AuthResult.MethodId)
    {
    case (int)INTLMethodID.INTL_AUTH_LOGIN:
    methodTag = "Login";
    break;
    case (int)INTLMethodID.INTL_AUTH_BIND:
    methodTag = "Bind";
    break;
    case (int)INTLMethodID.INTL_AUTH_AUTOLOGIN:
    methodTag = "AutoLogin";
    break;
    case (int)INTLMethodID.INTL_AUTH_QUERY_USER_INFO:
    methodTag = "QueryUserInfo";
    break;
    case (int)INTLMethodID.INTL_AUTH_GET_AUTH_RESULT:
    methodTag = "GetAuthResult";
    break;
    }
    }
  2. 调用 AutoLogin 接口自动登录。

    INTLAPI.AutoLogin();
  3. 在自动登录失败时调用 Login 接口使玩家手动登录。

    INTLAPI.Login(INTLChannel.Google); 
  4. 与游戏后台同步客户端身份验证状态,等待最终验证结果。

[可选] 设置 email 权限

要在 Google 登录时获取玩家邮箱需先设置对应权限,开启后将在 AuthResultChannelInfo 中返回 email

  • 基于合规考虑,可针对特定来源对返回的 email 做 mask 处理,如有需求请联系 Player Network 助手打开。
  • 可在后台流水日志中上报 hash 后的 base64(sha256(email)),如有需求请联系 Player Network 助手打开。
  • 可用于验证玩家信息或绑定列表是否包含 email 信息,如有需求请联系 Player Network 助手打开。

Player Network 控制台 开启 email 返回功能,将 return_email 设置为 YES,详细步骤请参见 第三方渠道配置

步骤3:验收登录功能

在 Player Network SDK 日志中搜索关键字 "AuthResult" 确认渠道名称和 OpenID 是否正确返回。如果正确,则表明集成配置成功,登录功能已成功添加。

如果接入过程中遇到问题,请参见 常见问题

步骤4:发布游戏

在准备发布正式版本之前,请使用 Android App Bundle 创建一个测试版本。

发布 Beta 版的好处是用户可以从 Google play 下载,但没有添加评论的权限。为用户提交反馈设置了特定的渠道。

创建正式发布版本
  1. 进入 Google Play Console

  2. 在左侧导航栏中,选择 Release > Production

    Figure: Select corresponding channel

  3. 按照说明创建生产版本。

图片:Google beta testing

更改发布状态
caution

如果用户不释放应用,验证可能会失败。

  1. 进入 Google 云端平台 的 OAuth 同意界面页面。
  2. Publishing status 更改为 PUBLISH APP

图片:Google app release

使用 APK 测试谷歌登录

更多信息,请参见 使用 APK 测试谷歌登录

使用 Google Play Games Services 同步登录态

Google Play Games Services(GooglePGS)支持 PGS 登录、跨设备登录态同步,以及 PGS 成就等功能。推荐需要在 Android 设备与 Google Play 游戏电脑版模拟器之间同步登录态,或需要使用 PGS 成就功能的游戏接入。

接入 GooglePGS 需要集成 INTLGooglePGS 插件。虽然 GooglePGS 可与任意登录渠道配合使用,但通常与 INTLGoogle 搭配使用——跨设备同步功能是为 Google 生态设计的,需要 Android 设备和 Google Play 游戏电脑版模拟器登录同一个 Google 账号。

步骤1:为 GooglePGS 配置 SDK

  1. 在项目的 INTLConfig.ini 文件中,添加以下配置:

    INTLConfig.ini
    [Android LifeCycle]
    LIFECYCLE = GooglePGS
    [GooglePGS]
    GOOGLEPGS_SERVER_PROJECT_ID = {INTL_GOOGLEPGS_SERVER_PROJECT_ID}
    GOOGLEPGS_ENABLE_PGS = 1
    GOOGLEPGS_ENABLE_SYNC = 0
    • {INTL_GOOGLEPGS_SERVER_PROJECT_ID} 替换为 Web 客户端密钥。
      这是 API OAuth 配置过程中 Credentials 部分中网络应用的客户端 ID,在 API OAuth 2.5 配置过程中也称为 server client ID。
    • GOOGLEPGS_ENABLE_PGS 控制客户端侧 PGS 流程是否开启,包括 PGS 初始化、登录和欢迎气泡。设置 GOOGLEPGS_ENABLE_PGS = 1 为启用。
    note

    从 V1.31 版本开始,GOOGLEPGS_ENABLE_PGS 仅控制客户端侧 PGS 流程。后台同步行为现在由 GOOGLEPGS_ENABLE_SYNC 单独控制。

    • GOOGLEPGS_ENABLE_SYNC 控制 SDK 是否将玩家的 OpenID 与 PGS Player ID 同步到 Player Network 后台进行绑定。此绑定可实现基于 PGS 的跨设备自动登录——当玩家在设备 A 上登录后,设备 B 可以通过 PGS Player ID 自动找到关联的 OpenID。设置 GOOGLEPGS_ENABLE_SYNC = 1 为启用,默认为 0(禁用)。
    tip

    如果您的游戏不需要通过 PGS 实现跨设备登录恢复,可以保持 GOOGLEPGS_ENABLE_SYNC = 0。对于未在 Player Network 管理端配置独立 PGS 渠道的游戏,建议使用此设置。

  2. gradle 文件中定义 manifestPlaceholders,将 {INTL_GOOGLEPGS_APPID} 替换为 Google App ID。

    mainTemplate.gradle
    android {
    defaultConfig {
    manifestPlaceholders = ["GOOGLEPGS_APPID":"{INTL_GOOGLEPGS_APPID}"]
    }
    }

步骤2:在 Google Play 游戏电脑版上,使用 AutoLogin 获取登录态

当玩家在 Android 设备上通过任意渠道(如 Google)登录后,即可通过 GooglePGS 将登录态同步到 Google Play 游戏电脑版模拟器上。Android 设备与 PC 模拟器需要登录同一个 Google 账号。

note

此步骤需要在步骤1中设置 GOOGLEPGS_ENABLE_SYNC = 1。如果未启用,OpenID 与 PGS Player ID 的绑定关系不会被创建,跨设备自动登录将无法生效。

INTLAPI.AutoLogin();

[可选] 步骤3:手动触发 PGS 登录

通过其他渠道(如 Google)成功登录后,SDK 会自动在后台触发一次非强制 PGS 登录。在此自动流程中,SDK 会初始化 PGS 并展示 PGS 欢迎弹窗,然后检查玩家的 PGS 认证状态:

  • 如果已认证:SDK 继续请求服务端授权码,用于 PGS 身份绑定。
  • 如果未认证:SDK 静默跳过 PGS 登录,不会向玩家展示登录界面。
note

在设备上有 Google 账号的情况下,应用首次启动时,PGS v2 可能会展示登录或创建档案的提示,这是 PGS 平台自身的引导流程。此提示由 PGS 初始化(PlayGamesSdk.initialize())触发,而非 SDK 的 signIn() 调用,不受 SDK 控制。在后续启动中,PGS 会静默认证(如果玩家之前已完成登录)或保持未认证状态而不展示任何界面。如果设备上没有 Google 账号,即使首次启动也不会出现此提示。

如果需要从游戏侧显式触发 PGS 登录(例如让玩家关联 PGS 身份),可以调用 ActivatePGSService 接口。与自动流程不同,此接口为强制登录调用。此接口仅支持 Android。调用时,SDK 将:

  1. 执行前置检查:验证 GOOGLEPGS_ENABLE_PGS = 1、Activity 有效、Google Play Services 可用。如果任一检查失败,将通过认证结果回调返回错误。
  2. 初始化 PGS 并检查玩家是否已通过 PGS 认证:
    • 如果已认证:SDK 直接请求服务端授权码,用于 PGS 身份绑定。
    • 如果未认证:由于这是强制登录调用,SDK 会调用 signIn() 向玩家展示 Google PGS 登录界面。如果玩家成功完成登录,SDK 继续请求授权码。如果玩家关闭界面或登录失败,将通过认证结果回调返回错误。
INTLAPI.ActivatePGSService();

GooglePGS 配置参考

配置项默认值说明
GOOGLEPGS_SERVER_PROJECT_IDGoogle Cloud Console OAuth 凭证中的 Web 客户端 ID(server client ID)。必填。
GOOGLEPGS_ENABLE_PGS0启用客户端侧 PGS 流程(初始化、登录、欢迎气泡)。
GOOGLEPGS_ENABLE_SYNC0将玩家的 OpenID 与 PGS Player ID 同步到 Player Network 后台进行绑定,以实现跨设备自动登录。

Google PGS 成就系统

Player Network SDK 提供了成就模块,集成了 Google Play Games Services 成就功能。游戏可以通过此模块解锁成就、增加进度以及展示原生成就界面。

info

成就模块目前仅支持 Android(GooglePGS)。iOS、Windows 及其他成就服务的支持将在后续版本中提供。

前提条件

  1. 完成上述 GooglePGS 配置,并设置 GOOGLEPGS_ENABLE_PGS = 1
  2. Google Play ConsolePlay Games Services > Setup and management > Achievements 中配置成就。
  3. 调用任何成就接口前,PGS 必须已认证。当 GOOGLEPGS_ENABLE_PGS = 1 时,SDK 会在成功登录后自动认证 PGS,也可以通过 ActivatePGSService 手动触发。

步骤1:注册成就回调

注册回调以接收成就操作结果。

// 添加成就回调
INTLAPI.AddAchievementResultObserver(OnAchievementResult);

// 移除成就回调
INTLAPI.RemoveAchievementResultObserver(OnAchievementResult);

// 处理成就结果
public void OnAchievementResult(INTLAchievementResult ret)
{
Debug.Log($"Achievement MethodID: {ret.MethodId}, RetCode: {ret.RetCode}");
}

步骤2:解锁成就

通过成就 ID 解锁一个标准(非增量)成就。

INTLAPI.UnlockAchievement("GooglePGS", "achievement_id_here");

步骤3:增加成就进度

对于增量成就,按指定步数增加进度。

INTLAPI.IncrementAchievement("GooglePGS", "achievement_id_here", 1);

步骤4:展示成就界面

展示 Google Play Games 原生成就界面。

INTLAPI.ShowAchievementsUI("GooglePGS");

成就接口参考

接口参数说明
UnlockAchievementchannelachievementIdextraJson(可选)解锁一个标准成就。
IncrementAchievementchannelachievementIdnumStepsextraJson(可选)增加增量成就的进度。
ShowAchievementsUIchannelextraJson(可选)展示原生成就界面。
AddAchievementResultObservercallback注册成就结果回调。
RemoveAchievementResultObservercallback移除已注册的成就结果回调。

成就结果数据

INTLAchievementResult(Unity)/ FINTLAchievementResult(UE)包含:

字段类型说明
MethodIdint触发此结果的方法(2701=解锁,2702=增加进度,2703=展示界面)。
RetCodeint结果码。0 表示成功。
SubRetCodeint二级结果码(V1.28 起可用)。
RetMsgstring结果消息。
ThirdCodeint平台特定错误码。11002 = NOT_AUTHENTICATED(PGS 未登录)。
ThirdMsgstring外部平台返回的消息。
ExtraJsonstring预留字段(JSON 格式)。
Platformstring成就提供方名称,如 "GooglePGS"
SeqIdstring请求的序列 ID。
AchievementListlistAchievementInfo 对象列表。请参见下方说明。
note

在当前的 GooglePGS 实现中,所有成就操作(UnlockAchievementIncrementAchievementShowAchievementsUI)返回的 AchievementList 始终为空。此字段可以安全忽略。未来 SDK 版本添加成就查询功能时可能会填充此字段——这适用于所有渠道的成就模块,而非仅限于 GooglePGS。建议使用空值检查(if (achievementRet.AchievementList != null))作为防御性编程模式。

每个 AchievementInfo 包含:

字段类型说明
AchievementIdstring成就标识符。
Namestring成就显示名称。
Descriptionstring成就描述。
CurrentStepsint当前进度(增量成就)。
TotalStepsint所需总步数(增量成就)。
Statusint成就状态(已解锁/进行中)。
UnlockTimeint成就解锁时间戳。