# 手游直通车 SDK 开发手册 for IOS

# 1. 前言

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

# 2. SDK接入流程概述

  • 搭建SDK开发环境

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

  • 初始化SDK

  • 初始化成功,

  • 用户在进行购买时,调用支付功能相关接口

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

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

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

  • # 三方登录支持说明

    • 目前支持三方登录:微信、QQ、微博、叨鱼、wegame、Apple id
    • 支持通过 Ghome SDK 服务端配置动态设置是否支持三方登录,并支持选择其中某几个三方登录
    • !!!强烈建议!!! 游戏接入 SDK 时,完整的实现三方登录需要的接入需求并完成测试,这样未来在需要某个三方登录时,可以通过 Ghome SDK 服务端配置动态开启

    已知需要注意点:

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

    :::

# 3. 开发环境要求

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

  • 对于iOS开发者,建议使用最新版本XCode进行开发(使用的版本号一定要与sdk打包文件文件名中的XCode匹配),iOS版本需求为11.0及以上。
No. 所在文件夹 文件名称 说明
1 BundleFile 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 TencentCloudHuiyanSDKFace.bundle 人脸识别资源
7 BundleFile WeGameSDKResource.bundle Wegame资源文件
8 BundleFile GShareSDK.bundle 分享需要的资源文件
9 WeGameSDK WeGameSDK.framework WeGame SDK
10 GT3Captcha GT3Captcha.framework 极验 SDK
11 FaceCheck tnnliveness.framework 人脸识别SDK
12 FaceCheck TuringShieldCamRisk.framework 人脸识别SDK
13 FaceCheck TencentCloudHuiyanSDKFace.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 FaceCheck YtSDKKitFrameworkTool.framework 人脸识别SDK
21 FaceCheck YTCv.framework 人脸识别SDK

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

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

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

添加sdk依赖的系统库

Accelerate.framework
CoreTelephony.framework
CoreFoundation.framework
ImageIO.framework
MediaToolbox.framework
CFNetwork.framework
VideoToolbox.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
17

# 3.3. 修改工程配置

1.注:确保 Build Settings -> Build Options-> always embed swift standard libraries 设置为 YES <br>
2.在工程配置里头,找到Linking部分,修改Other Linker Flags,添加内容:-ObjC<br>
3.在Info.plist下加入下面的配置:<br>
NSAppTransportSecurity 下添加 NSAllowsArbitraryLoads YES<br>
4.添加部分访问权限<br>
Privacy - Camera Usage Description "需要使用相机"<br>
Privacy - Tracking Usage Description "**本应用需要访问你的“设备标**识(IDFA)”"<br>
Privacy - Microphone Usage Description  "录制视频"
Privacy - Photo Library Additions Usage Description 本应用需要访问你的“相册” 分享保存图片
Privacy - Photo Library Usage Description 本应用需要访问你的“相册” 分享保存图片

5.全局关闭暗黑模式:<br>
在 Info.plist 文件中,添加 key 为 User Interface Style,类型为 String,value 设置为 Light 即可<br>
1
2
3
4
5
6
7
8
9
10
11
12
13

# 3.4. 在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 换绑取消。<br>
    
    1
    2
    3
    4
    5
    6

# 6. 支付功能

# 6.1. 支付原理说明

  • 支付原理

    1. 游戏客户端发起支付请求;

    2. SDK服务器收到请求,并发送至第三方支付;

    3. 第三方支付成功收费以后通知SDK服务器,再由SDK服务器通知游戏服务器发货至游戏,需要游戏提供"订单通知接口"进行接收;

  • 支付时线图

    IOS7

  • 注意:如果要用SDK提供的demo进行支付测试。那么要把相关证书、Bundle ID 替换成你的开发者证书与相应的Bundle ID。(支付只支持非越狱的真机)。

  • Itunes app设置请参考:

    https://developer.apple.com/library/mac/technotes/tn2259/_index.html#//apple_ref/doc/uid/DTS40009578-CH1-ITUNES_CONNECT

  • itunes product 设置请参考:

    https://developer.apple.com/library/mac/documentation/LanguagesUtilities/Conceptual/iTunesConnectInAppPurchase_Guide/Chapters/CreatingInAppPurchaseProducts.html#//apple_ref/doc/uid/TP40013727-CH3-SW1

