# GUNION SDK 开发手册 for iOS(AUTH 功能)

# 1. 前言

本文用于指导游戏开发商接入iOS统一授权认证SDK,文中包含客户端的接入说明。

# 2. SDK接入流程概述

  • 搭建SDK开发环境

  • 配置接口域名

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

  • 初始化SDK

  • 初始化成功

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

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

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

  • # 三方登录支持说明

    • 目前支持三方登录:微信、QQ、微博、叨鱼、wegame、Apple id

    • 支持通过 Ghome SDK 服务端配置动态设置是否支持三方登录,并支持选择其中某几个三方登录

    • !!!强烈建议!!! 游戏接入 SDK 时,完整的实现三方登录需要的接入需求并完成测试,这样未来在需要某个三方登录时,可以通过 Ghome SDK 服务端配置动态开启

    • wegame APP 腾讯目前可能不在运营(已下架),可能在三方登录支持上有瑕疵或者不流畅等各种问题

# 3. 开发环境要求

# 3.1. 引用SDK提供的Framework、资源包

  • 对于iOS开发者,建议使用最新版本XCode进行开发(使用的版本号一定要与sdk打包文件文件名中的XCode匹配),iOS版本需求为11.0及以上。
No. 所在文件夹 文件名称 说明
1 ghome_sdk.framework 官方Framework包文件
2 BundleFile ghome_sdk.bundle 官方IOS资源
3 BundleFile WeiboSDK.bundle 依赖的三方IOS资源
4 BundleFile GT3Captcha.bundle 极验资源
5 BundleFile face-tracker-v001.bundle 人脸识别资源
6 BundleFile WBCloudReflectionFaceVerify.bundle 人脸识别资源
7 BundleFile WeGameSDKResource.bundle Wegame资源文件
9 WeGameSDK WeGameSDK.framework WeGame SDK
10 GT3Captcha GT3Captcha.framework 极验 SDK
11 FaceCheck tnnliveness.framework 人脸识别SDK
12 FaceCheck TuringShieldCamRisk.framework 人脸识别SDK
13 FaceCheck WBCloudReflectionFaceVerify.framework 人脸识别SDK
14 FaceCheck YTCommonLiveness.framework 人脸识别SDK
15 FaceCheck YTFaceAlignmentTinyLiveness.framework 人脸识别SDK
16 FaceCheck YTFaceDetectorLiveness.framework 人脸识别SDK
17 FaceCheck YTFaceLiveReflect.framework 人脸识别SDK
18 FaceCheck YTFaceTrackerLiveness.framework 人脸识别SDK
19 FaceCheck YTPoseDetector.framework 人脸识别SDK
20 GShare.framework 分享SDK,如果不需要分享,可以删掉

# 3.2. 添加所需要的库文件

添加资源文件(注:不再需要将sdk 设置为 Eembed & Sign),将ghome_union_auth_sdk文件夹托入Xcode工程中

此时文件夹中的所有framework 和bundle文件将自动加入到项目工程中

添加sdk依赖的系统库

Accelerate.framework
CoreTelephony.framework
CoreFoundation.framework
ImageIO.framework
MediaToolbox.framework
CFNetwork.framework
ReplayKit.framework 并设置为optional
SystemConfiguration.framework
MediaPlayer.framework
AuthenticationServices.framework
StoreKit.framework
iAd.framework
libresolv.tbd
libz.tbd
libc++.tbd
libsqlite3.tbd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 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 即可
1
2
3
4
5
6
7
8
9
10

# 3.4. 配置服务器域名

在 Info.plist 文件中配置相应域名,如果不配置将使用默认值。注意:全部为https。可参考demo

key 默认值(String类型) 说明
ghomesdkHostApiBiz gunionauth.u.sdo.com 业务服务端接口地址(主要包含认证业务)
ghomesdkHostApiLog reportsk.web.sdo.com 日志收集服务端接口地址
ghomesdkHostApiAgreement utility.sdoprofile.com 获取隐私协议服务端接口地址
ghomesdkRevokeAgreementLink https://sdkdl.sdoprofile.com/ghome/ghome_revoke.html 账号注销协议地址链接
ghomesdkTencentCaptchaLink https://we.sdoprofile.com/common/static/register/public/tcaptcha.html Captcha验证码地址链接

