# GHOME SDK 开发手册 for UE c++

# 1. 前言

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

  • UE 版本要求: UE 4.22.3 or later;

  • 下文中的 Unreal 是 UNREAL ENGINE(虚幻引擎)的简写;

  • UE各个引擎版本对应的环境配置请看第16章节

  • 注意事项:如果有修改相关安卓编译版本,请记得清理UE工程临时编译目录。然后再次打包

  • 常用回调错误码请看错误码详情

  • GHomeSDK 内Error Code 可以在$S(PluginDir)/GHomeSDK/Source/GHomeSDK/Public/GHomeBridge.h内找到

# 2. SDK接入流程概述

GHomeSDK Unreal SDK 平台支持:

GHomeSDK Unreal SDK 已同时集成 Android、iOS 平台架构。

  • 去下载GHome SDK,请在页面内 GHome 国内进行选择下载.

  • 导入Plugins文件

    游戏工程的根目录(xxxx.uproject文件所在目录)下。如果不存在 Plugins 文件夹,先新建一个。然后将 GHomeSDK 拷入 Plugins 文件夹,完成该步骤后的目录如下

# 3. Android 环境以及参数配置

# 3.1 设置 minSdkVersion: API 23 or later

# 3.2 放入oaid 证书文件. 以及微信登录。叨鱼登录相关的配置文件

  • 在$S(PluginDir)/GHomeSDK/Source/GHomeSDK/Android/assets目录下放入oaid证书文件,文件名为: 游戏包名.cert.pem(例如:com.ghome.sdk.demo.cert.pem)

  • 在$S(PluginDir)/GHomeSDK/Source/GHomeSDK/Android/Java/dyapi 目录下修改文件内容第一行信息,即包路径为: package 游戏包名

  • 在$S(PluginDir)/GHomeSDK/Source/GHomeSDK/Android/Java/wxapi 目录下修改文件内容第一行信息,即包路径为: package 游戏包名

# 3.3 修改 GHomeSDK_APL.xml

  • 在项目工作目录下打开$S(PluginDir)/GHomeSDK/Source/GHomeSDK/GHomeSDK_APL.xml file ,修改gradle的 defaultConfig配置: QQ_APP_ID,如下
//在腾讯后台申请应用得到的appid
 manifestPlaceholders = [
                "QQ_APP_ID" : "101562812",  // 腾讯后台申请应用获得的APPID
        ]
1
2
3
4
  • 修改文件Java 下文件拷贝路径(如下的 com/ghome/sdk/demo, 改成游戏包名路径)

    <resourceCopies>
            <log text="Copying res files to staging" />
            <copyDir src="$S(PluginDir)/Android" dst="$S(BuildDir)" />
            <copyDir src="$S(PluginDir)/Android/Java" dst="$S(BuildDir)/src/com/ghome/sdk/demo" force="true"/>
        </resourceCopies>
    
    1
    2
    3
    4
    5

# 4. IOS 环境配置

  • 在GHomeSDK.Build.cs文件中将iOS bundle文件修改问本地路径

  • Xcode最低版本 14.2 可能需要在Source/XXX.Traget.cs 和 Source/XXXEditor.Traget.cs中添加一下内容用来使旧版本UE4支持14.2

     bOverrideBuildEnvironment = true;
     AdditionalCompilerArguments = "-Wno-unused-but-set-variable";
    
    1
    2
  • 在UE4 Editor编辑->项目设置->平台->IOS->Additional Plist Data中添加 所需要的三方平台参数具体参考GHome iOS 手游通行证文档

  • 在导出的Xcode工程中在 Signing & Capabilities中 添加 In-App Purchase 、 Sign in with Apple 、 Associated Domains(添加 universal link)

# 5. 编译工程

  • 编译完成后重启 UE Editor,在 UE Editor 中打开插件管理器,可以看到 GHomeSDK 已经引入工程了,确定 GHomeSDK 是 Enabled 状态。如图

  • 在游戏工程的 .build.cs 新增 GHomeSDK 依赖

# 6. SDK内隐私弹框功能接口(必接)

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

  • 接口:

    void DoPrivacyAgreement(std::string appId, const GHomeCallback &gCallback);
  • 参数说明:

    appId: 游戏的appId

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

  • 注意事项:

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

  • 代码示例:

GHomeBridge::DoPrivacyAgreement("791000008", [](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));
    });
1
2
3
4

# 7. 基础功能(必接)

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

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

  • 接口:

    Initialize(std::string gameId, const GHomeCallback &callback);
  • 参数说明:

    appId: 游戏的appId

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

  • 注意事项:

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

  • 代码示例:
    #if PLATFORM_ANDROID | PLATFORM_IOS
    UE_LOG(LogTemp, Warning, TEXT("initappID : %s"), "791000008");
    GHomeBridge::Initialize("791000008", [](int code, std::string messageStr, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
        UE_LOG(LogTemp, Display, TEXT("retCode : %d, msg: %s"), code, UTF8_TO_TCHAR(messageStr.c_str()));
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(messageStr.c_str()));

        // success
        if (code == ERROR_CODE_SUCCESS) {
            //初始化成功
        }
        else if (code == ERROR_INIT_FAILED) {
        }
        else if (code == EVENT_ACCOUNT_LOGOUT) {
            // 请在这里登出游戏账号
        }
        else if (code == EVENT_ACCOUNT_CHANGED) {
            //来自sdk内的消息。切换账号成功。请在这里用新的userid和 ticket 做游戏重新登录
            UE_LOG(LogTemp, Warning, TEXT("ticket : %s, userid: %s, isNewUser: %s"), UTF8_TO_TCHAR(((data->find("ticket"))->second).c_str()), UTF8_TO_TCHAR(((data->find("userid"))->second).c_str()), UTF8_TO_TCHAR(((data->find("isNewUser"))->second).c_str()));
        }
        else if (code == EVENT_ACCOUNT_LOGOUT_ONLY) {
            //请在这里登出游戏账号
        }
        else if (code == EVENT_EXIT_GAME) {
            //请在这里直接大退游戏
        }
});
#endif
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

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

踢下线登出SDK账号接口

  • 接口:

    void KickOff()
  • 注意事项:

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

  • 代码示例:

GHomeBridge::KickOff();
1

# 8. 账号功能(必接)

# 8.1. 客户端登录

游戏客户端可以调用登录接口为玩家提供登录功能。

  • 接口:

    void Login(const GHomeCallback &gCallback);
  • 参数说明:

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

  • 代码示例:

#if PLATFORM_ANDROID | PLATFORM_IOS
    GHomeBridge::Login([](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
        UE_LOG(LogTemp, Display, TEXT("retCode : %d, msg: %s"), code, UTF8_TO_TCHAR(message.c_str()));
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));

        // success
        if (code == ERROR_CODE_SUCCESS) {
            //login success
            //key "userid", "ticket"
            UE_LOG(LogTemp, Warning, TEXT("ticket : %s, userid: %s, isNewUser: %s"), UTF8_TO_TCHAR(((data->find("ticket"))->second).c_str()), UTF8_TO_TCHAR(((data->find("userid"))->second).c_str()), UTF8_TO_TCHAR(((data->find("isNewUser"))->second).c_str()));

        }else if(code == ERROR_INIT_NOT_FINISHED){
            // retry init

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

# 8.2. 客户端注销接口

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

  • 接口:

    void Logout(const GHomeCallback &callback)
  • 参数说明:

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

  • 代码示例:

#if PLATFORM_ANDROID | PLATFORM_IOS
    GHomeBridge::Logout([](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
        UE_LOG(LogTemp, Display, TEXT("retCode : %d, msg: %s"), code, UTF8_TO_TCHAR(message.c_str()));
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));
    });
#endif
1
2
3
4
5
6
7

# 8.3. 切换账号接口

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

  • 接口:

    void SwitchAccount(const GHomeCallback& agreementCallback, const GHomeCallback& onSwitchAccountCallback)
  • 参数说明:

    agreementCallback:游戏自定义隐私弹框则需要。 ,使用sdk的隐私逻辑无需关注,传NULL即可

    onSwitchAccountCallback: 切换账号操作回调对象,用来回调执行结果,详情请参考代码事例。

  • 代码示例:

#if PLATFORM_ANDROID
    GHomeBridge::SwitchAccount(NULL, [](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
        UE_LOG(LogTemp, Display, TEXT("retCode : %d, msg: %s"), code, UTF8_TO_TCHAR(message.c_str()));
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));
        if (code == ERROR_CODE_SUCCESS) {
            //userid, ticket
            UE_LOG(LogTemp, Warning, TEXT("ticket : %s, userid: %s, isNewUser: %s"), UTF8_TO_TCHAR(((data->find("ticket"))->second).c_str()), UTF8_TO_TCHAR(((data->find("userid"))->second).c_str()), UTF8_TO_TCHAR(((data->find("isNewUser"))->second).c_str()));
}
    });
#endif
1
2
3
4
5
6
7
8
9
10
11

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

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

  • 接口:

    void WrittenOff(const GHomeCallback &callback);
  • 参数说明:

    callback: 回调对象。

  • 代码示例:

GHomeBridge::WrittenOff([](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));
    });
1
2
3
4

# 9. 支付功能(必接)

# 9.1. 客户端支付接口

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

  • 接口:

    void Pay(std::string groupId, std::string orderId, std::string areaId, std::string productId, std::string extendStr, const GHomeCallback &callback);
  • 参数说明:

    groupId: 组ID。没有则传空串

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

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

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

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

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

  • 注意事项:

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

  • 代码示例:

void UGHomeBPFuncLib::pay()
{
    GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, TEXT("Request Payyyyy"));
#if PLATFORM_ANDROID
    GHomeBridge::Pay("1", "order123456123456", "1", "a123", "custimeorderInfo", [](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
        UE_LOG(LogTemp, Display, TEXT("retCode : %d, msg: %s"), code, UTF8_TO_TCHAR(message.c_str()));
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));
    });
#endif


#if PLATFORM_IOS
    GHomeBridge::Pay("1", "order123456123456", "1", "com.ghome.yuwan", "custimeorderInfo", [](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));
    });
#endif

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

# 10. 扩展功能(可选)

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

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

  • 接口:

    void GetAreaConfig(const GHomeCallback &callback);
  • 参数说明:

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

  • 注意事项:

    暂无

  • 代码示例:

GHomeBridge::GetAreaConfig([](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));
    });
1
2
3
4
  • "data", 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家平台登记的商品配置。

  • 接口:

    void GetProductConfig(const GHomeCallback &callback);
  • 参数说明:

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

  • 代码示例:

GHomeBridge::GetProductConfig([](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
//key data["data"]
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));
    });
1
2
3
4
5
  • "data",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家平台的应用时(如:客服、论坛等。),可以调用该接口获取一个一次性小票提供个应用完成登录。

一次性票据常见使用场景的时序图,点这里 (opens new window)

  • 接口:

    void GetTicket(std::string appId, std::string areaId, const GHomeCallback &callback);
  • 参数说明:

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

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

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

  • 注意事项:

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

  • 代码示例:

GHomeBridge::GetTicket("791000008", "1", [](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
//获取 ticket . data .ticket
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));
        if (code == ERROR_CODE_SUCCESS) {
            UE_LOG(LogTemp, Warning, TEXT("ticket : %s"), UTF8_TO_TCHAR(((data->find("ticket"))->second).c_str()));
        }
1
2
3
4
5
6
7

# 10.4. 打开二维码扫码

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

  • 接口:

    void ScanQRCode(std::string extend, const GHomeCallback &callback);
  • 参数说明: extInfo: 扩展信息,扫码支付的话会在发货时原样返回给游戏

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

  • 注意事项:

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

  • 代码示例:

GHomeBridge::ScanQRCode("extensInfoStrRandom", [](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));
    });
1
2
3
4

# 10.5 获取协议URL

游戏获取用户条款和隐私政策页面的URL链接

  • 接口:

    void GetAgreement(std::string appId, const GHomeCallback &callback)

  • 参数说明: appId: 游戏在GPOP平台上申请得到的ID。

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

  • 注意事项:必须在登录成功之后才可以使用该接口。

  • 代码示例:

#include "FGHAgreementArray.h"
#include "FGHAgreementInfo.h"

....


