跳到主要内容

Android

说明

在 Android 设备上卸载游戏后,Garena 游客账号将丢失。建议游戏鼓励游客玩家尽快将游客账号与平台账号绑定,以避免游客账号意外丢失,并增强游戏的社交属性。

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

前提条件

1. 设置 Garena 应用

联系 Garena 团队激活应用程序并获取应用程序 ID 和其他相关信息。

Player Network SDK V1.24 及之后版本,还需联系 Garena 团队获取 Garena SDK 相关 Maven 仓库的 Garena_UsernameGarena_Password

要使用 Garena 的平台账号绑定,请请求 Garena 启用 APP_PLATFORM_BIND

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

步骤1:为 Garena 登录配置 SDK

  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://intlsdk-new-test.iegg.garena.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 = Garena
    [Garena Channel Configurations]
    GARENA_APP_SDK_ASSIGN_ID = {INTL_GARENA_APP_SDK_ASSIGN_ID}
    GARENA_APP_SDK_KEY = {INTL_APP_KEY}
    • 将 Player Network SDK 鉴权域名设置为 INTL_URL = https://intlsdk-new-test.iegg.garena.com,可联系 Garena 团队了解详情并获取正式环境 URL。
    • {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 中添加 Garena。有关更多信息,请参见 SDK 环境
    • {INTL_GARENA_APP_SDK_ASSIGN_ID} 替换为已注册的 Garena App ID。
    • {INTL_APP_KEY} 替换为已注册的 Garena App Key。
  2. 在 gradle 文件中定义 manifestPlaceholders,将 {INTL_GARENA_APP_SDK_ASSIGN_ID}{INTL_FACEBOOK_APP_ID}{INTL_GOOGLE_CLIENT_ID} 替换为应用程序的相应值。

    • 接入 Player Network SDK V1.22 及之后版本还需将 {INTL_FACEBOOK_CLIENT_TOKEN} 替换为 FACEBOOK_CLIENT_TOKEN 的值。
    • 接入 Player Network SDK V1.24 及之后版本还需将 {INTL_GARENA_MAVEN_USERNAME}{INTL_GARENA_MAVEN_PASSWORD} 替换为 Garena_UsernameGarena_Password 的值。
    注意

    对于 Unity 2022 版本,请编辑 settingsTemplate.gradle

    对于 Unity 2019/2020/2021 版本, 请编辑 baseProjectTemplate.gradle

    对于 Unity 2018 及更早版本,请编辑 mainTemplate.gradle

    android {
    defaultConfig {
    manifestPlaceholders = [
    "GARENA_APP_ID":"{INTL_GARENA_APP_SDK_ASSIGN_ID}",
    "FACEBOOK_APPID":"{INTL_FACEBOOK_APP_ID}",
    "GOOGLE_CLIENT_ID":"{INTL_GOOGLE_CLIENT_KEY_ANDROID}",
    "FACEBOOK_CLIENT_TOKEN":"{INTL_FACEBOOK_CLIENT_TOKEN}", // V1.22 新增
    "Garena_Username":"{INTL_GARENA_MAVEN_USERNAME}", // V1.24 新增
    "Garena_Password":"{INTL_GARENA_MAVEN_PASSWORD}", // V1.24 新增
    ]
    }
    }
  3. 根据以下代码在 AndroidManifest.xml 文件中声明权限。

    警告

    WRITE_EXTERNAL_STORAGE 是一个敏感权限。

    AndroidManifest.xml
    <manifest ... >
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    ...
    </manifest>
  4. 对于 Unreal Engine,将 Player Network SDK V1.13 及更高版本的 Garena 计费存储库更新至 4.0.0

    1. 如果使用 Unreal Engine 4.25

      1. 下载 GooglePlayStoreHelper.java。然后替换 {UE_PATH}/Engine/Plugins/Online/Android/OnlineSubsystemGooglePlay/Source/Java/com/epicgames/ue4/GooglePlayStoreHelper.java 文件。
      2. 下载 OnlineSubsystemGooglePlay_UPL.xml。然后替换 {UE_PATH}/Engine/Plugins/Online/Android/OnlineSubsystemGooglePlay/Source/OnlineSubsystemGooglePlay_UPL.xml 文件。
    2. 如果使用 Unreal Engine 4.26 或更高版本

      1. 下载 GooglePlayStoreHelper.java。然后替换 {UE_PATH}/Engine/Plugins/Online/Android/OnlineSubsystemGooglePlay/Source/Java/BillingApiV2/com/epicgames/ue4/GooglePlayStoreHelper.java 文件。
      2. {UE_PATH}/Engine/Plugins/Online/Android/OnlineSubsystemGooglePlay/Source/OnlineSubsystemGooglePlay_UPL.xml中的计费存储库版本修改为4.0.0

      图片:Billing3 图片:Billing4

步骤2:添加 Garena 登录

  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 ret)
    {
    Debug.Log($"MethodID: {ret.MethodId}");

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

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

    注意

    目前,Player Network SDK 支持登录的 Android Garena 子渠道包括 GuestGarenaFacebookGoogle。通过检查 AuthResultExtraJson 字段中返回的子渠道名称查看当前用于登录的子渠道。例如,{"subChannel":"Facebook"}".

    登录 Garena 的 Facebook 子渠道:

    INTLAPI.Login(INTLChannel.Garena, "", "{\"subChannel\":\"Facebook\"}");
    • 如果已安装应用程序,则打开应用程序登录,否则打开网页登录。
    • Garena 登录 permission 参数与其他渠道不同。用户需要输入字符串格式的数字。例如,"2" 或 "4"。权限定义如下:

    图片:Garena Permission

  4. 与游戏后台同步客户端身份验证状态,等待最终验证结果。

步骤3:验收登录功能

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

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

绑定

警告

Android 卸载游戏后会丢失 Garena 游客账号。建议游戏们鼓励游客玩家尽早绑定到平台账号以避免账号意外丢失,以及增强社交属性。

注意

由于 Garena 的渠道特性:

  1. 如果之前已使用过 Facebook 登录,则不能将其用作 Garena 登录的子渠道。否则,将返回错误代码 1013
  2. 成功绑定 Garena 账号后,不能再次绑定。

调用 Bind 接口时,会打开子渠道的应用程序(或网页)以执行登录验证。认证成功后,Player Network SDK 会将子渠道的账号与游客账号绑定。

// Log in as guest
INTLAPI.Login(INTLChannel.Garena, "", "{\"subChannel\":\"Guest\"}");
// Bind Logic
INTLAPI.Bind(INTLChannel.Garena, "", "{\"subChannel\":\"Facebook\"}");
注意

如果将游客账号绑定到 Garena 失败,游戏必须再次调用 Garena 的游客登录。

说明

调用 Bind 接口后,无论绑定结果如何,Garena SDK 的会话都会被设置为新绑定的渠道(带游客登录状态)。如果再次调用 Bind 接口,绑定将因会话验证失败而失败。因此,建议再次调用游客登录以返回正常的游客登录状态。

如果您在通过 Garena 登录时遇到困难,请参见 Garena 常见问题