# 3.5. 在Appdelegate中添加函数

- (void)applicationDidEnterBackground:(UIApplication *)application {
   [[GHomeAPI sharedGHome] applicationDidEnterBackground:application];
  }

- (void)applicationWillEnterForeground:(UIApplication *)application {
   [[GHomeAPI sharedGHome] applicationWillEnterForeground:application];
  }
1
2
3
4
5
6
7

# 4. 基础功能

# 4.1SDK隐私协议接口

  • 隐私协议接口定义
/**
 * 初始化
 * @param delegate       委托对象
 *        appId          游戏ID
 */
-(void)showUserAgreement:(id <GHomeAPIShowUserAgreementDelegate>)delegate
                      appId:(NSString *)appId;
1
2
3
4
5
6
7
  • 隐私协议接口调用示例
[[GHomeAPI sharedGHome] showUserAgreement:self appId:@"1000"];
1
  • 隐私协议接口回调示例
- (void)showUserAgreementResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg{
    NSString * string = [NSString stringWithFormat:@"%ld,%@",(long)resultCode,resultMsg];
}
1
2
3
  • 隐私协议接口回调说明

  • 当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;
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
  • 通知隐私协议结果接口定义

    /**
    * 用户协议及隐私条款弹框是否同意 将用户点击结果回调通知SDK
    * isAgree 用户点击结果
    */
    - (void)userIsAgreeAgreement:(BOOL)isAgree;
    
    1
    2
    3
    4
    5
  • 接口调用示例

    [[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:@"不需要弹框,已经同意"];
    
         }
    
     }];
    
    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

# 4.3 获取各种协议链接和内容

  • 接口定义
/**
* 获取用户协议及隐私条款内容
* delegate       委托对象(必须)
* appId         游戏ID(必须)
* privacyPolicyVersion  隐私条款(非必须)
* serviceAgreementVersion 用户协议(非必须)
 */
- (void)getUserAgreement:(id <GHomeAPIGetUserAgreementDelegate>)delegate
                      appId:(NSString *)appId
       privacyPolicyVersion:(NSInteger)privacyPolicyVersion
    serviceAgreementVersion:(NSInteger)serviceAgreementVersion;

/**
* 获取全部用户协议及隐私条款内容
* delegate       委托对象(必须)
* appId         游戏ID(必须)
 */
- (void)getUserAgreementContent:(id<GHomeAPIGetUserAgreementDelegate>)delegate
                          appId:(NSString *)appId;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  • 接口调用示例
[[GHomeAPI sharedGHome] getUserAgreement:self appId:self.appIdTextField.text privacyPolicyVersion:0 serviceAgreementVersion:0];
[[GHomeAPI sharedGHome] getUserAgreementContent:self appId:self.appIdTextField.text];初始化接口回调示例  
1
2
#pragma mark - GHomeAPIGetUserAgreementDelegate
- (void)getUserAgreementResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg dic:(NSDictionary *)dic {
    NSString * string = [NSString stringWithFormat:@"getUserAgreementResult code[%@] msg[%@] info[%@]", @(resultCode), resultMsg, dic];
    [self appendLogInfo:string];
}

#pragma mark - GHomeAPIGetUserAgreementDelegate
- (void)getUserAgreementContentResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg dic:(NSDictionary *)dic {
    NSString * string = [NSString stringWithFormat:@"getUserAgreementContentResult code[%@] msg[%@] info[%@]", @(resultCode), resultMsg, dic];
    [self appendLogInfo:string];
}
1
2
3
4
5
6
7
8
9
10
11
  • 初始化接口回调说明

    当resultCode为 GHOMEAPI_CONSTANTS_SUCCESS 时表示成功。
    当resultCode为其他值时均表示失败,resultMsg为失败信息描述。

# 4.4 SDK初始化

  • 初始化接口定义
/**
 * 初始化
 * @param delegate       委托对象
 *        appId          游戏ID
 */
- (void)initialize:(id<GHomeAPIInitializeDelegate>)delegate
             appId:(NSString*)appId;
1
2
3
4
5
6
7
  • 初始化接口调用示例
[[GHomeAPI sharedGHome] initialize:self appId:@"1000"];
1
  • 初始化接口回调示例
