# 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
]
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()));
});
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
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();
# 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
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
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
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()));
});
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
}
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()));
});
2
3
4
- "data", JSON格式说明:
{
"message":[
{
"area_code":"1", // 开发商后台配置的区服ID
"name":"area1" // 开发商后台配置的区服名称
"group_id":"1" // 开发商后台配置的区组ID
"group_name":"gourp1" // 开发商后台配置的区组名称
},
...
]
}
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()));
});
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游戏
},
...
]
}
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()));
}
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()));
});
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));
}
}
});
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
}
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");
# 11.2. 客户端显示/隐藏悬浮窗接口(iOS 无此接口)
游戏客户端需要在游戏登录成功之后显示悬浮窗,注销之后隐藏悬浮窗,否则可能无法通过渠道上线审核。
接口:
void ShowFloatIcon(bool show);参数说明:
show: true显示悬浮窗、false隐藏悬浮窗。
代码示例:
// 在登成功之后调用
GHomeBridge::ShowFloatIcon(true);
// 在账号注销之后调用
GHomeBridge::ShowFloatIcon(false);
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()));
});
2
3
4
# 11.3.1 提交游戏扩展数据(iOS 无此接口)
渠道要求游戏在运行过程中提交一些用于运营需要的扩展数据,以便双方对游戏内容进行更深度的运营。游戏在接入时请将代码示例中的玩家数据改为真实数据。本接口需在以下情况下调用:
玩家登陆成功后角色信息确定之后调用。
角色等级发生变化的时候调用。
创建新角色时调用。
参数说明:
//该接口的"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
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
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();
# 12.1.2. 获取二级渠道号(iOS 无此接口)
游戏可调用以下接口来获取二级渠道号
接口:
std::string GGetCPSChannelCode()代码示例:
std::string cpsChannel = GHomeBridge::GetCPSChannelCode();
# 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 {
});
2
3
4
# 14. 敏感词过滤接口(非必接,请看注意事项。iOS 无此接口)
【注意(重要):】
该接口仅仅是一个interface空接口,如果游戏需要在某些渠道使用渠道的敏感词接口(例如wegame),则需要调用这个接口。
在 ghome sdk 或其他渠道,不会有任何作用,“原文入参,原文出参”。游戏在这些场景需要自行实现所有敏感词过滤功能(或者使用其他第三方sdk)
一般建议使用该接口的游戏,可以单独实现母包(和官方登录或者其他渠道分开),以便在聊天、昵称设定(等所有用户可输入信息地方)实现渠道使用的敏感词过滤(目前仅仅wegame渠道支持)。
基于第三点仅仅是一种游戏的实现方案建议,如果游戏有其他方便实现的方案,也可以操作。但原则上是需要完成敏感词过滤,并了解 ghome sdk 仅仅是一个空接口(功能代理)。
另外,如果游戏在wegame渠道的母包中实现了一次自己的敏感词,则wegame渠道包则会:用户输入->游戏母包的敏感词过滤->ghome sdk 接口代理->wegame 敏感词->返回结果。
该接口我们不会记录任何调用信息,不会有任何日志,因为属于用户隐私的敏感信息。所以请上线前使用该接口的游戏都需要经过测试(所有场景,例如聊天、昵称设置、等等),线上是不会对用户记录任何有关的行为数据。
接口:
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 {
});
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
}
});
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;
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
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