# GHOME SDK Unity版(支持直出移动端) 开发手册 for Unity C#

# 1. 前言

本文用于指导游戏开发商接入SDK,文中包含客户端的接入说明;

# 2. SDK接入流程概述

  • 搭建SDK开发环境

  • 完成隐私政策展示逻辑(请务必在完成隐私的展示逻辑之后再进行调用初始化 以及游戏自身敏感权限申请(申请请务必避开初始化接口调用)等操作)(游戏使用sdk隐私政策弹框请接接口4; 游戏自己实现隐私政策弹框请接接口5接口6

  • 初始化SDK

  • 初始化成功,调用账号功能相关接口

  • 用户在进行购买时,调用支付功能相关接口

  • 其他功能接口,可根据业务需要适时调用

  • 接入第三方渠道的个性化功能时,可调用SDK扩展接口实现

  • 销毁SDK

  • 游戏在启动游戏时需对设备网络进行判断,若无网络的情况下,游戏需实现对用户的弹框提示。

# 3. 开发环境要求

# 3.1. 集成SDK文件到游戏工程

  • 导入GHomeUnitySDK(forMobile)_vXXX_XXX.unitypackage 包所有内容到游戏unity工程

    (以下接入部分接入完成 可直接导出安卓包。 导出ios包的话则还是需要根据之前的移动端ios接入手册进行操作)

# 3.2. 通过unity配置面板配置AndroidManifest内的data等参数

  1. 点击菜单栏 CreateAsset/AddAndroidData, 可看到在Assets生成了ManifestDataAsset/AndroidConfig 配置文件

  2. 双击打开AndroidConfig.asset 在Inspector中 配置相应的参数,具体参数值有疑问的话可联系G家

  3. 填写完成点击 保存 按钮即可

# 3.3. 通过unity配置面板新增activity等安卓参数

  1. 点击菜单栏 AAddActvivities/AddActivity, 可看到在Assets生成了ActivitiesAsset/AActivityConfig 配置文件

  2. 双击打开AActivity.asset 在Inspector中 配置相应的参数,具体参数值有疑问的话可联系G家

  3. 填写完成点击 添加 按钮即可

# 3.4. 通过unity面板配置iOS三方参数

  1. 点击菜单栏 CreateAsset - AddiOSThirdConfig, 可看到在Assets生成了Editer/iOSThirdConfig.asset 配置文件

  2. 打开iOSThirdConfig.asset 在Inspector中 配置相应的参数,具体参数值有疑问的话可联系G家

  3. 填写完成点击 保存 按钮即可

# 3.5. iOS 内购和苹果登录的支持,打包Xcode脚本由于unity原因不能生效 需要在xcode工程中手动添加。

  1. 选中游戏target->Signing & Capabilities ->add Capability 添加In-App Purchase 和 Sign in with Apple

  2. 选中游戏target->Signing & Capabilities ->add Capability 添加Associated Domains 并添加 Domains为 applinks: + UnversalLink 的URL 例如(applinks:daoyu8.com)

# 3.6.配置debug (开启ghome 控制台日志)

GHomeManager.GetInstance().GSetGHomeDebugMode(true); //发布版记得删除 或者配置成false
1

# 4. SDK内隐私弹框功能接口

游戏在初始场景调用,隐私接口返回成功方可调用后续的初始化等接口

  • 接口:

    GShowUserAgreement(string appId, GHomeCallback gCallback);

  • 参数说明:

    appId: 游戏的appId

    gCallback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 注意事项:

    请确保该接口成功之后再调用其他接口。

  • 代码示例:

GHomeManager.GetInstance().GShowUserAgreement("791000008", (code, msg, data) =>
        {
            if (code == 0)
            {
                Debug.Log("LoadScene GShowUserAgreement success");
                GHomeManager.GetInstance().GInit("791000008", (code, msg, data) =>
                {
                    Debug.Log("初始化成功");

                    DemoUtil.ShowToastUI("初始化成功");

                    isInit = true;
                    //跳转到下一个场景
                    Debug.Log("LoadScene LoginScene");
                    SceneManager.LoadScene("LoginScene");
                });

            }
        });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 5. 游戏调用该接口获取是否需要展示隐私协议弹框

注意(重要):

游戏使用自己的隐私弹框逻辑的话则必接,否则不要接

  • 说明: 游戏在两种场景之前需要调用该接口获取是否显示隐私协议弹框。 场景1: 启动游戏 场景2: 调用GHome的login接口之前

  • 接口:

    GIfNeedShowUserAgreement(string appId, string isForLogin, GHomeCallback gCallback);

  • 参数说明:

    appId:游戏在手游直通车平台上申请得到的ID。

    isForLogin: 是否是在去调用login接口之前的查询(true),(对应于启动游戏的查询-false)

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 注意事项:

    如游戏是自己实现隐私协议相关弹框展示功能则必接,否则请勿调用该接口; 并且在同意与否的操作时 需要调用反馈接口

  • 代码示例:

GHomeManager.GetInstance().GIfNeedShowUserAgreement("791000008", "false", (code, msg, data) =>
        {

            if (data != null && data["status"] == "1")
            {
                DemoUtil.ShowToastUI("status  is  1 需要显示隐私: " + data["status"]);
                //TODO show game's privacy dialg
            }
            else
            {
                DemoUtil.ShowToastUI("status  is not 1 不需要显示: " + data["status"]);
            }
        });
1
2
3
4
5
6
7
8
9
10
11
12
13

# 6. 隐私协议结果反馈接口

注意(重要):

游戏自己实现的隐私政策则必接,否则不要接

游戏需要在隐私协议弹窗后,根据用户选择同意与否调用该接口。

  • 接口:

    GUserIsAgreeAgreement(string isUserAction, string isAgree)

  • 参数说明:

    isUserAction:是否用户主动同意隐私协议(主动选择true,其他选择或者选第一次选择之后后面默认选项false)

    isAgreed: 是否同意隐私协议

  • 注意事项:

    如游戏没有隐私协议弹窗,则需要在后台配置参数,弹出SDK自带隐私协议弹窗。

  • 代码示例:

//用户选择弹框同意
GHomeManager.GetInstance().GUserIsAgreeAgreement("true", "true");
//之后用户默认同意
GHomeManager.GetInstance().GUserIsAgreeAgreement("false", "true");
1
2
3
4

# 7. 基础功能(必接)

# 7.1. SDK初始化接口(需要在用户同意隐私政策之后调用)

游戏在初始场景调用,初始化接口返回成功方可调用后续的登录等功能接口

  • 接口:

    GInit(string appId, GHomeCallback gCallback);

  • 参数说明:

    appId: 游戏的appId

    gCallback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 注意事项:

请确保初始化接口成功之后再调用其他接口。

  • 代码示例:
GHomeManager.GetInstance().GInit("791000008", (code, msg, data) =>
                {
                    if (code == GHomeConstants.ERROR_CODE_SUCCESS)
                    {
                        Debug.Log("初始化成功");

                        DemoUtil.ShowToastUI("初始化成功");

                        isInit = true;
                        //跳转到下一个场景
                        Debug.Log("LoadScene LoginScene");
                        SceneManager.LoadScene("LoginScene");
                    }
#if UNITY_ANDROID
                    else if (code == GHomeConstants.ERROR_INIT_FAILED)
                    {
                        //初始化失败 无需处理
                    }
                    else if (code == GHomeConstants.EVENT_ACCOUNT_LOGOUT)
                    {
                        // 这里已经注销账号了,游戏需要在这里处理自己注销账号的逻辑(可在注销之后调用登录接口拉登录界面)
                    }
                    else if (code == GHomeConstants.EVENT_ACCOUNT_CHANGED)
                    {
                        // 此处切换账号已经成功,游戏可以使用此处获得的userid和ticket去游戏服务端做登陆数据验证
                        // 如果游戏需要,可以在登录成功后,通过data获取到以下信息。
                        // userid是该玩家在我们平台的用户id号;
                        // ticket是本次登录得到的票据,用来给游戏服务器向平台服务器验证本次登陆是否合法;
                        Debug.Log("userid=" + data["userid"]);
                        Debug.Log("ticket=" + data["ticket"]);
                    }
                    else if (code == GHomeConstants.EVENT_ACCOUNT_LOGOUT_ONLY)
                    {
                        // 这里已经注销账号了,游戏需要在这里处理自己注销账号的逻辑(注销即可,不调登录)
                    }
                    else if (code == GHomeConstants.EVENT_EXIT_GAME)
                    {
                        //当通过渠道悬浮窗点退出游戏,悬浮窗已退出通知游戏做退出游戏操作。游戏不需要弹退出确认框
                    }
#endif
                    else
                    {
                        DemoUtil.ShowToastUI("初始化失败");
                    }
                });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

# 7.2. 账号踢下线上报接口(iOS 无此接口)

踢下线登出SDK账号接口

  • 接口:

    GKickoff()

  • 注意事项:

    建议在用户被踢下线时调用该接口

  • 代码示例:

GHomeManager.GetInstance().GKickoff();
1

# 8. 账号功能(必接)

# 8.1. 客户端登录

游戏客户端可以调用登录接口为玩家提供登录功能。若用户第一次登录,将显示登录和注册的界面。若用户上次使用账号成功登录过,则会用该账号自动登录。 (重要:如果游戏使用自己的隐私政策弹框功能, 则需要在调用login之前调用查询是否需要弹隐私政策的接口,查询接口说明请参考 接口5

  • 接口:

    GLogin(GHomeCallback gCallback)

  • 参数说明:

    gCallback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 代码示例:

GHomeManager.GetInstance().GLogin((code, msg, loginData) =>
        {
            Debug.Log("loginCallback : ticket = " + loginData["ticket"] + ", userid = " + loginData["userid"]);
            if (GHomeConstants.ERROR_CODE_SUCCESS == code)
            {
                DemoUtil.ShowToastUI("登录成功 ticket: " + loginData["ticket"]);
                mtxUserId.text = "userId: " + loginData["userid"];
                PlayerPrefs.SetString("userId", "userId: " + loginData["userid"]);
                LoginSuccess();
            }
            else if (GHomeConstants.ERROR_INIT_NOT_FINISHED == code)
            {
                DemoUtil.ShowToastUI("未初始化");
                GHomeManager.GetInstance().GInit("791000008", mGameGHomeInitCallback);
            }
            else if (GHomeConstants.ERROR_CODE_LOGIN_CANCEL == code)
            {
                DemoUtil.ShowToastUI("登录取消");
            }
            else
            {
                Debug.Log("登录失败!");
            }
        });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

# 8.2. 客户端注销接口

游戏客户端可以在游戏内需要注销账号的地方调用该接口,执行成功将删除自动登录的记录信息,玩家下次登录后将不再自动登录,而是显示出登录界面。

  • 接口:

    GLogout(GHomeCallback gCallback)

  • 参数说明:

    gCallback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 代码示例:

GHomeManager.GetInstance().GLogout((code, msg, data) =>
        {
            DemoUtil.ShowToastUI("code: " + code + ", msg: " + msg);
            SceneManager.LoadScene("LoginScene");
        });
1
2
3
4
5

# 8.3. 切换账号接口

游戏里有切换账号入口的情况应调用这个接口来实现切换账号功能。

  • 接口:

    GSwitchAccount(GHomeCallback callback)

  • 参数说明:

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 代码示例:

GHomeManager.GetInstance().GSwitchAccount((code, msg, data) =>
        {
            if (code == GHomeConstants.ERROR_CODE_SUCCESS)
            {

                DemoUtil.ShowToastUI("登录成功 ticket: " + data["ticket"]);
                PlayerPrefs.SetString("userId", "userId: " + data["userid"]);
            }
            else
            {
                //登录失败或取消, 游戏做登出操作即可
            }
        });
1
2
3
4
5
6
7
8
9
10
11
12
13

# 8.4. 客户端注销删除账号接口

游戏客户端可以在游戏内提供注销账号的场所调用该接口,需要在收到注销回调成功之后退出回到登录。

  • 接口:

    GUnregister(GHomeCallback gCallback);

  • 参数说明:

    gCallback: 回调对象。

  • 代码示例:

GHomeManager.GetInstance().GUnregister((code, msg, da) =>
        {
            Debug.Log("ShowUnregister Callback : code = " + code + ", msg: " + msg);
            DemoUtil.ShowToastUI("code: " + code + ", msg: " + msg);

            if (code == GHomeConstants.ERROR_CODE_SUCCESS)
            {
                //TODO to login scene
            }
        });
1
2
3
4
5
6
7
8
9
10

# 9. 支付功能(必接)

# 9.1. 客户端支付接口

游戏客户端可以在购买道具的地方调用该接口。这将打开支付界面,引导玩家支付该订单。用户结束支付操作后,SDK会回调游戏客户端,告知支付结果是否已经成功。

  • 接口:

    GPay(string orderId, string areaId, string groupId, string productId, string extendStr, GHomeCallback callback);

  • 参数说明:

    orderId: 必传,游戏订单号。如果游戏需要记录订单号,可以传入唯一的字符串来标识此订单。

    areaId: 必传,在手游直通车平台上设置的区服的ID 区服ID不可为0

    groupId: 必传,组ID。没有则传空串

    productId: 必传,在手游直通车平台上设置的商品的ID

    extendStr: 可选,扩展参数,游戏可用于自行扩展,平台发货通知时将原样返回给游戏服务器。

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 注意事项:

    由于可能发生网络延迟等等原因,有时候客户端返回的支付结果可能与实际情况有出入,所以最终订单是否支付成功,建议以平台服务器端的通知为准,客户端的通知结果仅作为参考。

  • 代码示例:

GHomeManager.GetInstance().GPay(tempOrderId, areaId, groupId, productId, "payExtendInfo", (code, msg, da) =>
         {
    if (code == GHomeConstants.ERROR_CODE_SUCCESS) {
      // 支付成功,游戏客户端可以在这里查询游戏服务器是否收到发货通知
      // 如果游戏服务器已经收到发货通知可以向用户发放道具
    } else {
      // 支付暂未成功,这种状态可能是用户未完成支付,也可能是尚未收到渠道的发货通知
      // 游戏客户可以不做处理,用户下次登录时再做查询
    }
}); 
1
2
3
4
5
6
7
8
9
10

# 10. 扩展功能(可选)

# 10.1. 客户端获取游戏区服列表接口

游戏客户端可以调用该接口获取游戏在G家平台登记的区服配置。

  • 接口:

    GetGAreaConfigList(GHomeCallback callback);

  • 参数说明:

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 注意事项:

    暂无

  • 代码示例:

GHomeManager.GetInstance().GetGAreaConfigList((code, msg1, areaData) =>
        {
            string messageData = areaData["data"];
            Debug.Log("GHomeManager GetAreaConfigCallback code11111: " + code + ", data: " + areaData["data"]);


            JObject messageData23 = JObject.Parse(messageData);
            areaConfigData = JArray.Parse(messageData23["message"].ToString());
            foreach (var areaInfo in areaConfigData)
            {
                Dropdown.OptionData temoData1 = new Dropdown.OptionData()
                {
                    text = areaInfo["name"].ToString()

                };
                mAreaDropdown.options.Add(temoData1);
                Debug.Log("GHomeManager GetAreaConfigCallback 22222: "
                + ", areaCode: " + areaInfo["area_code"]
                + ", areaName: " + areaInfo["name"]);
            }

        });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  • JSON格式说明:
{
  "message":[
  {
    "area_code":"1",  // 开发商后台配置的区服ID
    "name":"area1"    // 开发商后台配置的区服名称
    "group_id":"1"    // 开发商后台配置的区组ID
    "group_name":"gourp1"    // 开发商后台配置的区组名称
  },
  ...
  ]
}
1
2
3
4
5
6
7
8
9
10
11

# 10.2. 客户端获取游戏商品列表接口

游戏客户端可以调用该接口获取游戏在G家平台登记的商品配置。

  • 接口:

    GGetConfigProductsList(GHomeCallback callback)

  • 参数说明:

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 代码示例:

GHomeManager.GetInstance().GGetConfigProductsList((code, msg, da) =>
        {
            DemoUtil.ShowToastUI("code: " + code + ", msg: " + msg);
            if (code == GHomeConstants.ERROR_CODE_SUCCESS)
            {
                Debug.Log("GetProductsInfo Callback : products = " + da["data"]);
                if (mProductsListData != null)
                {
                    mProductsListData.Clear();
                }
                mProductsDropdown.ClearOptions();
                JObject sdf = JObject.Parse(da["data"].ToString());
                mProductsListData = JArray.Parse(sdf["message"].ToString());
                int i = 0;
                foreach (var prod in mProductsListData)
                {
                    Dropdown.OptionData temoData1 = new Dropdown.OptionData()
                    {
                        text = prod["item_name"].ToString()
                    };
                    mProductsDropdown.options.Add(temoData1);
                    if (i == 0)
                    {
                        mProductsDropdown.captionText.text = prod["item_name"].ToString();
                        i += 1;
                    }
                    Debug.Log("productsInfo: "
                    + "item_name: " + prod["item_name"]
                    + "\n money: " + prod["money"]
                    + "\n product_code: " + prod["product_code"]
                    + "\n type: " + prod["type"]);
                }
            }
        });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  • JSON格式说明:
{
  "message":[
  {
    "product_code":"com.gold100",  // 开发商后台配置的产品ID
    "item_name":"100 Gold",       // 开发商后台配置的产品名称
    "money":"10.00",          // 开发商后台配置的产品金额
    "type":0              // 0:Android游戏,1:IOS游戏,2:Android和IOS游戏
  },
  ...
  ]
}
1
2
3
4
5
6
7
8
9
10
11

# 10.3. 客户端获取一次性登录票据接口

游戏客户端在接入其他需要登录G家平台的应用时(如:客服、论坛等。),可以调用该接口获取一个一次性小票提供个应用完成登录。

  • 接口:

    GGetTicket(string appId, final String areaId, GHomeCallback callback);

  • 参数说明:

    appId: 需要使用该票据完成登录的应用ID。

    areaId: 需要使用该票据完成登录的应用区号,如果该应用没有区的概念可以传"0"。

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 注意事项:

    必须在登录成功之后才可以使用该接口。

  • 代码示例:

GHomeManager.GetInstance().GGetTicket("791000008", GInterSDK.GConfig.selectedAreaId, (code, msg, dicData) =>
        {
            if (code == GHomeConstants.ERROR_CODE_SUCCESS)
            {
                if (dicData != null)
                {
                    Debug.Log("GGetTicket callback ticket: " + dicData["ticket"]);
                    DemoUtil.ShowToastUI("code: " + code + ", msg: " + msg + "ticket: " + dicData["ticket"]);

                    //获取成功  继续游戏验证登录逻辑。
                }
                else
                {
                    DemoUtil.ShowToastUI(msg);
                }
            }
            else if (code == GHomeConstants.ERROR_NETWORK_TIMEOUT)
            {
                // 票据获取失败,但可以重试(包含网络问题)
                // 游戏停留当前UI,并提示用户返回的 msg
                // 用户点击msg关闭信息窗口后,可以点击“进入游戏”继续(重新走getticket流程)
                DemoUtil.ShowToastUI(msg);
            }
            else
            {
                // 票据获取失败,但重试也可能回复(服务端有明确的特别错误码)
                // 游戏停留当前UI,并提示用户返回的 msg
                // 用户点击msg关闭信息窗口后,建议游戏实现App关闭(也可以关闭并重启)
            }
        });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 10.4. 打开二维码扫码

启动二维码扫码界面。(使用场景: 扫描游戏PC端二维码,授权使用手机当前已登录账号进行PC端的登录或者支付)

  • 接口:

    GScanQrcode(string extInfo, GHomeCallback callback)

  • 参数说明: extInfo: 扩展信息,扫码支付的话会在发货时原样返回给游戏

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 注意事项:

    必须在登录成功之后才可以使用该接口。

  • 代码示例:

GHomeManager.GetInstance().GScanQrcode("extInfo", (code, msg, da) =>
        {
            Debug.Log("GScanQrcode Callback : code = " + code + ", msg: " + msg);
            DemoUtil.ShowToastUI("code: " + code + ", msg: " + msg);

            if (code == GHomeConstants.ERROR_CODE_QR_LOGIN_SUCCESS)
            {
                // 扫码登录成功
            }
            else if (code == GHomeConstants.ERROR_CODE_QR_PAY_SUCCESS)
            {
                // 扫码支付成功
            }
            else if (code == GHomeConstants.ERROR_CODE_QR_RESULT)
            {
                //扫码授权结果信息,可以取data的qrdata 具体信息显示
                Debug.Log("qrdata=" + da != null ? da["qrdata"] : msg);
            }
            else if (code == GHomeConstants.ERROR_CODE_QR_CANCELED)
            {
                Debug.Log("QR scan canceled");
            }
            else if (code == GHomeConstants.ERROR_PAY_FAILED)
            {
                Debug.Log("QRCODE_DEBUG扫码支付失败!!! ");
            }
            else if (code == GHomeConstants.ERROR_USER_NOT_LOGIN)
            {
            }
        });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 11. 渠道接口(必接)

# 11.1. 客户端上报游戏区接口

游戏客户端在用户选择区时需要调用该接口,否则数据报表将无法按区提供。

  • 接口:

    GLoginArea(string areaId, string groupId)

  • 参数说明:

    areaId: 用户进入的区号。

    groupId: 必传,组号, 没有可传空串

  • 代码示例:

GHomeManager.GetInstance().GLoginArea("1", "89");
1

# 11.2. 客户端显示/隐藏悬浮窗接口(iOS 无此接口)

游戏客户端需要在游戏登录成功之后显示悬浮窗,注销之后隐藏悬浮窗,否则可能无法通过渠道上线审核。

  • 接口:

    GShowFloatIcon(bool show)

  • 参数说明:

    show: true显示悬浮窗、false隐藏悬浮窗。

  • 代码示例:

// 在登成功之后调用
GHomeManager.GetInstance().GShowFloatIcon(true);

// 在账号注销之后调用
GHomeManager.GetInstance().GShowFloatIcon(false);
1
2
3
4
5

# 11.4. 第三方渠道SDK扩展接口(iOS 无此接口)

游戏客户端,请依据文档,在各个对应场景实现如下接口。

  • 接口:

    GDoExtend(int command, Dictionary<string, string> subData, GHomeInterfaceCallback.GHomeCallback callback)

  • 参数说明:

    command: 扩展接口编号(如: IGHomeApi.EXTEND_COMMAND_SUBMIT_EXTEND_DATA)

    subData: 请求参数,类型为Dictionary<string, string>

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 注意事项:

    请严格按照文档要求在游戏内各个节点接入该接口。

  • 可从callback的data中获取到调用时候对应传入的"command"值,代码示例:

GHomeManager.GetInstance().GDoExtend(GHomeConstants.EXTEND_COMMAND_SUBMIT_EXTEND_DATA, subData, (code, msg, da) =>
        {
            //上报数据回调无需处理
            Debug.Log("commandCode: " + da["doExtendRequestCommand"]);
        });
1
2
3
4
5
# 11.4.1 提交游戏扩展数据(iOS 无此接口)

渠道要求游戏在运行过程中提交一些用于运营需要的扩展数据,以便双方对游戏内容进行更深度的运营。游戏在接入时请将代码示例中的玩家数据改为真实数据。本接口需在以下情况下调用:

  1. 玩家登陆成功后角色信息确定之后调用。

  2. 角色等级发生变化的时候调用。

  3. 创建新角色时调用。

  • 参数说明:

    //该接口的"submitType"的值分别为“createRole”,"selectServer","enterServer","levelUp","exitServer"时务必分别调用

  • 注意事项:

    "submitType" 请务必根据场景正确传值

  • 代码示例:

long currentMillis = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds;
        Dictionary<string, string> subData = new Dictionary<string, string>
        {
            { "roleId", "R0010"}, // 当前登录的玩家角色ID
            { "roleName", "令狐一冲"}, // 当前登录的玩家角色名
            { "roleLevel", "99"}, // 当前登录的玩家角色等级
            { "zoneId", "192825"}, // 当前登录的游戏区服ID
            { "zoneName", "游戏一区-逍遥谷"}, // 当前登录的游戏区服名称
            { "roleCreateTime", currentMillis + ""}, // 角色创建时间戳
            { "roleLevelUpdateTime", currentMillis + ""}, // 角色等级变化时间戳
            { "submitType", "enterServer"}, // 上报场景:  "createRole", "selectServer"(选择服务器,账号登录成功 ,角色进入游戏前), "enterServer"(选择服务器进入游戏后), "levelUp"(角色升级) ,"exitServer"(退出服务器,退出游戏)
            { "roleBalance", "100"}, // 务必传一个数字,若无,传"0"
            { "vipLevel", "30"}, // 务必传一个数字,若无,传入"0"
            { "partyName", "无"}, //若没有就传"无"
            { "professionid", "0"}, //没有就传"0"
            { "Private", "无"}, //没有就传"无"
            { "gender", "女"}, //不能为空,不能为null,可传参数"男"、"女"、"无"
            { "professionroleid", "12"}, //累计充值金额 元为单位,文不能为空,必须为数字,若没有就传"0"
            { "power", "10000000"}, //不能为空,必须为数字,不能为null,没有就传“0”
            { "experience", "100909090"}, //不能为空,用户当前经验值,必须为数字,不能为null,若没有就传"0"
            { "balance", "0"}, //若没有则传 "0"
            { "partyid", "0"}, //不能为空,必须为数字,不能为null,若无,传入 “0”
            { "partyroleid", "0"}, //帮派会长/帮主必传1,其他可自定义,不能为空,不能为null,若无,传入 “0”
            { "partyrolename", "无"} //不能为空,不能为null,若无,传入“无”
        };
        GHomeManager.GetInstance().GDoExtend(GHomeConstants.EXTEND_COMMAND_SUBMIT_EXTEND_DATA, subData, (code, msg, da) =>
        {
            //上报数据回调无需处理
        });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 11.4.2 游戏退出页接口(iOS 无此接口)

游戏退出时调用该接口(通常是玩家点击返回键等要触发游戏退出弹框的场景),等待该接口返回来确定是否需要弹出游戏自己的退出弹框

  • 代码示例:
GHomeManager.GetInstance().GDoExtend(GHomeConstants.EXTEND_COMMAND_EXIT_PAGE, null, (code, msg, da) =>
        {
            if (code == 0)
            {
                Application.Quit();
            }
            else //sdk内 没有退出确认框, 这里弹出游戏自己的退出游戏弹框
            {
                //TODO 弹出退出确认框
                //demo 不演示弹框 直接写测试代码退出
                Application.Quit();
            }

        });
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 12. 其他接口(非必接)

# 12.1. 获取渠道号

# 12.1.1. 获取一级渠道号(iOS 无此接口)

游戏可调用以下接口来获取一级渠道号

  • 接口:

    GGetApplicationSuperChannel();

  • 参数说明:

  • 注意事项:

    在初始化完成后才能调用。

  • 代码示例:

string applicationChannel = GHomeManager.GetInstance().GGetApplicationSuperChannel();
1
# 12.1.2. 获取二级渠道号(iOS 无此接口)

游戏可调用以下接口来获取二级渠道号

  • 接口:

    GGetCPSChannelCode()

  • 代码示例:

string cpsChannel = GHomeManager.GetInstance().GGetCPSChannelCode();
1
# 12.1.3. 获取G家设备id(iOS 无此接口)

G家使用的设备id的字符串

  • GGetGHomeDeviceId()

  • 代码示例:

string gDeviceId = GHomeManager.GetInstance().GGetGHomeDeviceId();
1
# 12.1.4. 上报角色信息(买量相关 选接 Android无此接口)
  • 接口:

    public void GReportRole(string roleId, string roleName, string level, string areaId, string areaName, string roleCtime, string shiftLevel, string fight, string action)

  • 代码示例:


GHomeManager.GetInstance().GReportRole(

                            //当前登录的玩家角色ID
                            "R0010", 
                            // 当前登录的玩家角色名
                            "令狐一冲", 
                            // 当前登录的玩家角色等级,务必传一个数字,若无,传"0"
                            "19", 
                            // 当前登录的游戏区服ID
                            "24954", 
                            // 当前登录的游戏区服名称
                            "传奇百区", 
                            //务必传一个数字,若无,传"0" 距离1970年的秒数
                            timeStamp, 
                            //转升等级 ,若无,传"0"
                            "94", 
                            //战力 ,若无,传"0"
                            "99", 
                            // 1 上报创建角色,2 上报角色登录,3 上报角色升级
                            "3");
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 13. 获取用户条款和隐私政策(选接)

游戏获取用户条款和隐私政策页面的URL / html页面内容代码 (接入接口时根据自身需求二选一)

  • 接口:

    GGetUserAgreement(string appId, GHomeCallback gCallback) //页面的URL

    GGetUserAgreementContent(string appId, GHomeCallback gCallback) // 所有协议json数据

  • 参数说明:

    appId: 游戏在GPOP平台上申请得到的应用ID。

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 代码示例:

  //获取隐私页面url
  GHomeManager.GetInstance().GGetUserAgreement("791000008", (code, msg, dicData) =>
        {
            Debug.Log("GGetUserAgreementUrl callback ");
            if (code == GHomeConstants.ERROR_CODE_SUCCESS)
            {
                DemoUtil.ShowToastUI("privacyPolicyUrl: " + dicData["privacyPolicyUrl"] + "\n servicerAgreementUrl: " + dicData["servicerAgreementUrl"]);
            }
        });

  //获取协议的全部json内容数据。
  GHomeManager.GetInstance().GGetUserAgreementContent("791000008", (code, msg, dicData) =>
        {
            Debug.Log("GGetUserAgreementContent callback ");
            if (code == GHomeConstants.ERROR_CODE_SUCCESS)
            {
                // dicData["data"] 为json格式。参考以下关于data 的格式说明
                Debug.Log("GHomeManager GGetUserAgreementContent : " + code + ", data: " + dicData["data"]);
            }
        });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  • dicData["data"] JSON格式说明:
{
    "agreements":[
        {
            "type":2,
            "url":"https:\/\/sdkdl.sdoprofile.com\/ghome\/yinsizhengce.html",
            "content":"\r\n<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n    <title>隐私政策<\/tit.............. "
        },
        {
            "type":1,
            "url":"https:\/\/sdkdl.sdoprofile.com\/ghome\/yonghuxieyi.html",
            "content":"<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n    <title>用户协议<\/tit.........."
        },
        {
            "type":0,
            "url":"https:\/\/sdkdl.sdoprofile.com\/ghome\/ghome_union.html",
            "content":"<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n    <meta charset=\"UTF-8\">\r\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n    <title>盛趣游戏用户协议和隐私政策..........."
        }
    ],
    "status":1,
    "version":2
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 14. 第三方账号登录账号更换绑定手机号(选接)

使用第三方账号(微博,QQ,微信等)登录进游戏之后的换绑手机号功能接口

  • 接口:

    GBindAcitvityPhone(string appId, GHomeCallback callback)

  • 参数说明:

    appId: 游戏在手游直通车平台上申请得到的ID。

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 代码示例:

  GHomeManager.GetInstance().GBindAcitvityPhone("791000008", (code, msg, da) =>
        {
            Debug.Log("GBindAcitvityPhone Callback : code = " + code + ", msg: " + msg);
            DemoUtil.ShowToastUI("code: " + code + ", msg: " + msg);
        });
1
2
3
4
5

# 15. 敏感词过滤接口(非必接,请看注意事项。iOS 无此接口)

【注意(重要):】

  1. 该接口仅仅是一个interface空接口,如果游戏需要在某些渠道使用渠道的敏感词接口(例如wegame),则需要调用这个接口。

  2. 在 ghome sdk 或其他渠道,不会有任何作用,“原文入参,原文出参”。游戏在这些场景需要自行实现所有敏感词过滤功能(或者使用其他第三方sdk)

  3. 一般建议使用该接口的游戏,可以单独实现母包(和官方登录或者其他渠道分开),以便在聊天、昵称设定(等所有用户可输入信息地方)实现渠道使用的敏感词过滤(目前仅仅wegame渠道支持)。

  4. 基于第三点仅仅是一种游戏的实现方案建议,如果游戏有其他方便实现的方案,也可以操作。但原则上是需要完成敏感词过滤,并了解 ghome sdk 仅仅是一个空接口(功能代理)。

  5. 另外,如果游戏在wegame渠道的母包中实现了一次自己的敏感词,则wegame渠道包则会:用户输入->游戏母包的敏感词过滤->ghome sdk 接口代理->wegame 敏感词->返回结果。

  6. 该接口我们不会记录任何调用信息,不会有任何日志,因为属于用户隐私的敏感信息。所以请上线前使用该接口的游戏都需要经过测试(所有场景,例如聊天、昵称设置、等等),线上是不会对用户记录任何有关的行为数据。

  • 接口:

    GFilterSensitiveWords(string inputWords, GHomeCallback callback)

  • 参数说明:

    inputWords: 用户输入的文本信息。

    callback: 回调对象,用来回调执行结果,详情请参考代码事例。

  • 代码示例:

   GHomeManager.GetInstance().GFilterSensitiveWords("这是输入的文字", (code, msg, da) =>
        {
            DemoUtil.ShowToastUI("code: " + code + ", msg: " + msg);
            if (da != null)
            {
                DemoUtil.ShowToastUI("filter words result: " + da["resultWord"]);
            }

        });
1
2
3
4
5
6
7
8
9

# 16. GShare(分享功能,按需选接)

# 16.1. 分享接口入参说明

分享类型:

public class GConfig
    {

        public const string SHARE_WEIXIN_PLATFORM = "0";
        public const string SHARE_WEIXIN_CIRCLE_PLATFORM = "1";
        public const string SHARE_QQ_PLATFORM = "2";
        public const string SHARE_CHANNEL_QZONE_PLATFORM = "3";
        public const string SHARE_SINA_WB_PLATFORM = "4";
        public const string SHARE_SDK_CHOOSE_PLATFORM = "5";
        public const string SHARE_SDK_SYSTEM_PLATFORM = "-1";
    }
1
2
3
4
5
6
7
8
9
10
11

# 16.2. 分享文字

android:微信, QQ, QQ空间,新浪微博,平台自动选择

iOS:微信,微信朋友圈, QQ,新浪微博,平台自动选择 系统分享

string platform = "-1";
        switch (mSharePlatformDropdown.captionText.text)
        {
            case "微信朋友":
                platform = GConfig.SHARE_WEIXIN_PLATFORM;
                break;
            case "微信朋友圈":
                platform = GConfig.SHARE_WEIXIN_CIRCLE_PLATFORM;
                break;
            case "QQ":
                platform = GConfig.SHARE_QQ_PLATFORM;
                break;
            case "QQ空间":
                platform = GConfig.SHARE_CHANNEL_QZONE_PLATFORM;
                break;
            case "新浪":
                platform = GConfig.SHARE_SINA_WB_PLATFORM;
                break;
            case "平台":
                platform = GConfig.SHARE_SDK_CHOOSE_PLATFORM;
                break;
            case "系统分享":
                platform = GConfig.SHARE_SDK_SYSTEM_PLATFORM;
                break;

        }

GHomeManager.GetInstance().GShareText(platform, "这是文字分享", "2345", (code, msg, data) =>
                {
                    DemoUtil.ShowToastUI("code: " + code + ", msg: " + msg + "userData" + data["userData"]);
                });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# 16.3. 分享图片

android: 微信朋友, 微信朋友圈,QQ,新浪微博,平台自动选择

iOS:微信朋友,微信朋友圈, QQ,QQ空间,微博,平台自动选择 系统分享

GHomeManager.GetInstance().GShareImage(platform, "这是标题", "这是描述文案", filePath, "12345", (code, msg, data) =>
                    {
                        DemoUtil.ShowToastUI("code: " + code + ", msg: " + msg + "userData" + data["userData"]);
                    });
1
2
3
4

# 16.4. 分享视频

android: 微信朋友,QQ,平台自动选择

iOS:微信朋友,微信朋友圈, QQ,QQ空间,新浪,平台自动选择 系统分享

注意:iOS 系统分享时候 videoURL 传本地路径

GHomeManager.GetInstance().GShareVideo(platform, "这是标题", "这是描述文案", filePath, "https://www.bilibili.com/video/BV1kT4y1a7dV?t=0.0", "12345", (code, msg, data) =>
                    {
                        DemoUtil.ShowToastUI("code: " + code + ", msg: " + msg + "userData" + data["userData"]);
                    });
1
2
3
4

# 16.5. 分享音乐

android:QQ,平台自动选择

iOS:微信朋友,微信朋友圈, QQ,QQ空间,新浪,平台自动选择 系统分享

注意:iOS 系统分享时候 AudioURL 传本地路径

GHomeManager.GetInstance().GShareAudio(platform, "这是标题", "这是描述文案", filePath, "https://music.163.com/song?id=444324932", "12345", (code, msg, data) =>
                    {
                        DemoUtil.ShowToastUI("code: " + code + ", msg: " + msg + "userData" + data["userData"]);
                    });
1
2
3
4

# 16.6. 分享网站

android:微信朋友, QQ,新浪微博,平台自动选择

iOS:微信朋友,微信朋友圈, QQ,QQ空间,新浪,平台自动选择 系统分享

GHomeManager.GetInstance().GShareUrl(platform.ToString(), "这是标题", "这是描述文案", filePath, "https://www.sdo.com", "12345", (code, msg, data) =>
                    {
                        DemoUtil.ShowToastUI("code: " + code + ", msg: " + msg + "userData" + data["userData"]);
                    });
1
2
3
4

# 16.7. 分享录屏

//调用开始录屏接口。
GHomeManager.GetInstance().GStartRecord((code, msg, data) =>
                {
                    DemoUtil.ShowToastUI("code: " + code + ", msg: " + msg + "vedioPath" + data["vedioPath"]);
                });

//停止录屏并自动拉起分享
GHomeManager.GetInstance().GStopAndShareRecord((code, msg, data) =>
        {
            DemoUtil.ShowToastUI("code: " + code + ", msg: " + msg + "userData" + data["userData"]);
        });
1
2
3
4
5
6
7
8
9
10
11

# 17. 附录C:常用错误码以及回调指令

错误码 描述
0 操作成功
-10869615 用户拒绝隐私政策
-10869610 初始化失败
-100 登录取消
-10869608 登录失败
-10869607 用户未登录
-10869609 支付取消
-10869604 支付失败
-10869613 不支持的调用入参

# 18. FAQ

  • 如果游戏接入该GHome SDK之前 已有安卓接入相关工程A, 那么可以使A工程里的主activity(UnityPlayerActivity)继承GHome SDK 库里的UnityGHomeCall即可

Last Updated: 9/18/2024, 9:01:07 AM