手游直通车 SDK 开发手册 for IOS
1. 前言
本文用于指导游戏开发商接入GHome SDK,文中包含客户端的接入说明,以及服务器接口的介绍;
2. SDK接入流程概述
-
搭建SDK开发环境
-
完成隐私政策展示逻辑(请务必在完成隐私的展示逻辑之后再进行调用初始化 以及敏感权限申请等操作)(游戏使用sdk隐私政策弹框请接接口4.1; 游戏自己实现隐私政策弹框请接接口4.2)
-
初始化SDK
-
初始化成功,
-
用户在进行购买时,调用支付功能相关接口
-
其他功能接口,可根据业务需要适时调用
-
接入第三方渠道的个性化功能时,可调用SDK扩展接口实现
注意:游戏在启动游戏时需对设备网络进行判断,若无网络的情况下,游戏需实现对用户的弹框提示。
3. 开发环境要求
3.1. 引用SDK提供的Framework、资源包
- 对于iOS开发者,建议使用最新版本XCode进行开发(使用的版本号一定要与sdk打包文件文件名中的XCode匹配),iOS版本需求为8.0及以上。
No. | 文件名称 | 说明 |
---|---|---|
1 | ghome_sdk.framework | 官方Framework包文件 |
2 | ghome_sdk.bundle(在ghome_sdk.framework里面) | 官方IOS资源 |
3 | WeiboSDK.bundle(在ghome_sdk.framework里面) | 依赖的三方IOS资源 |
4 | GT3Captcha.bundle(在ghome_sdk.framework里面) | 极验资源 |
5 | face-tracker-v001.bundle(在ghome_sdk.framework里面) | 人脸识别资源 不接人脸不需要引入 |
6 | WBCloudReflectionFaceVerify.bundle(在ghome_sdk.framework里面) | 人脸识别资源 不接人脸不需要引入 |
7 | WeGameSDKResource.bundle(在ghome_sdk.framework里面) | Wegame资源文件,请不要移动WeGameSDKResource.bundle存放位置 |
8 | GShareSDK.bundle | 分享需要的资源文件,不需要分享功能可不加 |
3.2. 添加所需要的库文件
添加资源文件:(注:ghome_sdk.framework需要添加进General->Framework, Libraries,and Embedded Content中 并且Embed属性为 Eembed & Sign)
添加bundle文件
3.3. 修改工程配置
1.注:确保 Build Settings -> Build Options-> always embed swift standard libraries 设置为 YES
2.在工程配置里头,找到Linking部分,修改Other Linker Flags,添加内容:-ObjC
3.在Info.plist下加入下面的配置:
NSAppTransportSecurity 下添加 NSAllowsArbitraryLoads YES
4.添加部分访问权限
Privacy - Camera Usage Description "需要使用相机"
Privacy - Tracking Usage Description "本应用需要访问你的“设备标识(IDFA)”"
5.全局关闭暗黑模式:
在 Info.plist 文件中,添加 key 为 User Interface Style,类型为 String,value 设置为 Light 即可
3.4. 添加URL Scheme
URL Scheme用于外部应用呼起,值为你的bundleId
3.5. 在Appdelegate中添加函数
- (void)applicationDidEnterBackground:(UIApplication *)application {
[[GHomeAPI sharedGHome] applicationDidEnterBackground:application];
}
- (void)applicationWillEnterForeground:(UIApplication *)application {
[[GHomeAPI sharedGHome] applicationWillEnterForeground:application];
}
4. 基础功能
4.1SDK隐私协议接口
- 隐私协议接口定义
/**
* 初始化
* @param delegate 委托对象
* appId 游戏ID
*/
-(void)showUserAgreement:(id <GHomeAPIShowUserAgreementDelegate>)delegate
appId:(NSString *)appId;
- 隐私协议接口调用示例
[[GHomeAPI sharedGHome] showUserAgreement:self appId:@"1000"];
- 隐私协议接口回调示例
- (void)showUserAgreementResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg{
NSString * string = [NSString stringWithFormat:@"%ld,%@",(long)resultCode,resultMsg];
}
- 隐私协议接口回调说明
-
当resultCode为 0 时表示用户同意协议,否则均表示为未同意协议,游戏可自行处理后续逻辑。
- 只有当回调结果为0时(用户同意协议),方可进行初始化调用
4.2 SDK隐私协议自定义模式
-
询问接口定义
/** * 询问是否展示用户协议及隐私条款弹框 * appId 游戏ID(必须) * isFromLogin 游戏在两种场景之前需要调用该接口获取是否显示隐私协议弹框。 场景1: 启动游戏 传no 场景2: 调用GHome的login接口之前 传yes * needShow 回调结果 是否需要弹框 */ - (void)ifNeedShowUserAgreementAppId:(NSString *)appId isFromLogin:(BOOL)isFromLogin callback:(void (^)(BOOL needShow,NSString* tip))callback;
-
通知隐私协议结果接口定义
/** * 用户协议及隐私条款弹框是否同意 将用户点击结果回调通知SDK * isAgree 用户点击结果 */ - (void)userIsAgreeAgreement:(BOOL)isAgree;
-
接口调用示例
[[GHomeAPI sharedGHome] ifNeedShowUserAgreementAppId:self.appIdTextField.text isFromLogin:NO callback:^(BOOL needShow, NSString *tip) { NSString * string = [NSString stringWithFormat:@"询问服务端是否需要弹框,结果:%d,提示:%@", needShow,tip]; [self appendLogInfo:string]; if (needShow) { UIAlertController *alertVc = [UIAlertController alertControllerWithTitle:@"隐私协议" message:@"我是自定义隐私协议" preferredStyle:UIAlertControllerStyleAlert]; //默认只有标题 没有操作的按钮:添加操作的按钮 UIAlertAction UIAlertAction *cancelBtn = [UIAlertAction actionWithTitle:@"不同意" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { [self appendLogInfo:@"不同意隐私协议"]; [[GHomeAPI sharedGHome] userIsAgreeAgreement:NO]; }]; UIAlertAction *sureBtn = [UIAlertAction actionWithTitle:@"同意" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) { [self appendLogInfo:@"同意隐私协议"]; [[GHomeAPI sharedGHome] userIsAgreeAgreement:YES]; //初始化 ... }]; [sureBtn setValue:[UIColor redColor] forKey:@"titleTextColor"]; [alertVc addAction:cancelBtn]; [alertVc addAction :sureBtn]; //展示 [self presentViewController:alertVc animated:YES completion:nil]; }else{ [[GHomeAPI sharedGHome] userIsAgreeAgreement:YES]; [self appendLogInfo:@"不需要弹框,已经同意"]; } }];
4.3 SDK初始化
- 初始化接口定义
/**
* 初始化
* @param delegate 委托对象
* appId 游戏ID
*/
- (void)initialize:(id<GHomeAPIInitializeDelegate>)delegate
appId:(NSString*)appId;
- 初始化接口调用示例
[[GHomeAPI sharedGHome] initialize:self appId:@"1000"];
- 初始化接口回调示例
- (void)initializeResult:(NSInteger)resultCode resultMsg:(NSString*)resultMsg
{
showAlertView(@"initializeResult code[%@] msg[%@]", @(resultCode), resultMsg);
}
-
初始化接口回调说明
当resultCode为 GHOMEAPI_CONSTANTS_SUCCESS 时表示成功。
当resultCode为其他值时均表示失败,resultMsg为失败信息描述。
当resultCode为 GHOMEAPI_CONSTANTS_SUCCESS 时方可进行其他SDK操作。 - 初始化可以在AppDelegate中调用也可以在ViewController中调用,具体什么位置调用由接入方自行决定,只要保证在初始化成功后才能调用login接口
5. 账号功能
5.1. 账号体系说明
-
注册&登录原理
1) 在游戏登录界面打开SDK注册&登录界面;
2) 用户完成注册&登录之后,SDK把用户id和ticket票据返回游戏;
3) 游戏如果有服务器,需要把客户端获取到ticket票据发送到"登录票据验证接口"(参考5.4节)进行验证,然后把返回的用户信息(用户id和账号)保存到游戏服务器;
- 注册&登录时线图
5.2. 客户端登录接口
- 登录接口定义
/**
* 登录
* @param delegate 委托对象
*/
- (void)login:(id<GHomeAPILoginDelegate>)delegate;
- 登录接口调用示例
[[GHomeAPI sharedGHome] login:self];
- 登录接口回调示例
- (void)loginResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg ticket:(NSString *)ticket userId:(NSString *)userId isGuest:(BOOL)isGuest
{
showAlertView(@"loginResult code[%@] msg[%@] ticket[%@] useId[%@]", @(resultCode), resultMsg, ticket, userId);
}
- 登录接口回调说明
当resultCode为 GHOMEAPI_CONSTANTS_SUCCESS 时表示成功,ticket、userId的值有效。
当resultCode为 GHOMEAPI_CONSTANTS_CANCEL_LOGIN 时表示用户取消登录,如果不允许用户取消登录,需要再次调用login呼出登录界面。
当resultCode为其他值时表示失败,ticket、userId的值无效,resultMsg为失败信息描述。
一般当resultCode不为GHOMEAPI_CONSTANTS_SUCCESS时,游戏可以显示错误内容,然后再次调用登录接口,让用户继续登录。 - 如果采用自定义隐私协议弹框,需要在该接口调用之前调用接口4.2询问接口,此时isFromLogin入参为yes
//游戏自定义模式
[[GHomeAPI sharedGHome] ifNeedShowUserAgreementAppId:self.appIdTextField.text isFromLogin:YES callback:^(BOOL needShow, NSString *tip) {
NSString * string = [NSString stringWithFormat:@"询问服务端是否需要弹框,结果:%d,提示:%@", needShow,tip];
[self appendLogInfo:string];
if (needShow) {
UIAlertController *alertVc = [UIAlertController alertControllerWithTitle:@"隐私协议" message:@"我是自定义隐私协议" preferredStyle:UIAlertControllerStyleAlert];
//默认只有标题 没有操作的按钮:添加操作的按钮 UIAlertAction
UIAlertAction *cancelBtn = [UIAlertAction actionWithTitle:@"不同意" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
[self appendLogInfo:@"不同意隐私协议"];
[[GHomeAPI sharedGHome] userIsAgreeAgreement:NO];
}];
UIAlertAction *sureBtn = [UIAlertAction actionWithTitle:@"同意" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
[self appendLogInfo:@"同意隐私协议"];
[[GHomeAPI sharedGHome] userIsAgreeAgreement:YES];
[[GHomeAPI sharedGHome] login:self];
}];
[sureBtn setValue:[UIColor redColor] forKey:@"titleTextColor"];
[alertVc addAction:cancelBtn];
[alertVc addAction :sureBtn];
//展示
[self presentViewController:alertVc animated:YES completion:nil];
}else{
[[GHomeAPI sharedGHome] login:self];
}
}];
5.3. 客户端退出登录接口
- 退出登录接口定义
/**
* 退出登录(切换账号)
* @param delegate 委托对象
*/
- (void)logout:(id<GHomeAPILogoutDelegate>)delegate;
- 退出登录接口调用示例
[[GHomeAPI sharedGHome] logout:self];
- 退出登录接口回调示例
- (void)logoutResult:(NSInteger)resultCode resultMsg:(NSString*)resultMsg
{
showAlertView(@"logoutResult code[%@] msg[%@]", @(resultCode), resultMsg);
}
- 退出登录接口回调说明
当resultCode 为 GHOMEAPI_CONSTANTS_SUCCESS 时表示成功。
当resultCode 为其他值时表示失败,resultMsg为失败信息描述。
5.4. 三方账号手机绑定接口
- 绑定接口定义
/**
* 绑定手机账号
* @param delegate 委托对象
*/
- (void)bindAcitvityPhone:(id <GHomeAPIBindActivityPhoneDelegate>)delegate;
- 绑定手机接口调用示例
[[GHomeAPI sharedGHome] bindAcitvityPhone:self];
- 绑定手机接口回调示例
- (void)bindActivityPhoneResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg
{
showAlertView(@"logoutResult code[%@] msg[%@]", @(resultCode), resultMsg);
}
- 绑定手机接口回调说明
BindSuccess 首次绑定成功 BindFailed 首次绑定失败 BindCanceled 首次绑定取消 RebindSuccess 换绑成功 RebindFailed 换绑失败 RebindCanceled 换绑取消。
5.5. 服务器登录票据验证接口
-
用法说明
为了保证游戏服务器的安全性,游戏服务器在登记用户登录信息之前需要到G家平台服务器做一个验证
-
接口地址
-
传值方式
GET
-
参数列表
appid: 游戏对应的APPID
timestamp: 精确到秒的unix时间戳
sequence: 不重复的请求序列号(全局唯一)
ticket_id: 从客户端登录接口返回的ticket字符串;
sign: 签名串(参考:"附录A:服务器端签名算法",签名原始串示例:appid=xxx&sequence=xxx&ticket_id=xxx & timestamp=xxxappsecretkey)
-
返回结果
返回结果按json编码,数据格式为:
{
code:0, #返回状态,0为成功,1为失败
msg:"ok", #错误信息
data:{
userid:123456, #平台用户id,整形,必须保存到游戏服务器
token:"40E00263-16A7-8CFA-D0E8-C951D683EA24", #平台TOKEN,36位字符串,暂时不用
phone:"+86-139****6893" #手机帐号,带国际区号,可用于显示帐号
invitation_code:"34343" #邀请码
thirdId:'34343' #第三方账号ID
companyId:"172" #第三方公司ID
"userAttribute": "6" #6表示游客,其他表示非游客
adult_flag:2 #0未实名,1未成年,2成年
}
}
6. 支付功能
6.1. 支付原理说明
-
支付原理
1) 游戏客户端发起支付请求;
2) SDK服务器收到请求,并发送至第三方支付;
3) 第三方支付成功收费以后通知SDK服务器,再由SDK服务器通知游戏服务器发货至游戏,需要游戏提供"订单通知接口"进行接受(参考6.3节);
-
支付时线图
-
注意:如果要用SDK提供的demo进行支付测试。那么要把相关证书、Bundle ID 替换成你的开发者证书与相应的Bundle ID。(支付只支持非越狱的真机)。
-
Itunes app设置请参考:
-
itunes product 设置请参考:
6.2. 客户端支付接口
- 支付接口定义
/**
* 显示支付页面
* @param delegate 委托对象
* productId 产品ID
* areaId 区ID
* groupId 组ID
* gameOrderId 游戏订单ID
* extendInfo 附加参数
*/
- (void)pay:(id<GHomeAPIPayDelegate>)delegate
productId:(NSString*)productId
areaId:(NSString*)areaId
groupId:(NSString *)groupId
gameOrderId:(NSString*)gameOrderId
extendInfo:(NSString*)extendInfo;
- 支付接口调用示例
[[GHomeAPI sharedGHome] pay:self productId:@"p0001" areaId:@"1" groupId:@"1" gameOrderId:@"abc123" extendInfo:nil];
- 支付接口回调示例
- (void)payResult:(NSInteger)resultCode resultMsg:(NSString*)resultMsg
{
showAlertView(@"payResult code[%@] msg[%@]", @(resultCode), resultMsg);
}
-
支付接口回调说明
当resultCode 为 GHOMEAPI_CONSTANTS_SUCCESS 时表示成功。
当resultCode 为其他值时表示失败,resultMsg为失败信息描述。
6.3. 服务器订单通知接口
-
用法说明
用于将用户支付结果通知给游戏。
-
接口地址
接口地址需要游戏提供,可以在开发商后台"我的游戏 > 区服管理"中配置。
-
传值方式
POST
-
参数列表
orderNo: 服务器的订单号
userId:用户ID
gameOrderNo: 游戏的订单号
product: 产品ID(在开发商后台"我的游戏 > 充值管理"中配置)当游戏服务器发货是按照游戏自己记录的商品id发货时,请保证这里返回的商品id是否与游戏自己记录的商品id一致,方可发货;如不一致,游戏可以拒绝发货!
extend:游戏发送过来的扩展信息,原格式返回
sign:签名串(参考"附录A:服务器端签名算法")
time:到账时间
- 参数示例
orderNo=791000012PP016140210105937000001&userId=18178&gameOrderNo=NONE&product=com.winggod.jingzhuan&extend=NONE&time=1392004960&sign=ad08d9e2d7b7df6603bc431392d1c707
-
返回结果
返回字符串success表示成功,其他表示失败。
7. 扩展功能
7.1. 客户端获取游戏区服列表接口
- 获取区服信息接口定义
/**
* 获取区服信息
* @param delegate 委托对象
*/
- (void)getAreaConfiguration:(id<GHomeAPIGetAreaConfigrationDelegate>)delegate;
- 获取区服信息接口调用示例
[[GHomeAPI sharedGHome] getAreaConfiguration:self];
- 获取区服信息接口回调示例
- (void)getAreaConfigrationResult:(NSInteger)resultCode resultMsg:(NSString*)resultMsg info:(NSDictionary*)info
{
showAlertView(@"getAreaConfigrationResult code[%@] msg[%@] info[%@]", @(resultCode), resultMsg, info);
}
- 获取区服信息接口回调说明
当resultCode 为 GHOMEAPI_CONSTANTS_SUCCESS 时表示成功,返回info值。
当resultCode 为其他值时表示失败,resultMsg为失败信息描述,info值无效。
info[{
message = (
{
"area_code" = 1;
"name" = "\/U5996\/U7cbe\/U4e4b\/U6e56";
"notify_url" = "http://qa.dev.mygm.sdo.com/test/gamenotify";
}
);
result = 0; //当result =0时表示成功
}]
7.2. 客户端获取游戏商品列表接口
- 获取支付产品信息接口定义
/**
* 获取支付产品信息
* @param delegate 委托对象
*/
- (void)getProductConfiguration:(id<GHomeAPIGetProductConfigrationDelegate>)delegate;
- 获取支付产品信息接口调用示例
[[GHomeAPI sharedGHome] getProductConfiguration:self];
- 获取支付产品信息接口回调示例
- (void)getProductConfigurationResult:(NSInteger)resultCode resultMsg:(NSString*)resultMsg info:(NSDictionary*)info
{
showAlertView(@"getProductConfigurationResult code[%@] msg[%@] info[%@]", @(resultCode), resultMsg, info);
}
-
获取支付产品信息接口回调说明
当resultCode 为 GHOMEAPI_CONSTANTS_SUCCESS 时表示成功,返回info值。
当resultCode 为其他值时表示失败,resultMsg为失败信息描述,info值无效。
info[{
message = (
{
"item_name" = 10mc;
"money" = "6.00";
"product_code" = "com.product.tenGold";
"type":1 // 0:Android游戏,1:IOS游戏,2:Android和IOS游戏
},
{
"item_name" = 10mc;
"money" = "0.01";
"product_code" = p0001;
"type":2 // 0:Android游戏,1:IOS游戏,2:Android和IOS游戏
}
);
result = 0; //result = 0时表示成功
}]
7.3. 客户端获取一次性登录票据接口
- 获取票据接口定义
/**
* 获取票据,登录后有效
* @param delegate 委托对象
* appId 游戏ID
* areaId 区ID
*/
- (void)getTicket:(id<GHomeAPIGetTicketDelegate>)delegate
appId:(NSString*)appId
areaId:(NSString*)areaId;
- 获取票据接口调用示例
[[GHomeAPI sharedGHome] getTicket:self appId:@"1000" areaId:@"1"];
- 获取票据接口回调示例
- (void)getTicketResult:(NSInteger)resultCode resultMsg:(NSString*)resultMsg ticket:(NSString*)ticket
{
showAlertView(@"getTicketResult code[%@] msg[%@] ticket[%@]", @(resultCode), resultMsg, ticket);
}
-
获取票据接口回调说明
当resultCode 为 GHOMEAPI_CONSTANTS_SUCCESS 时表示成功,返回ticket值。
当resultCode 为其他值时表示失败,resultMsg为失败信息描述,ticket值无效。
7.4. 客户端上报游戏区接口
- 登录区服接口定义
/**
* 登录区
* @param areaId 区ID
*/
- (void)loginArea:(NSString*)areaId;
/**
* 上报所在区服
* @param areaId 区ID
* @param groupId 服ID
*/
- (void)loginArea:(NSString *)areaId group:(NSString *)groupId;
- 登录区服接口调用示例
[[GHomeAPI sharedGHome] loginArea:@"1"];
[[GHomeAPI sharedGHome] loginArea:@"1" group:@"1"];
7.5. 客户端上报角色接口
- 角色上报接口定义
/**
* 角色上报
* @param roleName 角色名称
* @param level 角色等级
* @param from 角色是创建还是更新 RoleFrom.Create, RoleFrom.Update
* @param areaId 区ID
*/
- (void)loginRole:(NSString *) roleName level:(NSInteger) level from: (RoleFrom)from area:(NSString*)areaId;
- 登录区服接口调用示例
[[GHomeAPI sharedGHome] loginRole: @"魔法师" level: 23 from: GHomeAPIRoleFromUpdate area: @"1"];
- 登录区服接口无回调
7.6. 获取设备唯一标示接口
- 获取设备唯一标示接口调用示例
NSString* deviceString = [[GHomeAPI sharedGHome] deviceId];
- 获取设备唯一标示接口无回调
7.7. 打开二维码扫码
- 二维码扫码接口定义:
/**
* 显示二维码扫描页面
* @param delegate 委托对象
* extendInfo 附加参数(透传)
*/
- (void)scanQRCode:(id <GHomeAPIScanQRCodeDelegate>)delegate extendInfo:(NSString *)extendInfo;
- 二维码扫码接口调用示例
[[GHomeAPI sharedGHome] scanQRCode: self extendInfo: @"abcd"];
- 二维码扫码接口回调示例
- (void)scanQRCodeResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg
{
showAlertView(@"scanQRCodeResult code[%@] msg[%@]", @(resultCode), resultMsg);
}
-
二维码扫码接口回调说明
当resultCode 为 GHOMEAPI_CONSTANTS_QRLOGIN_SUCCESS 时表示扫码登录成功。
当resultCode 为 GHOMEAPI_CONSTANTS_QRPAY_SUCCESS 时表示扫码支付成功。
当resultCode 为 GHOMEAPI_CONSTANTS_QRPAY_FAILURE 时表示扫码支付失败。
当resultCode 为 GHOMEAPI_CONSTANTS_QRRESULT 时表示获得的扫码信息透传给游戏,由游戏自行处理,resultMsg为扫码获得的内容。
当resultCode 为 GHOMEAPI_CONSTANTS_QRCANCEL 时表示用户取消扫码操作。
当resultCode 为 InvalidTokenError 时表示登录态已失效,请重新登录。 -
注意事项:
必须在登录成功之后才可以使用该接口。
7.8. 游客升级接口
- 游客升级接口定义:
/**
*游客升级
* @param delegate 委托对象
*/
- (void)guestUpgrade:(id <GHomeAPIGuestUpgradeDelegate>)delegate;
- 游客升级接口
[[GHomeAPI sharedGHome] guestUpgrade:self];
- 游客升级接口回调示例
- (void)guestUpgradeResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg {
}
-
注意事项:
必须在游客登录成功之后才可以使用该接口。
7.9 用户协议及隐私条款
- 通过该接口可以获取到用户协议及隐私条款的链接地址以及协议的版本号
/**
* 获取用户协议及隐私条款
* delegate 委托对象(必须)
* appId 游戏ID(必须)
* privacyPolicyVersion 隐私条款(非必须)
* serviceAgreementVersion 用户协议(非必须)
*/
- (void)getUserAgreement:(id <GHomeAPIGetUserAgreementDelegate>)delegate
appId:(NSString *)appId
privacyPolicyVersion:(NSInteger)privacyPolicyVersionserviceAgreementVersion:(NSInteger)serviceAgreementVersion;
- 回调方法
/**
* @param resultCode 返回码
* resultMsg 返回码描述
* dic 返回数据
*/
- (void)getUserAgreementResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg
dic:(NSDictionary *)dic;
7.10 是否正在人脸识别(人脸识别横竖屏幕适配)
- (BOOL)isFaceChecking 返回是否正在进行人脸识别
可选方法,如果没有用到人脸可以不用接入此方法
因人脸识别只支持竖屏所以需要在正在进行人脸识别的时候支持竖屏
// 在AppDelegate中加入该函数
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window {
//横屏游戏:UIInterfaceOrientationMaskLandscape 竖屏游戏:UIInterfaceOrientationMaskPortrait
if([[GHomeAPI sharedGHome] isFaceChecking]) {
return UIInterfaceOrientationMaskAll;
}else {
return UIInterfaceOrientationMaskLandscape; //此处原来是什么现在就是什么,如果没有参考工程设置的选项
}
}
7.11 盛趣游戏通行证账号注销功能
通过该接口将用户的盛趣游戏通行证账号注销,需要在收到注销回调之后退出到登录。
/**
* 注销账号
* @param delegate 委托对象
*/
- (void)unregister:(id <GHomeAPIUnregisterDelegate>)delegate;
回调方法
/**
* @param resultCode 返回码
* resultMsg 返回码描述
*/
- (void)unregisterResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg;
resultCode = 0 表示注销成功,需要退出到登录
resultCode = 1001 表示取消注销流程
其他 表示注销失败
7.12 分享以及录屏功能(不需要分享功能则不需要接入以下内容)
1.在info.plist中添加以下权限 、并添加 GShareSDK.bundle文件
<key>NSMicrophoneUsageDescription</key>
<string>App需要您的同意,才能访问麦克风</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>App需要您的同意,才能访问相册</string>
<key>NSPhotoLibraryAddUsageDescription</key>
<string>App需要您的同意,才能添加视频到相册</string>
2.添加 ReplayKit.framework库 并设置为optional
3.第三方平台分享 方法在GHomeShareManager类中 //使用 [GHomeShareManager sharedManager]调用以下方法
/**
* @param platform 分享的平台 微信 0
微信朋友圈 1
QQ好友平台 2
QQ_PLATFORM 3
新浪微博 4
弹出选择平台UI 5
* Text 分享的文字
* userData 用户数据 选填 用不到可以传 0
* shareResult block回调,分享结果
* title 标题
* desc 描述
* imageData 图片数据 类型是NSData
* vedioURL 分享视频时候视频的URL地址
* audioURL 分享音频时候音频的URL地址
* webURL 分享网站时候网站的URL地址
*/
//分享文字
- (void)gShareTextWithPlatform:(int) platform Text:(NSString *) text userData:(NSInteger) userData shareResult: (GShareResult) shareResult;
//分享图片
- (void)gShareImageWithPlatform:(int) platform title:(NSString *) title desc:(NSString *) desc imageData:(NSData *)imageData userData:(NSInteger) userData shareResult: (GShareResult) shareResult;
//分享视频
- (void)gShareVideoWithPlatform:(int) platform title:(NSString *) title desc:(NSString *) desc imageData:(NSData *)imageData videoURL:(NSString *) videoURL userData:(NSInteger) userData shareResult: (GShareResult) shareResult;
//分享音频
- (void)gShareAudioWithPlatform:(int) platform title:(NSString *) title desc:(NSString *) desc imageData:(NSData *)imageData audioURL:(NSString *) audioURL userData:(NSInteger) userData shareResult: (GShareResult) shareResult;
//分享网站
- (void)gShareWebWithPlatform:(int) platform title:(NSString *) title desc:(NSString *) desc imageData:(NSData *)imageData webURL:(NSString *) webURL userData:(NSInteger) userData shareResult: (GShareResult) shareResult;
调用示例(其他可参考demo)
[[GHomeShareManager sharedManager] gShareTextWithPlatform:nPlatformType Text:@"这是文字分享" userData:12345 shareResult:^(int nPlatformType, int nErrCode, NSString * _Nonnull pszErrMsg, NSInteger lUserData) {
//分享结果
}];
4.系统分享 方法在GHomeShareManager类中 //使用 [GHomeShareManager sharedManager]调用以下方法
/**
* @param vc UIViewController 用来弹出系统分享
* Text 分享的文字
* userData 用户数据 选填 用不到可以传 0
* shareResult block回调,分享结果
* desc 描述
* iamgePaths 图片 图片地址的数组
* videoPath 分享视频时候视频的路径
* audioPath 分享音频时候音频的路径
* url 分享网站时候网站的URL地址
*/
//分享文字
- (void)gSystemShareTextWithViewController:(UIViewController *) vc Text:(NSString *) text userData:(NSInteger) userData shareResult: (GShareResult) shareResult;
//分享图片
- (void)gSystemShareImageWithViewController:(UIViewController *) vc iamgePaths:(NSArray *)paths userData:(NSInteger) userData shareResult: (GShareResult) shareResult;
//分享视频
- (void)gSystemShareVideoWithViewController:(UIViewController *) vc videoPath:(NSString *)path userData:(NSInteger) userData shareResult: (GShareResult) shareResult;
//分享音频
- (void)gSystemShareAudioWithViewController:(UIViewController *) vc audioPath:(NSString *)path userData:(NSInteger) userData shareResult: (GShareResult) shareResult;
//分享网站
- (void)gSystemShareWebWithViewController:(UIViewController *) vc url:(NSString *)url desc:(NSString *)desc imagePath:(NSString *)path userData:(NSInteger) userData shareResult: (GShareResult) shareResult;
调用示例(其他可参考demo)
[[GHomeShareManager sharedManager] gSystemShareTextWithViewController:self Text:@"这是文字分享" userData:12345 shareResult:^(int nPlatformType, int nErrCode, NSString * _Nonnull pszErrMsg, NSInteger lUserData) {
//分享结果
}];
5.录屏功能 方法在GHomeShareManager类中 //使用 [GHomeShareManager sharedManager]调用分享
//录屏初始化
- (void)gShareInitRecordService;
//开始录屏
- (BOOL)gShareStartRecordingCompleteResultCallback:(GRecordResult)recordResult;
//结束录屏
- (void)gShareStopRecord;
//获取录屏状态
- (NSInteger)gShareGetRecordStauts;
//结束录屏并分享
- (void)gShareStopRecordingAndShareWithViewController:(UIViewController *)vc shareResult:(GShareResult)shareResult;
8.三方登录功能接入
- 如需苹果登录 请在工程Signing&Capabilities选项中添加 Sign in with Apple 功能 ,并增加以下配置
-
添加URL Scheme 用于外部应用呼起,值为你的申请参数
-
添加LSApplicationQueriesSchemes:
weixin, wechat, weibosdk, weibosdk2.5, sinaweibo, sinaweibohd, com.sdo.txz, mqq, mqqapi, mqqwpa, mqqbrowser, mttbrowser, mqqOpensdkSSoLogin, mqqopensdkapiV2, mqqopensdkapiV3, mqqopensdkapiV4, wtloginmqq2, mqzone, mqzoneopensdk, mqzoneopensdkapi, mqzoneopensdkapi19, mqzoneopensdkapiV2, mqqapiwallet, mqqopensdkfriend, mqqopensdkdataline, mqqgamebindinggroup, mqqopensdkgrouptribeshare, tencentapi.qq.reqContent, tencentapi.qzone.reqContent, daoyu, wegameapp, wtloginmqq, nzgamehelper, wuxiagamehelper
-
在Appdelegate中添加回调函数 下列函数都需要添加
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[GHomeAPI sharedGHome] application:application didFinishLaunchingWithOptions:launchOptions]; return YES; }
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
return [[GHomeAPI sharedGHome] application:app openURL:url sourceApplication:nil annotation:nil];
} (ios9引入)
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [[GHomeAPI sharedGHome] application:application openURL:url sourceApplication:sourceApplication annotation:annotation];
}(ios9之前使用该函数)
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
return [[GHomeAPI sharedGHome] application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
}(ios13之后使用该函数)
- 三方应用跳转工程设置
UniversalLink与Associated Domains的填写,需要与申请时保持一致。
Wegame登陆配置参数
WegameSDKResource.bundle文件中的WeSDKConfig 配置QQ参数
在info.plist文件中配置wegame的QQ渠道的Scheme
在info.plist文件中配置wegame的Scheme
9. 扩展接口
/**
* 扩展接口
* @param delegate 委托对象
* type 接口类型
* parameter 接口参数,不同的type对应不同接口。
* 所有key和value都是NSString类型。
* 具体内容见文档。
*
*/
- (NSInteger)extendFunction:(id<GHomeAPIExtendDelegate>)delegate
type:(GHomeExtendFunctionType)type
parameter:(NSDictionary*)param;
// delegate
/**
* @param resultCode 返回码
* resultMsg 返回码描述
* type 调用时的type
* info 其他信息,resultCode为0时返回。
*/
- (void)extendFunctionResult:(NSInteger)resultCode resultMsg:(NSString*)resultMsg type:(GHomeExtendFunctionType)type info:(NSDictionary*)info;
/**
* @param resultCode 返回码
* resultMsg 返回码描述
* ticket 验证使用的ticket,resultCode为0时返回。
* userId 用户账号,resultCode为0时返回。
*/
- (void)extendLoginResult:(NSInteger)resultCode resultMsg:(NSString*)resultMsg ticket:(NSString*)ticket userId:(NSString*)userId;
/**
* @param resultCode 返回码
* resultMsg 返回码描述
*/
- (void)extendLogoutResult:(NSInteger)resultCode resultMsg:(NSString*)resultMsg;
9.1. 参数说明
- extendFunction的(GHomeExtendFunctionType)type是扩展接口功能参数。
- extendFunction的(NSDictionary*)param,只能传递key与value都为NSString的参数。
- type为GHOME_APPLICATIONHANDLEOPENURL_FUNCTION_TYPE,客户端回调结果处理,parameter的key为@"url"。
- type为GHOME_PAUSE_FUNCTION_TYPE,游戏暂停,parameter无参数。
- type为GHOME_SHOWPLATFORM_FUNCTION_TYPE,显示平台界面,parameter无参数。
- type为GHOME_SHOWTOOLBAR_FUNCTION_TYPE,显示工具栏,parameter无参数。
- type为GHOME_HIDETOOLBAR_FUNCTION_TYPE,隐藏工具栏,parameter无参数。
- type为GHOME_SETORIENTATION_FUNCTION_TYPE,设置屏幕方向,parameter的key为@"orientation"。
- type为GHOME_CHECK_UPDATE_TYPE,检查更新,parameter的key为@"isTest"。
- type为GHOME_SET_CHANNEL_FUNCTION_TYPE,设置渠道号,parameter的key为@"channel"。
9.2. 调用说明
9.2.1 GHOME_APPLICATIONHANDLEOPENURL_FUNCTION_TYPE
- 在实现UIApplicationDelegate的对象中调用。
- 执行该操作的时候,delegate需要配置用于使用第三方登录。
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
[[GHomeAPI sharedGHome] extendFunction:(id) delegate type:GHOME_APPLICATIONHANDLEOPENURL_FUNCTION_TYPE parameter:@{@"url":[url absoluteString]}];
return YES;
}
9.2.2 GHOME_PAUSE_FUNCTION_TYPE
- 在实现UIApplicationDelegate的对象中调用。
- 执行该操作的时候,无需设置delegate。
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[[GHomeAPI sharedGHome] extendFunction:nil type:GHOME_PAUSE_FUNCTION_TYPE parameter:nil];
}
9.2.3 GHOME_SHOWPLATFORM_FUNCTION_TYPE
- 执行该操作的时候,需设置delegate,并且实现extendLoginResult和extendLogoutResult。
- 当收到extendLoginResult消息时,游戏需要按照正常登录流程操作,获取返回的ticket,进行验证,进入游戏。
- 当收到extendLogoutResult消息时,游戏需要按照正常退出流程操作,退出游戏,回到开始界面,引导用户重新登录。
- (void) function
{
[[GHomeAPI sharedGHome] extendFunction:self type:GHOME_PAUSE_FUNCTION_TYPE parameter:nil];
}
- (void)extendLoginResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg ticket:(NSString *)ticket userId:(NSString *)userId
{
NSLog(@"extendLoginResult code[%@] msg[%@] ticket[%@] useId[%@]", @(resultCode), resultMsg, ticket, userId);
if (resultCode == 0)
{
// 重新登录游戏
}
else
{
// 退到游戏开始画面,引导用户登录
}
}
- (void)extendLogoutResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg
{
NSLog(@"extendLogoutResult code[%@] msg[%@]", @(resultCode), resultMsg);
// 退到游戏开始画面,引导用户登录
}
9.2.4 GHOME_SHOWTOOLBAR_FUNCTION_TYPE
- 执行该操作的时候,需设置delegate,并且实现extendLoginResult和extendLogoutResult。
- 当收到extendLoginResult消息时,游戏需要按照正常登录流程操作,获取返回的ticket,进行验证,进入游戏。
- 当收到extendLogoutResult消息时,游戏需要按照正常退出流程操作,退出游戏,回到开始界面,引导用户重新登录。
- (void)function
{
[[GHomeAPI sharedGHome] extendFunction:self type:GHOME_SHOWTOOLBAR_FUNCTION_TYPE parameter:nil];
}
- (void)extendLoginResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg ticket:(NSString *)ticket userId:(NSString *)userId
{
NSLog(@"extendLoginResult code[%@] msg[%@] ticket[%@] useId[%@]", @(resultCode), resultMsg, ticket, userId);
if (resultCode == 0)
{
// 重新登录游戏
}
else
{
// 退到游戏开始画面,引导用户登录
}
}
- (void)extendLogoutResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg
{
NSLog(@"extendLogoutResult code[%@] msg[%@]", @(resultCode), resultMsg);
// 退到游戏开始画面,引导用户登录
}
9.2.5 GHOME_HIDETOOLBAR_FUNCTION_TYPE
- 执行该操作的时候,无需设置delegate。
- (void)function
{
[[GHomeAPI sharedGHome] extendFunction:nil type:GHOME_HIDETOOLBAR_FUNCTION_TYPE parameter:nil];
}
9.2.6 GHOME_SETORIENTATION_FUNCTION_TYPE
- 执行该操作的时候,无需设置delegate。
- 一般无需调用该接口。
- (void)function
{
// 一共有4个方向可以设置,每次只能设置一个。@"portrait"、@"portraitupsidedown"、@"landscapeleft"、@"landscaperight"
NSDictionary* parameter = [NSDictionary dictionaryWithObjectsAndKeys:@"portrait",@"orientation", nil];
[[GHomeAPI sharedGHome] extendFunction:nil type:GHOME_SETORIENTATION_FUNCTION_TYPE parameter:parameter];
}
9.2.7 GHOME_CHECK_UPDATE_TYPE
- 执行该操作的时候,需设置delegate,并且实现extendFunctionResult。
- (void)function
{
NSDictionary* parameter = [NSDictionary dictionaryWithObjectsAndKeys:@"isTest",@"NO", nil];
[[GHomeAPI sharedGHome] extendFunction:self type:GHOME_CHECK_UPDATE_TYPE parameter:parameter];
}
- (void)extendFunctionResult:(NSInteger)resultCode resultMsg:(NSString*)resultMsg type:(GHomeExtendFunctionType)type info:(NSDictionary*)info
{
NSLog(@"extendFunctionResult code[%@] msg[%@] type[%@] info[%@]", @(resultCode), resultMsg, @(type), info);
// 判断是否需要更新
if (resultCode == 0 && info && [[info objectForKey:@"needUpdate"] boolValue])
{
// 做更新操作,不是所有渠道都需要手动更新,一般都会自动更新,这里只是一个提示。
}
}
9.2.8 GHOME_SET_CHANNEL_FUNCTION_TYPE
- 执行该操作的时候,无需设置delegate。
- 只有在通用GHome越狱渠道才需要设置。具体的channel值需由市场给出。
- pp助手、itools、91、快用、爱思、海马、同步推等具有第三方sdk的越狱渠道不属于范围内,是不用设置该值的。
- (void)function
{
NSDictionary* parameter = [NSDictionary dictionaryWithObjectsAndKeys:@"iosjb",@"channel", nil];
[[GHomeAPI sharedGHome] extendFunction:nil type: GHOME_SET_CHANNEL_FUNCTION_TYPE parameter:parameter];
}
9.2.9 GHOME_CHECK_HAS_PAID_PRODUCT_TYPE
- 检查本地是否有未完成,该订单用户已经通过苹果完成了支付,但是这个订单可能还未发到我们服务端进行验证和发货相关的处理
- 返回1020表示无已经支付, 返回0表示有已支付但是未完成的订单,并且已经验证成功,返回key-value结果里面"productId"对应的是商品id 其它返回值与已有的支付返回码处理方式一致
- (void)function
{
[[GHomeAPI sharedGHome] extendFunction:self type: GHOME_CHECK_HAS_PAID_PRODUCT_TYPE parameter:nil];
}
10.关于游戏横竖屏设置问题 在AppDelegate中添加该函数
-(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window{
return UIInterfaceOrientationMaskLandscape;
}
UIInterfaceOrientationMaskLandscape 横屏模式
UIInterfaceOrientationMaskPortrait 竖屏模式
11. 附录A:服务器端签名算法
-
参数说明:
1) timestamp为调用接口时的unix时间戳(精确到秒)
2) sequence为请求序列号(游戏服务器端需要保证两次调用接口生成的sequence不重复)
-
签名算法:
1) 调用方首先需要将请求的参数根据参数的key(ASCII码值)进行升序排序
2) 将排序好的接口请求参数和参数值按key=val&key2=val2…这样得格式拼装成一个字符串,并在最后加上与APPID对应的APPKEY
3) 对上述拼接好的字符串进行md5编码,获得最终的签名串
- 代码示例(PHP):
public function sign ($params, $secret_key) { // $params数组必须包含timestamp
ksort($params);
$pair = array();
foreach($params as $k => $v){
$pair[] = $k. '=' .$v;
}
$str = implode('&', $pair); // 拼接字符创
$str = $str.$secret_key; // 把APPKEY补充到最后
return md5($str);
}
12. 附录B:特殊说明
-
订单重发机制:
平台对所有发货状态非"success"的订单,采取统一的重发机制。具体的重发策略为:每60秒重发1次,最大重发次数为60次。
对尝试重发后,最终失败的订单,我们会隔天通过报表机制发现,由平台方补发货,游戏方不需要参与。
-
发货重复处理机制:
基于订单重发机制,可能导致游戏方重复收到相同orderNo的发货通知,此时要求游戏检查orderNo实际到货情况,避免重复向玩家发放游戏币等虚拟货品。建议对一个月内的orderNo做唯一性检查。
针对已发货成功的订单,要求游戏方收到重复通知时,请务必返回success,状态为"success"的订单,将不会继续触发重发机制。
13. 附录C:SDK返回code描述
13.1 SDK常用code
static let Success = GHError(code: 0, msg: "操作成功")
static let InitializeSuccess = GHError(code: 0, msg: "初始化成功")
static let LoginSuccess = GHError(code: 0, msg: "登录成功")
static let PaySuccess = GHError(code: 0, msg: "支付成功")
static let PaySuccessWithFixOrder = GHError(code: 0, msg: "补单成功")
static let InitializeFailed = GHError(code: -1005, msg: "未同意隐私条款")
static let Unknown = GHError(code: -1, msg: "未知错误")
static let Cancelled = GHError(code: -999, msg: "请求取消")
static let TimedOut = GHError(code: -1001, msg: "请求超时")
static let CannotConnectToHost = GHError(code: -1004, msg: "连接失败")
static let NotConnectedToInternet = GHError(code: -1009, msg: "无网络连接")
static let BadServerResponse = GHError(code: -1011, msg: "不合法的响应")
static let CannotDecodeRawData = GHError(code: -1015, msg: "无法解码原始数据")
static let CannotDecodeContentData = GHError(code: -1016, msg: "无法解码内容数据")
static let CannotParseResponse = GHError(code: -1017, msg: "无法解析响应")
static let ParameterError = GHError(code: 3, msg: "参数错误")
static let NoTicketError = GHError(code: 4, msg: "请重新登录")
static let PayingError = GHError(code: 5, msg: "正在支付,请稍后")
static let PayError = GHError(code: 6, msg: "支付失败")
static let ShakeError = GHError(code: 7, msg: "网络不稳定,请稍后再试")
static let LoginError = GHError(code: 8, msg: "登录失败")
static let NotLoginError = GHError(code: 9, msg: "用户未登录")
static let NotInitError = GHError(code: 10, msg: "未初始化")
static let CancelLoginError = GHError(code: 11, msg: "已取消登录")
static let CancelScanQcode = GHError(code: 16, msg: "取消扫码")
static let CancelPayError = GHError(code: 12, msg: "支付取消")
static let ServerError = GHError(code: 13, msg: "服务器异常")
static let AlreadyLoginError = GHError(code: 14, msg: "用户已经登录,不能重复登录")
static let NotSupportLogout = GHError(code: 15, msg: "单机应用不支持注销")
static let UndefinedExtendFunction = GHError(code: 50, msg: "当前渠道不支持此扩展方法")
static let GuestPayError = GHError(code: 101, msg: "请升级游客至G家账号")
static let GuestPayUpgradedCode = GHError(code: 102, msg: "游客升级成功")
static let InitError = GHError(code: 201, msg: "初始化失败")
static let InvalidTokenError = GHError(code: 16, msg: "登录态已失效,请重新登录")
static let GHOMEAPI_CONSTANTS_QRRESULT = GHError(code: 100, msg: "二维码错误,请扫描正确的二维码")
static let GHOMEAPI_CONSTANTS_QRLOGIN_SUCCESS = GHError(code: 0, msg: "已授权账号在桌面版登录")
static let CodeLostReceipt = GHError(code: 34, msg: "交易丢失请联系客服")
static let CodeLostOrderId = GHError(code: 35, msg: "交易丢失请联系客服")
static let EmptyProductId = GHError(code: 1001, msg: "获取支付产品失败,productId不能为空")
static let InvalidProductId = GHError(code: 1001, msg: "获取支付产品失败,productId有误,请检查苹果itunesconnect中是否配有该商品")
static let InvalidProductInItunesconnect = GHError(code: 1001, msg: "获取支付产品失败,请检查itunesconnect中配置的商品是否正常")
static let PayCanceled = GHError(code: 1002, msg: "取消支付")
static let DuplicatePay = GHError(code: 1003, msg: "重复购买")
static let CannotMakePayment = GHError(code: 1004, msg: "无法进行支付(iOS系统反馈)")
static let RestoreTxFailed = GHError(code: 1006, msg: "恢复已完成交易失败(iOS系统反馈)")
static let ServerResponseEmpty = GHError(code: 1011, msg: "服务器响应为空")
static let CannotPayByGuest = GHError(code: 1015, msg: "您现在是游客模式不能支付")
static let PleaseTryAgain = GHError(code: 1016, msg: "请再次重试")
static let NoPaidProduct = GHError(code: 1020, msg: "当前没有已支付而未发货的订单")
static let FixingOrder = GHError(code: 1021, msg: "本地存在未完成订单,补单中...")
//防沉迷登录相关
static let NoTime = GHError(code: -10360601, msg: "您今日的游戏时长已耗尽")
static let NotKidTime = GHError(code: -10360602, msg: "每日22点至次日8点为未成年人禁止游戏的时间")
static let NotAllowKid = GHError(code: -10742167, msg: "本游戏暂不开放未成年用户登录,如有疑问请联系盛趣游戏客服:95105222")
static let NotAllowKLogin = GHError(code: -10742168, msg: "渠道禁止登录")
static let SystemError = GHError(code: -10360701, msg: "系统错误")
static let ParamsError = GHError(code: -10360702, msg: "参数不合法")
static let NotFindMid = GHError(code: -10360703, msg: "appmid未找到对应的mid")
static let IdNotOK = GHError(code: -10360704, msg: "姓名身份证不匹配或者身份证不合规")
//防沉迷支付相关
static let MismatchCPayondition = GHError(code: -10289231, msg: "您不符合充值的合规条件")
static let SingleOverload = GHError(code: -10289232, msg: "您单笔充值额度已超过限制")
static let TotalOverload = GHError(code: -10289233, msg: "您本月的累计充值额度已超过限制")
static let SingleOverload50 = GHError(code: -10289235, msg: "您未满16周岁,单次充值不得超过50元,请选择低于50元的商品")
static let TotalOverload200 = GHError(code: -10289236, msg: "未满16周岁用户每月累计充值上限为200元,您已达到充值上限")
static let SingleOverload100 = GHError(code: -10289237, msg: "您未满18周岁,单次充值不得超过100元,请选择低于100元的商品")
static let TotalOverload400 = GHError(code: -10289238, msg: "未满18周岁用户每月累计充值上限为400元,您已达到充值上限")
static let MismatchCPayonditionLess8 = GHError(code: -10289239, msg: "您未满8周岁,暂不符合充值的合规条件")
//绑定手机相关
static let NoPhone = GHError(code: -10501000, msg: "该账号未绑定手机")
static let BindSuccess = GHError(code: 1000, msg: "首次绑定成功")
static let BindCanceled = GHError(code: -10501002, msg: "首次绑定取消")
static let RebindSuccess = GHError(code: 1000, msg: "换绑成功")
static let RebindFailed = GHError(code: -10501004, msg: "换绑失败")
static let RebindCanceled = GHError(code: -10501005, msg: "换绑取消")
static let RebindNobind = GHError(code: -10501006, msg: "已绑定手机未进行换绑")
static let BindFailed = GHError(code: -10501007, msg: "首次绑定失败") |
|
14.常见问题
-
问题1.接口调用之后没有回调
-
常见原因1
调用接口的对象在调用之后被内存被释放,导致没有回调。建议此类写成单例,以下单例常规写法
static Singleton* _instance = nil;
+ (instancetype)shareInstance {
static dispatch_once_t onceToken ;
dispatch_once(&onceToken, ^{
_instance = [[super allocWithZone:NULL] init] ;
//不是使用alloc方法,而是调用[[super allocWithZone:NULL] init]
//已经重载allocWithZone基本的对象分配方法,所以要借用父类(NSObject)的功能来帮助出处理底层内存分配的杂物
}) ;
return _instance ;
}
//用alloc返回也是唯一实例
+(id) allocWithZone:(struct _NSZone *)zone {
return [Singleton shareInstance] ;
}
//对对象使用copy也是返回唯一实例
-(id)copyWithZone:(NSZone *)zone {
return [Singleton shareInstance] ;//return _instance;
}
//对对象使用mutablecopy也是返回唯一实例
-(id)mutableCopyWithZone:(NSZone *)zone {
return [Singleton shareInstance] ;
}
@end
-
问题2.微信三方登陆过程中,游戏打开微信 微信提示: 微信登录失败,由于应用Universal link校验不通过,无法完成微信登录
-
常见原因1
微信后台没有正确配置universal link (1.https的链接,以“/”结尾 2.是一个网站根目录 例如 https://https://gpop.sdo.com/)
-
常见原因2
apple-app-site-association没有正确配置在链接根目录(1.要求打开网站可以直接显示apple-app-site-association文件内容,下载apple-app-site-association文件不行,2.手机打开网站主页会出现app图标以及“打开”字样)
Appdelegate中缺少微信回调的方法
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
return [[GHomeAPI sharedGHome] application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
}
-
问题4.dyld: Library not loaded: @rpath/ghome_sdk.framework/ghome_sdk
Referenced from: /private/var/containers/Bundle/Application/90A67208-F713-45FC-BEBB-EAF1E8839DD9/ghome-demo.app/ghome-demo
Reason: image not found
-
常见原因1
Embed属性没有设置成EMbed& Sign (ghome_sdk.framework需要添加进General->Framework, Libraries,and Embedded Content中 并且Embed属性为 Eembed & Sign 参考 3.2)
-
常见原因2
XCode版本号与GhomeSDK打包使用的XCode版本不一致(sdk打包文件名中有对应的XCode对应版本)
-
常见原因3
always Embed Swift standard Libraries 属性没有设置成YES (选中 target 中的 一个target 在build settings 中搜索 swift 会出现 always Embed Swift standard Libraries 设置为yes)
-
常见原因4
ghome_sdk所在目录与游戏项目中所配制路径不相同(一般是脚本拷贝文件时候出错,导致所要使用的sdk版本没有正确复制到对应的目录中)
GhomeSDK 所需要的两个bundle文件没有引入到项目中
一般是缓存导致(1.重启电脑和XCode , 2 将证书删掉重新安装,3. 手动选择证书)
15.文档更新日志
2020.6.3
1.调整文档结构 2.根据XCode版本调整相关内容 3.添加常见问题情况的解决方案
2020.6.3
1.添加三方账号手机绑定接口
2020.8.28
1.LSApplicationQueriesSchemes 增加daoyu
2022.3.7
1.增加- (BOOL)isFaceChecking 方法来处理人脸识别中横竖屏问题
2022.3.9
1.添加wegame sdk 第三方登录接入配置
2022.3.9
1.因wegame bundle文件需要特殊处理,重新梳理了bundle文件处理方式
2022.7.11
1.分享和账号注销功能