- (void)initializeResult:(NSInteger)resultCode resultMsg:(NSString*)resultMsg
{
    showAlertView(@"initializeResult code[%@] msg[%@]", @(resultCode), resultMsg);
}
1
2
3
4
  • 初始化接口回调说明

    当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票据发送到"登录票据验证接口"进行验证,然后把返回的用户信息(用户id和账号)保存到游戏服务器;

  • 注册&登录时线图
    IOS6

# 5.2. 客户端登录接口

  • 登录接口定义
/**
 * 登录
 * @param delegate       委托对象
 */
- (void)login:(id<GHomeAPILoginDelegate>)delegate;
1
2
3
4
5
  • 登录接口调用示例
[[GHomeAPI sharedGHome] login:self];
1
  • 登录接口回调示例
- (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);
}
1
2
3
4
  • 登录接口回调说明
    当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];
        }
    }];
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

# 5.3. 客户端退出登录接口

  • 退出登录接口定义
/**
 * 退出登录(切换账号)
 * @param delegate       委托对象
 */
- (void)logout:(id<GHomeAPILogoutDelegate>)delegate;
1
2
3
4
5
  • 退出登录接口调用示例
[[GHomeAPI sharedGHome] logout:self];
1
  • 退出登录接口回调示例
- (void)logoutResult:(NSInteger)resultCode resultMsg:(NSString*)resultMsg
{
    showAlertView(@"logoutResult code[%@] msg[%@]", @(resultCode), resultMsg);
}
1
2
3
4
  • 退出登录接口回调说明
    当resultCode 为 GHOMEAPI_CONSTANTS_SUCCESS 时表示成功。
    当resultCode 为其他值时表示失败,resultMsg为失败信息描述。

# 5.4. 三方账号手机绑定接口

  • 绑定接口定义
/**
 * 绑定手机账号
 * @param delegate       委托对象
 */
- (void)bindAcitvityPhone:(id <GHomeAPIBindActivityPhoneDelegate>)delegate;
1
2
3
4
5
  • 绑定手机接口调用示例
 [[GHomeAPI sharedGHome] bindAcitvityPhone:self];
1
  • 绑定手机接口回调示例
- (void)bindActivityPhoneResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg
{
    showAlertView(@"logoutResult code[%@] msg[%@]", @(resultCode), resultMsg);
}
1
2
3
4
  • 绑定手机接口回调说明

    BindSuccess 首次绑定成功
    BindFailed  首次绑定失败
    BindCanceled 首次绑定取消
    RebindSuccess 换绑成功
    RebindFailed 换绑失败
    RebindCanceled 换绑取消。
    
    1
    2
    3
    4
    5
    6

# 6. 扩展功能

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

  • 获取区服信息接口定义
/**
 * 获取区服信息
 * @param delegate       委托对象
 */
- (void)getAreaConfiguration:(id<GHomeAPIGetAreaConfigrationDelegate>)delegate;
1
2
3
4
5
  • 获取区服信息接口调用示例
[[GHomeAPI sharedGHome] getAreaConfiguration:self];
1
  • 获取区服信息接口回调示例
- (void)getAreaConfigrationResult:(NSInteger)resultCode resultMsg:(NSString*)resultMsg info:(NSDictionary*)info
{
    showAlertView(@"getAreaConfigrationResult code[%@] msg[%@] info[%@]", @(resultCode), resultMsg, info);
}
1
2
3
4
  • 获取区服信息接口回调说明
    当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时表示成功
}]
1
2
3
4
5
6
7
8
9
10

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

  • 获取票据接口定义
/**
 * 获取票据,登录后有效
 * @param delegate       委托对象
 *        appId          游戏ID
 *        areaId         区ID
 */
- (void)getTicket:(id<GHomeAPIGetTicketDelegate>)delegate
            appId:(NSString*)appId
           areaId:(NSString*)areaId;
1
2
3
4
5
6
7
8
9
  • 获取票据接口调用示例
[[GHomeAPI sharedGHome] getTicket:self appId:@"1000" areaId:@"1"];
1
  • 获取票据接口回调示例