GHomeBridge::GetAgreement("791000008", [](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));
// success
        if (code == ERROR_CODE_SUCCESS) {
            FGHAgreementArray ArrayData;
            if (!FJsonObjectConverter::JsonObjectStringToUStruct(UTF8_TO_TCHAR(((data->find("data"))->second).c_str()), &ArrayData, 0, 0))
            {
                UE_LOG(LogTemp, Display, TEXT("FGHAgreementArray Convert Fail"));
            }

            for (auto& FGHAgreementInfo : ArrayData.agreements)
            {
                FString PrinStr = FString::Printf(TEXT("FGHAgreement url: %s  type: %s"), *FGHAgreementInfo.url, *FString::FromInt(FGHAgreementInfo.type));
                GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, PrinStr);
                UE_LOG(LogTemp, Display, TEXT("FGHAgreement url: %s \n type: %s"), *FGHAgreementInfo.url, *FString::FromInt(FGHAgreementInfo.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
  • data.get("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

# 11. 渠道接口(必接)

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

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

  • 接口:

    void LoginArea(std::string areaId, std::string groupId);
  • 参数说明:

    areaId: 用户进入的区号。

    groupId: 组号, 没有可传空串

  • 代码示例:

GHomeBridge::LoginArea("1","2");
1

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

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

  • 接口:

    void ShowFloatIcon(bool show);
  • 参数说明:

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

  • 代码示例:

// 在登成功之后调用
GHomeBridge::ShowFloatIcon(true);

// 在账号注销之后调用
GHomeBridge::ShowFloatIcon(false);
1
2
3
4
5

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

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

  • 接口:

    void DoExtend(int command, std::unique_ptr<std::unordered_map<std::string, std::string>> params, const GHomeCallback &callback);
  • 参数说明:

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

    subData: 请求参数,类型为map

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

  • 注意事项:

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

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

GHomeBridge::DoExtend(1003, mapParams, [](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));
    });
1
2
3
4
# 11.3.1 提交游戏扩展数据(iOS 无此接口)

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

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

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

  3. 创建新角色时调用。

  • 参数说明:

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

  • 注意事项:

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

  • 代码示例:

#if PLATFORM_ANDROID

    // 声明一个存储Json内容的字符串
    FString OutJsonData;
    TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&OutJsonData);

    // 声明Json对象写入开始
    Writer->WriteObjectStart();
    Writer->WriteValue(TEXT("submitType"), TEXT("createRole")); //上报场景:  "createRole", "selectServer"(选择服务器,账号登录成功 ,角色进入游戏前), "enterServer"(选择服务器进入游戏后), "levelUp"(角色升级), "exitServer"(退出服务器,退出游戏)
    Writer->WriteValue(TEXT("roleId"), TEXT("R0010")); // 当前登录的玩家角色ID         
    Writer->WriteValue(TEXT("roleName"), TEXT("令狐一冲")); // 当前登录的玩家角色名
    Writer->WriteValue(TEXT("roleLevel"), TEXT("99"));// 当前登录的玩家角色等级
    Writer->WriteValue(TEXT("roleCreateTime"), TEXT("1488264008"));// 角色创建时间,格式为unix时间戳,该时间为服务器时间,务必传一个数字
    Writer->WriteValue(TEXT("zoneId"), TEXT("23"));// 当前登录的游戏区服ID
    Writer->WriteValue(TEXT("zoneName"), TEXT("游戏一区-逍遥谷"));// 当前登录的游戏区服ID
    Writer->WriteValue(TEXT("roleBalance"), TEXT("1456"));;// 务必传一个数字,若无,传"0"
    Writer->WriteValue(TEXT("vipLevel"), TEXT("56"));;// 务必传一个数字,若无,传"0"
    Writer->WriteValue(TEXT("partyName"), TEXT("帮派名称"));//若没有就传"无"

    Writer->WriteValue(TEXT("professionid"), TEXT("当前登录玩家的职业ID"));//没有就传"0"
    Writer->WriteValue(TEXT("professionrolename"), TEXT("当前登录玩家的职业称号")); //不能为空,不能为null,没有就传 "0"
    Writer->WriteValue(TEXT("Private"), TEXT("当前登录玩家的职业名称"));//没有就传"无"
    Writer->WriteValue(TEXT("gender"), TEXT("男"));//不能为空,不能为null,可传参数"男"、"女"、"无"
    Writer->WriteValue(TEXT("payTotal"), TEXT("0"));//累计充值金额 元为单位,文不能为空,必须为数字,若没有就传"0"
    Writer->WriteValue(TEXT("experience"), TEXT("2342354"));//不能为空,用户当前经验值,必须为数字,不能为null,若没有就传"0"
    Writer->WriteValue(TEXT("balance"), TEXT("0"));//帐号余额 若没有则传 "0"
    Writer->WriteValue(TEXT("power"), TEXT("0"));//战力值 不能为空,必须为数字,不能为null,没有就传“0”
    Writer->WriteValue(TEXT("partyid"), TEXT("当前用户所属帮派帮派ID"));////不能为空,必须为数字,不能为null,若无,传入 “0”
    Writer->WriteValue(TEXT("partyroleid"), TEXT("帮派角色ID")); //帮派会长 / 帮主必传1,其他可自定义,不能为空,不能为null,若无,传入 “0”
    Writer->WriteValue(TEXT("partyrolename"), TEXT("帮派称号名称"));//不能为空,不能为null,若无,传入“无”


    Writer->WriteObjectEnd();


    // 停止写入
    Writer->Close(); 

    std::unique_ptr<std::unordered_map<std::string, std::string>> params(new std::unordered_map<std::string, std::string>);
    UE_LOG(LogTemp, Warning, TEXT("start put data"));
    params->emplace("data", TCHAR_TO_UTF8(*OutJsonData));

    UE_LOG(LogTemp, Warning, TEXT("jsonStr: %s"), *OutJsonData);

    GHomeBridge::DoExtend(EXTEND_COMMAND_SUBMIT_EXTEND_DATA, std::move(params), [](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
        UE_LOG(LogTemp, Display, TEXT("retCode : %d, msg: %s"), code, UTF8_TO_TCHAR(message.c_str()));
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));
        if (code == ERROR_CODE_SUCCESS) {
            //无需处理
        }
        else {
            //无需处理
        }
    });