# 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;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  • 支付接口调用示例
[[GHomeAPI sharedGHome] pay:self productId:@"p0001" areaId:@"1" groupId:@"1" gameOrderId:@"abc123" extendInfo:nil];
1
  • 支付接口回调示例
- (void)payResult:(NSInteger)resultCode resultMsg:(NSString*)resultMsg
{
    showAlertView(@"payResult code[%@] msg[%@]", @(resultCode), resultMsg);
}
1
2
3
4
  • 支付接口回调说明

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

# 7. 扩展功能

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

# 7.2. 客户端获取游戏商品列表接口

  • 获取支付产品信息接口定义
/**
 * 获取支付产品信息
 * @param delegate       委托对象
 */
- (void)getProductConfiguration:(id<GHomeAPIGetProductConfigrationDelegate>)delegate;
1
2
3
4
5
  • 获取支付产品信息接口调用示例
[[GHomeAPI sharedGHome] getProductConfiguration:self];
1
  • 获取支付产品信息接口回调示例
- (void)getProductConfigurationResult:(NSInteger)resultCode resultMsg:(NSString*)resultMsg info:(NSDictionary*)info
{
    showAlertView(@"getProductConfigurationResult code[%@] msg[%@] info[%@]", @(resultCode), resultMsg, info);
}
1
2
3
4
  • 获取支付产品信息接口回调说明

    当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时表示成功
}]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

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

  • 获取票据接口定义
/**
 * 获取票据,登录后有效
 * @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值无效。

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

  • 登录区服接口定义
/**
 * 登录区
 * @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

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

# <font/ color=red>7.6. 上报角色信息(买量需要)

  • 上报创建角色、角色升级、角色登录
    /**
 * 角色上报
 * @param roleId       角色ID
 * @param roleName     角色名称
 * @param roleLevel    角色等级
 * @param areaId       区ID
 * @param areaName     区名称
 * @param roleCtime    时间戳,距离1970年1月1日的秒数 单位秒
 * @param shiftLevel   转身等级
 * @param fight        战力  
 * @param action       上报类型 分别是   GHomeAPIRoleActionCreate 
                                        GHomeAPIRoleActionLogin
                                        GHomeAPIRoleActionUpdate 
 */

 - (void)reportRole:(NSString *)roleId
          roleName:(NSString *)roleName
         roleLevel:(NSInteger)roleLevel
          areaName:(NSString *)areaName
            areaId:(NSString *)areaId
         roleCtime:(NSInteger)roleCtime
        shiftLevel:(NSInteger)shiftLevel
             fight:(NSInteger)fight
            action:(GHomeAPIRoleAction)action;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  • 接口调用示例
[[GHomeAPI sharedGHome] reportRole:@"role_id_test" 
                          roleName:@"role_name_test" 
                         roleLevel:1 areaName:_areaName 
                            areaId:_areaId 
                         roleCtime:createTime 
                        shiftLevel:10 
                             fight:88 
                            action:GHomeAPIRoleActionCreate];
1
2
3
4
5
6
7
8

# 7.7.获取设备唯一标示

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

# 7.8. 打开二维码扫码

  • 二维码扫码接口定义:
/**
 * 显示二维码扫描页面
 * @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_QRPAY_SUCCESS 时表示扫码支付成功。
    当resultCode 为 GHOMEAPI_CONSTANTS_QRPAY_FAILURE 时表示扫码支付失败。
    当resultCode 为 GHOMEAPI_CONSTANTS_QRRESULT 时表示获得的扫码信息透传给游戏,由游戏自行处理,resultMsg为扫码获得的内容。
    当resultCode 为 GHOMEAPI_CONSTANTS_QRCANCEL 时表示用户取消扫码操作。
    当resultCode 为 InvalidTokenError 时表示登录态已失效,请重新登录。

  • 注意事项:

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

# 7.9. 游客升级接口

  • 游客升级接口定义:
/**
 *游客升级
 * @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
  • 注意事项:

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

# 7.10 用户协议及隐私条款

  • 通过该接口可以获取到用户协议及隐私条款的链接地址以及协议的版本号
/**
  * 获取用户协议及隐私条款
  * 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

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

- (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

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

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

/**
* 注销账号
* @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.13 分享以及录屏功能

1.第三方平台分享 方法在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;
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
调用示例(其他可参考demo)

[[GHomeShareManager sharedManager] gShareTextWithPlatform:nPlatformType Text:@"这是文字分享" userData:12345 shareResult:^(int nPlatformType, int nErrCode, NSString * _Nonnull pszErrMsg, NSInteger lUserData) {
                    //分享结果
}];
1
2
3
4
5

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;
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
调用示例(其他可参考demo)
[[GHomeShareManager sharedManager] gSystemShareTextWithViewController:self Text:@"这是文字分享" userData:12345 shareResult:^(int nPlatformType, int nErrCode, NSString * _Nonnull pszErrMsg, NSInteger lUserData) {
                //分享结果
                }];
1
2
3
4

5.录屏功能 方法在GHomeShareManager类中 //使用 [GHomeShareManager sharedManager]调用分享

//录屏初始化
- (void)gShareInitRecordService;
//开始录屏
- (BOOL)gShareStartRecordingCompleteResultCallback:(GRecordResult)recordResult;
//结束录屏
- (void)gShareStopRecord;
//获取录屏状态
- (NSInteger)gShareGetRecordStauts;
//结束录屏并分享
- (void)gShareStopRecordingAndShareWithViewController:(UIViewController *)vc shareResult:(GShareResult)shareResult;
1
2
3
4
5
6
7
8
9
10

# 8.三方登录功能接入

  • 如需苹果登录 请在工程Signing&Capabilities选项中添加 Sign in with Apple 功能 ,并增加以下配置
    IOS8

  • 添加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
     mqqopensdknopasteboardios16
     mqqopensdknopasteboard
    
    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

    IOS9

  • 在Appdelegate中添加回调函数 下列函数都需要添加

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {      
    [[GHomeAPI sharedGHome] application:application didFinishLaunchingWithOptions:launchOptions];
    return YES;
}
1
2
3
4
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options{
    return [[GHomeAPI sharedGHome] application:app openURL:url sourceApplication:nil annotation:nil];
} (ios9引入)
1
2
3
- (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之前使用该函数)
1
2
3
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
    return [[GHomeAPI sharedGHome] application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
}(ios13之后使用该函数)
1
2
3
  • 三方应用跳转工程设置
    UniversalLink与Associated Domains的填写,需要与申请时保持一致。 IOS8 IOS9

IOS9

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;
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

####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;
}
1
2
3
4
5

#####9.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

#####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);
    // 退到游戏开始画面,引导用户登录
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

#####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);
    // 退到游戏开始画面,引导用户登录
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

#####9.2.5 GHOME_HIDETOOLBAR_FUNCTION_TYPE

  • 执行该操作的时候,无需设置delegate。
- (void)function
{
    [[GHomeAPI sharedGHome] extendFunction:nil type:GHOME_HIDETOOLBAR_FUNCTION_TYPE parameter:nil];
}
1
2
3
4

#####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];
}
1
2
3
4
5
6

#####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])
    {
        // 做更新操作,不是所有渠道都需要手动更新,一般都会自动更新,这里只是一个提示。
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

#####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];
}
1
2
3
4
5

#####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];
}
1
2
3
4

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

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

# 11.隐私清单:PrivacyInfo.xcprivacy

根据苹果公司发布的 App Store 提交的隐私更新 (opens new window),自2024年春季开始,上架 App Store 的应用需要同时提供一份 App 的隐私清单文件。当您准备分发 App 时,Xcode 会将 App 使用的所有第三方 SDK 的隐私清单合并为一个简单易用的报告。这个报告内容全面,总结了 App 中的所有第三方 SDK,让您能够更轻松地创建更准确的隐私标签。

  • ghome_sdk.framework 在11.0.1.0的版本加入了 PrivacyInfo.xcprivacy

  • 手动导入隐私清单到项目中

    ReYun/TrackingIOSDK.framework、GT3Captcha/GT3Captcha.framework、ghome_sdk.framework中的PrivacyInfo.xcprivacy中的条款补全到自身 App 的PrivacyInfo.xcprivacy 中。具体补全方式(二选一即可)可以参见以下内容:

    1.使用 Source Code 方式添加

    Xcode 中使用 Source Code方式打开 app 项目下的 PrivacyInfo.xcprivacy 。复制 PrivacyInfo.xcprivacy 中的条目,注意不要重复添加或错行。

    2.使用 Property List 的方式添加

    在 Xcode 中双击打开 PrivacyInfo.xcprivacy 文件,在其中点击+,Xcode 会提示可选的条款和可设置项,按照需求进行增补即可。

  • ghome_sdk.framework相关的PrivacyInfo.xcprivacy

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>NSPrivacyCollectedDataTypes</key>
        <array>
            <dict>
                <key>NSPrivacyCollectedDataType</key>
                <string>NSPrivacyCollectedDataTypeName</string>
                <key>NSPrivacyCollectedDataTypeLinked</key>
                <true/>
                <key>NSPrivacyCollectedDataTypeTracking</key>
                <false/>
                <key>NSPrivacyCollectedDataTypePurposes</key>
                <array>
                    <string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
                    <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
                </array>
            </dict>
            <dict>
                <key>NSPrivacyCollectedDataType</key>
                <string>NSPrivacyCollectedDataTypePhoneNumber</string>
                <key>NSPrivacyCollectedDataTypeLinked</key>
                <true/>
                <key>NSPrivacyCollectedDataTypeTracking</key>
                <false/>
                <key>NSPrivacyCollectedDataTypePurposes</key>
                <array>
                    <string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
                    <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
                </array>
            </dict>
            <dict>
                <key>NSPrivacyCollectedDataType</key>
                <string>NSPrivacyCollectedDataTypePhotosorVideos</string>
                <key>NSPrivacyCollectedDataTypeLinked</key>
                <true/>
                <key>NSPrivacyCollectedDataTypeTracking</key>
                <false/>
                <key>NSPrivacyCollectedDataTypePurposes</key>
                <array>
                    <string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
                    <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
                </array>
            </dict>
            <dict>
                <key>NSPrivacyCollectedDataType</key>
                <string>NSPrivacyCollectedDataTypeUserID</string>
                <key>NSPrivacyCollectedDataTypeLinked</key>
                <true/>
                <key>NSPrivacyCollectedDataTypeTracking</key>
                <false/>
                <key>NSPrivacyCollectedDataTypePurposes</key>
                <array>
                    <string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
                    <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
                </array>
            </dict>
            <dict>
                <key>NSPrivacyCollectedDataType</key>
                <string>NSPrivacyCollectedDataTypeDeviceID</string>
                <key>NSPrivacyCollectedDataTypeLinked</key>
                <true/>
                <key>NSPrivacyCollectedDataTypeTracking</key>
                <false/>
                <key>NSPrivacyCollectedDataTypePurposes</key>
                <array>
                    <string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
                    <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
                </array>
            </dict>
            <dict>
                <key>NSPrivacyCollectedDataType</key>
                <string>NSPrivacyCollectedDataTypePurchaseHistory</string>
                <key>NSPrivacyCollectedDataTypeLinked</key>
                <true/>
                <key>NSPrivacyCollectedDataTypeTracking</key>
                <false/>
                <key>NSPrivacyCollectedDataTypePurposes</key>
                <array>
                    <string>NSPrivacyCollectedDataTypePurposeAnalytics</string>
                    <string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
                </array>
            </dict>
            <dict>
                <key>NSPrivacyCollectedDataType</key>
                <string>NSPrivacyCollectedDataTypeAdvertisingData</string>
                <key>NSPrivacyCollectedDataTypeLinked</key>
                <false/>
                <key>NSPrivacyCollectedDataTypeTracking</key>
                <false/>
                <key>NSPrivacyCollectedDataTypePurposes</key>
                <array>
                    <string>NSPrivacyCollectedDataTypePurposeOther</string>
                </array>
            </dict>
        </array>
        <key>NSPrivacyAccessedAPITypes</key>
        <array>
            <dict>
                <key>NSPrivacyAccessedAPIType</key>
                <string>NSPrivacyAccessedAPICategoryUserDefaults</string>
                <key>NSPrivacyAccessedAPITypeReasons</key>
                <array>
                    <string>E174.1</string>
                    <string>CA92.1</string>
                </array>
            </dict>
        </array>
        <key>NSPrivacyTracking</key>
        <false/>
        <key>NSPrivacyTrackingDomains</key>
        <array/>
    </dict>
    </plist>
    
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115

# 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: "首次绑定失败")                   |

    |
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91

# 14.文档更新日志

# 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.分享和账号注销功能

# 2023.7.26

1.sdk文件结构调整

# 2024.5.11

1.增加隐私清单处理方式

# 2024.9.13

1.增加7.6 买量上报角色信息

Last Updated: 9/13/2024, 6:53:35 AM