- (void)getTicketResult:(NSInteger)resultCode resultMsg:(NSString*)resultMsg ticket:(NSString*)ticket
{
    showAlertView(@"getTicketResult code[%@] msg[%@] ticket[%@]", @(resultCode), resultMsg, ticket);
}
1
2
3
4
  • 获取票据接口回调说明

    当resultCode 为 GHOMEAPI_CONSTANTS_SUCCESS 时表示成功,返回ticket值。
    当resultCode 为其他值时表示失败,resultMsg为失败信息描述,ticket值无效。

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

  • 登录区服接口定义
/**
 * 登录区
 * @param areaId         区ID
 */
- (void)loginArea:(NSString*)areaId;

/**
 * 上报所在区服
 * @param areaId         区ID
 * @param groupId        服ID
 */
- (void)loginArea:(NSString *)areaId group:(NSString *)groupId;
1
2
3
4
5
6
7
8
9
10
11
12
  • 登录区服接口调用示例
[[GHomeAPI sharedGHome] loginArea:@"1"];

[[GHomeAPI sharedGHome] loginArea:@"1" group:@"1"];
1
2
3

# 6.4. 客户端上报角色接口

  • 角色上报接口定义
/**
 * 角色上报
 * @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;
1
2
3
4
5
6
7
8
  • 登录区服接口调用示例
[[GHomeAPI sharedGHome] loginRole: @"魔法师" level: 23 from: GHomeAPIRoleFromUpdate area: @"1"];
1
  • 登录区服接口无回调

# 6.5. 获取设备唯一标示接口

  • 获取设备唯一标示接口调用示例
NSString* deviceString = [[GHomeAPI sharedGHome] deviceId];
1
  • 获取设备唯一标示接口无回调

# 6.6. 打开二维码扫码

  • 二维码扫码接口定义:
/**
 * 显示二维码扫描页面
 * @param delegate       委托对象
 *        extendInfo     附加参数(透传)
 */
- (void)scanQRCode:(id <GHomeAPIScanQRCodeDelegate>)delegate extendInfo:(NSString *)extendInfo;
1
2
3
4
5
6
  • 二维码扫码接口调用示例
[[GHomeAPI sharedGHome] scanQRCode: self extendInfo: @"abcd"];
1
  • 二维码扫码接口回调示例
- (void)scanQRCodeResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg 
{
    showAlertView(@"scanQRCodeResult code[%@] msg[%@]", @(resultCode), resultMsg);
}
1
2
3
4
  • 二维码扫码接口回调说明

    当resultCode 为 GHOMEAPI_CONSTANTS_QRLOGIN_SUCCESS 时表示扫码登录成功。
    当resultCode 为 GHOMEAPI_CONSTANTS_QRRESULT 时表示获得的扫码信息透传给游戏,由游戏自行处理,resultMsg为扫码获得的内容。
    当resultCode 为 GHOMEAPI_CONSTANTS_QRCANCEL 时表示用户取消扫码操作。
    当resultCode 为 InvalidTokenError 时表示登录态已失效,请重新登录。

  • 注意事项:

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

# 6.7. 游客升级接口

  • 游客升级接口定义:
/**
 *游客升级
 * @param delegate       委托对象
 */
- (void)guestUpgrade:(id <GHomeAPIGuestUpgradeDelegate>)delegate;
1
2
3
4
5
  • 游客升级接口
[[GHomeAPI sharedGHome] guestUpgrade:self];
1
  • 游客升级接口回调示例
- (void)guestUpgradeResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg {

}
1
2
3
  • 注意事项:

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

# 6.8. 用户协议及隐私条款

  • 通过该接口可以获取到用户协议及隐私条款的链接地址以及协议的版本号
/**
  * 获取用户协议及隐私条款
  * delegate       委托对象(必须)
  * appId         游戏ID(必须)
  * privacyPolicyVersion  隐私条款(非必须)
  * serviceAgreementVersion 用户协议(非必须)
    */

   - (void)getUserAgreement:(id <GHomeAPIGetUserAgreementDelegate>)delegate
      appId:(NSString *)appId
     privacyPolicyVersion:(NSInteger)privacyPolicyVersionserviceAgreementVersion:(NSInteger)serviceAgreementVersion;
1
2
3
4
5
6
7
8
9
10
11
  • 回调方法