#endif
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
46
47
48
49
50
51
52
53
54
55
56
# 11.3.2 游戏退出页接口(iOS 无此接口)

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

  • 代码示例:
#if PLATFORM_ANDROID
    GHomeBridge::DoExtend(EXTEND_COMMAND_EXIT_PAGE, NULL, [](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
        UE_LOG(LogTemp, Display, TEXT("retCode : %d, msg: %s"), code, UTF8_TO_TCHAR(message.c_str()));
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));
        if (code == ERROR_CODE_SUCCESS) {
            //这里直接退出游戏
        }
        else {
            //这里直接弹出游戏 自己的退出游戏确认框
        }
    });
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13

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

# 12.1. 获取渠道号

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

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

  • 接口:

    std::string GetApplicationSuperChannel();
  • 参数说明:

  • 注意事项:

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

  • 代码示例:

string applicationSpChannel = GHomeBridge::GetApplicationSuperChannel();
1
# 12.1.2. 获取二级渠道号(iOS 无此接口)

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

  • 接口:

    std::string GGetCPSChannelCode()
  • 代码示例:

std::string cpsChannel = GHomeBridge::GetCPSChannelCode(); 
1

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

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

  • 接口:

    void ChangeThirdBindPhone(std::string appId, const GHomeCallback &callback);
  • 参数说明:

    appId: 游戏在Gpop平台上申请得到的ID。

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

  • 代码示例:

GHomeBridge::ChangeThirdBindPhone("791000008", [](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {

    });
1
2
3
4

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

【注意(重要):】

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

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

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

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

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

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

  • 接口:

    void FilterSensitiveWord(std::string inputWord, const GHomeCallback &callback)
  • 参数说明:

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

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

  • 代码示例:

  GHomeBridge::FilterSensitiveWord("一起来玩游戏吧", [](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {

    });
1
2
3
4

# 15. 分享

# 15.1 调用该接口拉起文本,图片,音频,视频分享

  • 接口:

    void Share(int mediaType, int sharePlatform, std::string text, std::string descriptionStr, std::unique_ptr<std::vector<std::string>> mediaPaths, const GHomeCallback &callback);
  • 参数说明:

    mediaType: 要分享的内容的类型(TYPE_TEXT,TYPE_IMAGE, TYPE_AUDIO, TYPE_VIDEO)

    sharePlatform: 要通过什么平台分享(PLATFORM_WE_CHAT 等。具体可传参数请看以下入参常量)。

    text: 要分享的文字内容

    descriptionStr: 要分享的内容概述

    mediaPaths: 图片路径

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

  • 代码示例:

std::unique_ptr< std::vector<std::string>> imgPaths(new std::vector<std::string>);

    imgPaths->emplace_back("/storage/emulated/0/Android/data/com.ghome.sdk.demo/files/1_demo.jpg");//要分享的图片存储路径


    //share one picture with friend by wechat
    GHomeBridge::Share(TYPE_IMAGE, PLATFORM_WE_CHAT, "image share content", "picture share", std::move(imgPaths), [](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
        UE_LOG(LogTemp, Display, TEXT("retCode : %d, msg: %s"), code, UTF8_TO_TCHAR(message.c_str()));
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));
        if (code == ERROR_CODE_SUCCESS) {
            //share success
        }
        else {
            //share fail
        }
    });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  • mediaType 入参可以是以下常量
  const static int TYPE_TEXT = 0;
  const static int TYPE_IMAGE = 1;
  const static int TYPE_AUDIO = 2;
  const static int TYPE_VIDEO = 3;


  const static int PLATFORM_WE_CHAT = 10;
  const static int PLATFORM_WE_CIRCLE = 11;
  const static int PLATFORM_WE_QQ = 12;
  const static int PLATFORM_WE_QZONE = 13;
  const static int PLATFORM_WE_WEIBO = 14;
  const static int PLATFORM_WE_SDK = 15;
  const static int PLATFORM_WE_SYSTEM = -1;
1
2
3
4
5
6
7
8
9
10
11
12
13

# 15.2 调用该接口拉起录屏 和 结束录屏并分享

  • 接口:

    void Record(const GHomeCallback &callback);

    void StopRecordAndShare(const GHomeCallback &callback);

  • 参数说明:

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

  • 代码示例:

GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Orange, TEXT("Request StartRecord"));
#if PLATFORM_ANDROID | PLATFORM_IOS
    GHomeBridge::Record([](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
        UE_LOG(LogTemp, Display, TEXT("retCode : %d, msg: %s"), code, UTF8_TO_TCHAR(message.c_str()));
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));

});

#endif





GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Orange, TEXT("Request StopAndShareRecord"));
#if PLATFORM_ANDROID | PLATFORM_IOS
    GHomeBridge::StopRecordAndShare([](int code, std::string message, std::unique_ptr<std::unordered_map<std::string, std::string>> data)
        ->void {
        UE_LOG(LogTemp, Display, TEXT("retCode : %d, msg: %s"), code, UTF8_TO_TCHAR(message.c_str()));
        GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Blue, UTF8_TO_TCHAR(message.c_str()));

    });

#endif
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

# 16.引擎版本对应环境配置

# 版本: UE 4.22.3

  • ndk r14
  • OpenJDK 11.0.21
  • compileSdkVersion 31
  • Android minSdkVersion 23
  • Android Target SDK 33
  • Android Build-Tools 30.0.3
  • gradle version 6.7
  • com.android.tools.build:gradle:4.1.1
  • useAndroidX

# 版本: UE 4.24.3

  • ndk r14
  • OpenJDK 11.0.21
  • compileSdkVersion 31
  • Android Target SDK 33
  • Android Build-Tools 30.0.3
  • gradle version 6.5
  • com.android.tools.build:gradle:4.1.1
  • useAndroidX

# 版本: UE 4.27.2

  • ndk r21
  • OpenJDK 11.0.21
  • compileSdkVersion 31
  • Android minSdkVersion 23
  • Android Target SDK 33
  • Android Build-Tools 30.0.3
  • gradle version 6.7.1
  • com.android.tools.build:gradle:4.0.0
  • useAndroidX

# ---

Last Updated: 2023/12/18 11:06:25