# 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接入手册进行操作。目前只有unity团结引擎支持鸿蒙,如果接入的是鸿蒙平台,需要将游戏迁移到unity团结引擎。)
# 3.2. 通过unity配置面板配置AndroidManifest内的data等参数
点击菜单栏 CreateAsset/AddAndroidData, 可看到在Assets生成了ManifestDataAsset/AndroidConfig 配置文件
双击打开AndroidConfig.asset 在Inspector中 配置相应的参数,具体参数值有疑问的话可联系G家
填写完成点击
保存
按钮即可
# 3.3. 通过unity配置面板删除老的新增的三方登录的activity(不确定之前是否通过操作配置过新增相关activity都可以进行如下删除操作,确保老的配置的activity存在的话会得到删除)
点击菜单栏 ADeleteWxapiAndDyApiDerictory/DeleteWxapiAndDyApiDerictory, 可看到在Assets生成了WxapiAndDyapiFilePathAsset/AFilePathConfig 配置文件
双击打开AActivity.asset 在Inspector中 配置相应的参数,具体参数值有疑问的话可联系G家
填写完成点击
删除
按钮即可
# 3.4. 通过unity面板配置iOS三方参数
点击菜单栏 CreateAsset - AddiOSThirdConfig, 可看到在Assets生成了Editer/iOSThirdConfig.asset 配置文件
打开iOSThirdConfig.asset 在Inspector中 配置相应的参数,具体参数值有疑问的话可联系G家
填写完成点击
保存
按钮即可
# 3.5. iOS 内购和苹果登录的支持,打包Xcode脚本由于unity原因不能生效 需要在xcode工程中手动添加。
选中游戏target->Signing & Capabilities ->add Capability 添加In-App Purchase 和 Sign in with Apple
选中游戏target->Signing & Capabilities ->add Capability 添加Associated Domains 并添加 Domains为 applinks: + UnversalLink 的URL 例如(applinks:daoyu8.com)
# 3.6. 接入华为 IAP Kit
(应用内支付服务),接入前请按照官方文档 (opens new window)在导出的鸿蒙工程中,进行项目配置。
# 3.7.配置debug (开启ghome 控制台日志)
GHomeManager.GetInstance().GSetGHomeDebugMode(true); //发布版记得删除 或者配置成false
# 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");
});
}
});
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"]);
}
});
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");
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("初始化失败");
}
});
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、鸿蒙无此接口)
在游戏自有的包体强更场景(玩家必须更新到最新包体才可以玩游戏) 玩家点击更新按钮时,按照示例代码调用taptap渠道相关接口。
接口:
boolean IsTapTapChannel()
void TapTapUpdateGame(GHomeInterfaceCallback.GHomeCallback updateCallback)
参数说明:
updateCallback: 回调对象
注意事项:
包体强更场景 才需要调用该接口,普通更新无需调用。
- 游戏判断当前包体需强更时,当用户点击「更新」按钮时,则直接按照示例代码调用判断和更新接口。点击「取消」时,则关闭游戏或者提示玩家“不更新至最新版本,游戏无法玩”。
代码示例:
//游戏已走完更新检测并检测到需要强制更新,弹出了游戏自己的强制更新弹框,玩家点了 ‘更新’ 按钮,则调用如下代码:
if (GHomeManager.GetInstance().IsTapTapChannel())
{
GHomeManager.GetInstance().TaptapUpdateGame((code, msg, datad) =>
{
if (code == -1)
{
//TODO 玩家取消强制更新了。游戏自己处理后续逻辑
DemoUtil.ShowToastUI("玩家取消了强制更新");
}
else
{
//无需处理。
}
});
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 7.3. 账号踢下线上报接口(iOS 、鸿蒙无此接口)
踢下线登出SDK账号接口
接口:
GKickoff()
注意事项:
建议在用户被踢下线时调用该接口
代码示例:
GHomeManager.GetInstance().GKickoff();
# 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("登录失败!");
}
});
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");
});
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
{
//登录失败或取消, 游戏做登出操作即可
}
});
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
}
});
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 {
// 支付暂未成功,这种状态可能是用户未完成支付,也可能是尚未收到渠道的发货通知
// 游戏客户可以不做处理,用户下次登录时再做查询
}
});
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"]);
}
});
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" // 开发商后台配置的区组名称
},
...
]
}
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"]);
}
}
});
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游戏
},
...
]
}
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关闭(也可以关闭并重启)
}
});
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)
{
}
});
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");
# 11.2. 客户端显示/隐藏悬浮窗接口(iOS、鸿蒙无此接口)
游戏客户端需要在游戏登录成功之后显示悬浮窗,注销之后隐藏悬浮窗,否则可能无法通过渠道上线审核。
接口:
GShowFloatIcon(bool show)
参数说明:
show: true显示悬浮窗、false隐藏悬浮窗。
代码示例:
// 在登成功之后调用
GHomeManager.GetInstance().GShowFloatIcon(true);
// 在账号注销之后调用
GHomeManager.GetInstance().GShowFloatIcon(false);
2
3
4
5
# 11.3. 第三方渠道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"]);
});
2
3
4
5
# 11.3.1 提交游戏扩展数据(iOS、鸿蒙无此接口)
渠道要求游戏在运行过程中提交一些用于运营需要的扩展数据,以便双方对游戏内容进行更深度的运营。游戏在接入时请将代码示例中的玩家数据改为真实数据。本接口需在以下情况下调用:
玩家登陆成功后角色信息确定之后调用。
角色等级发生变化的时候调用。
创建新角色时调用。
参数说明:
//该接口的"submitType"的值分别为“createRole”,"selectServer","enterServer","levelUp","exitServer"时务必分别调用
注意事项:
"submitType" 请务必根据场景正确传值
代码示例:
long currentMillis = (long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalSeconds;
Dictionary<string, string> subData = new Dictionary<string, string>
{
{ "groupId", "10"}, // 当前登录的服id
{ "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) =>
{
//上报数据回调无需处理
});
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
# 11.3.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();
}
});
2
3
4
5
6
7
8
9
10
11
12
13
14
# 11.3.3 确认退出游戏接口
玩家点击确认退出游戏按钮时调用
GHomeManager.GetInstance().GDoExtend(1012, null, null);
# 12. 其他接口(非必接)
# 12.1. 获取渠道号
# 12.1.1. 获取一级渠道号(iOS、鸿蒙无此接口)
游戏可调用以下接口来获取一级渠道号
接口:
GGetApplicationSuperChannel();
参数说明:
无
注意事项:
在初始化完成后才能调用。
代码示例:
string applicationChannel = GHomeManager.GetInstance().GGetApplicationSuperChannel();
# 12.1.2. 获取二级渠道号(iOS、鸿蒙无此接口)
游戏可调用以下接口来获取二级渠道号
接口:
GGetCPSChannelCode()
代码示例:
string cpsChannel = GHomeManager.GetInstance().GGetCPSChannelCode();
# 12.1.3. 获取G家设备id(iOS、鸿蒙无此接口)
G家使用的设备id的字符串
GGetGHomeDeviceId()
代码示例:
string gDeviceId = GHomeManager.GetInstance().GGetGHomeDeviceId();
# 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");
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 12.2. 配置环境域名
GHomeManager.GetInstance().GSetNormalDomain("https://mgame-gray.sdo.com");
GHomeManager.GetInstance().GSetPayDomain("https://mgame-gray.sdo.com");
2
# 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"]);
}
});
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
}
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);
});
2
3
4
5
# 15. 敏感词过滤接口(非必接,请看注意事项。iOS、鸿蒙无此接口)
【注意(重要):】
该接口仅仅是一个interface空接口,如果游戏需要在某些渠道使用渠道的敏感词接口(例如wegame),则需要调用这个接口。
在 ghome sdk 或其他渠道,不会有任何作用,“原文入参,原文出参”。游戏在这些场景需要自行实现所有敏感词过滤功能(或者使用其他第三方sdk)
一般建议使用该接口的游戏,可以单独实现母包(和官方登录或者其他渠道分开),以便在聊天、昵称设定(等所有用户可输入信息地方)实现渠道使用的敏感词过滤(目前仅仅wegame渠道支持)。
基于第三点仅仅是一种游戏的实现方案建议,如果游戏有其他方便实现的方案,也可以操作。但原则上是需要完成敏感词过滤,并了解 ghome sdk 仅仅是一个空接口(功能代理)。
另外,如果游戏在wegame渠道的母包中实现了一次自己的敏感词,则wegame渠道包则会:用户输入->游戏母包的敏感词过滤->ghome sdk 接口代理->wegame 敏感词->返回结果。
该接口我们不会记录任何调用信息,不会有任何日志,因为属于用户隐私的敏感信息。所以请上线前使用该接口的游戏都需要经过测试(所有场景,例如聊天、昵称设置、等等),线上是不会对用户记录任何有关的行为数据。
接口:
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"]);
}
});
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";
}
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"]);
});
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"]);
});
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"]);
});
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"]);
});
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"]);
});
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"]);
});
2
3
4
5
6
7
8
9
10
11
# 17. 附录:常用错误码以及回调指令
错误码 | 描述 |
---|---|
0 | 操作成功 |
-10869615 | 用户拒绝隐私政策 |
-10869610 | 初始化失败 |
-100 | 登录取消 |
-10869608 | 登录失败 |
-10869607 | 用户未登录 |
-10869609 | 支付取消 |
-10869604 | 支付失败 |
-10869613 | 不支持的调用入参 |
# 18. FAQ
- 如果游戏接入该GHome SDK之前 已有安卓接入相关工程A, 那么可以使A工程里的主activity(UnityPlayerActivity)继承GHome SDK 库里的UnityGHomeCall即可