/**

  * @param resultCode     返回码
  * resultMsg      返回码描述
  * dic         返回数据
      */

   - (void)getUserAgreementResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg 
      dic:(NSDictionary *)dic;
1
2
3
4
5
6
7
8
9

# 6.9. 是否正在人脸识别(人脸识别横竖屏幕适配)

- (BOOL)isFaceChecking 返回是否正在进行人脸识别

可选方法,如果没有用到人脸可以不用接入此方法

因人脸识别只支持竖屏所以需要在正在进行人脸识别的时候支持竖屏

// 在AppDelegate中加入该函数
- (UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window {
    //横屏游戏:UIInterfaceOrientationMaskLandscape  竖屏游戏:UIInterfaceOrientationMaskPortrait

    if([[GHomeAPI sharedGHome] isFaceChecking]) {
        return UIInterfaceOrientationMaskAll;
    }else {
        return UIInterfaceOrientationMaskLandscape; //此处原来是什么现在就是什么,如果没有参考工程设置的选项
    }

}
1
2
3
4
5
6
7
8
9
10
11

# 6.10. 盛趣游戏通行证账号注销功能

通过该接口将用户的盛趣游戏通行证账号注销,需要在收到注销回调之后退出到登录。

/**
* 注销账号
* @param delegate       委托对象
*/
- (void)unregister:(id <GHomeAPIUnregisterDelegate>)delegate;
1
2
3
4
5

回调方法

/**
* @param resultCode     返回码
*       resultMsg      返回码描述
*/
- (void)unregisterResult:(NSInteger)resultCode resultMsg:(NSString *)resultMsg;

resultCode = 0 表示注销成功,需要退出到登录
resultCode = 1001 表示取消注销流程
其他 表示注销失败
1
2
3
4
5
6
7
8
9

# 7. 扩展接口

/**
 * 扩展接口
 * @param delegate       委托对象
 *       type           接口类型
 *       parameter      接口参数,不同的type对应不同接口。
 *                      所有key和value都是NSString类型。
 *                      具体内容见文档。
 *
 */
- (NSInteger)extendFunction:(id<GHomeAPIExtendDelegate>)delegate
                       type:(GHomeExtendFunctionType)type
                  parameter:(NSDictionary*)param;
1
2
3
4
5
6
7
8
9
10
11
12
// 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;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 7.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"。

# 7.2. 调用说明

# 7.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;
}
1
2
3
4
5
# 7.2.2 GHOME_PAUSE_FUNCTION_TYPE
  • 在实现UIApplicationDelegate的对象中调用。
  • 执行该操作的时候,无需设置delegate。
- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [[GHomeAPI sharedGHome] extendFunction:nil type:GHOME_PAUSE_FUNCTION_TYPE parameter:nil];
}
1
2
3
4
# 7.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);
    // 退到游戏开始画面,引导用户登录
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 7.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);
    // 退到游戏开始画面,引导用户登录
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 7.2.5 GHOME_HIDETOOLBAR_FUNCTION_TYPE
  • 执行该操作的时候,无需设置delegate。
- (void)function
{
    [[GHomeAPI sharedGHome] extendFunction:nil type:GHOME_HIDETOOLBAR_FUNCTION_TYPE parameter:nil];
}
1
2
3
4
# 7.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];
}
1
2
3
4
5
6
# 7.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])
    {
        // 做更新操作,不是所有渠道都需要手动更新,一般都会自动更新,这里只是一个提示。
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 7.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];
}
1
2
3
4
5

# 8. 关于游戏横竖屏设置问题 在AppDelegate中添加该函数

  -(UIInterfaceOrientationMask)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(nullable UIWindow *)window{ 
  return UIInterfaceOrientationMaskLandscape;
}
 UIInterfaceOrientationMaskLandscape 横屏模式
 UIInterfaceOrientationMaskPortrait  竖屏模式
1
2
3
4
5

# 9. 分享

如果不需要分享功能,可以删掉GShare.framework

参考文档

# 10. 附录: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 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 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 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 ServerResponseEmpty = GHError(code: 1011, msg: "服务器响应为空")
static let PleaseTryAgain = GHError(code: 1016, 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 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: "首次绑定失败")   
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
57
58
Last Updated: 6/21/2024, 3:07:38 AM