iOS海外SDK接入说明

修订记录

日期 版本号 修改说明 作者
2017/10/11 V4.5.0 文档创建 尹鑫
2018/4/26 V4.5.0 添加新功能,打开指定页面接口 尹鑫
2020/6/28 V4.9.0 新增appstore促销码领取接口 尹鑫

1 接入指南

1.1 获取配置文件

接入前,需要由掌趣项目负责人完成渠道申报并在掌趣后台进行配置,从而获取到该游戏的渠道参数、掌趣配置文件。

1.2 掌趣SDK构成

掌趣 IOS SDK支持 iPhone、iPad、iPod Touch设备,要求armv7、armv7s或arm64架构,操作系统要求Mac要求Lion以上,Xcode要求6以上,iOS SDK要求6.0以上。
掌趣iOS SDK主要由以下几部分构成,如下图:

[1] Ourpalmlib掌趣封装静态库
只支持armv7和arm64架构,固件要求iOS7.0以上
[2] Thirdilb第三方静态库.a或Framework
掌趣静态库封装调用的第三方静态库或Framework
[3] OpenSource第三方开源库
掌趣SDK所使用的第三方开源库或源文件,避免SDK与游戏产生冲突

1.3 搭建开发环境

1.3.1 工程配置

Xcode->Project->Build Settings工程配置
[1] 添加库的连接参数
请在工程文件Build Settings处,找到Other Linker Flags,并添加以下内容


[2] 请将Apple LLVM 5.0 – Language – C++中C++ Standard Library项修改为以下内容


注意:
(1)Compiler Default的默认值在xcode5中为libstdc++,但在xcode6中的默认值为libc++。
(2)如果游戏需要支持C++11的新特性,C++ Standard Library需要设置为libc++,如下图,并且需要使用llvm文件中的静态库


[3] 其他编译设置

1.3.2 Framework添加及配置

Accelerate.framework
libresolv.9.tbd
AddressBook.framework
MessageUI.framework
AudioToolbox.framework
AVFoundation.framework
StoreKit.framework
EventKitUI.framework
EventKit.framework
libsqlite3.tbd
Security.framework
SystemConfiguration.framework
CoreTelephony.framework
CFNetwork.framework
AdSupport.framework

1.3.3 语言配置

参数名 说明
Localization native development region 繁体 CHT
韩语 KOREA
泰语 THAI
英文 EN
越南 VN

1.3.4 iOS13暗黑模式

  1. <key>UIUserInterfaceStyle</key>
  2. <string>Light</string>

1.3.5 客服配置

参数名 说明
Ourpalm_FBMode Mail

1.3.6 iOS9、iOS10配置

[1] 支持HTTP设置
ios9 下苹果要求 App 内访问网络必须使用 HTTPS ,现阶段不能马上改成 https。
请在 Info.plist 中添加 NSAppTransportSecurity 类型 Dictionary.在 NSAppTransportSecurity 下添加 NSAllowsArbitraryLoads 类型 Boolean,值设为 YES。如下图


[2] 白名单设置

[3] 相册权限设置
使用Xcode8打包时,中访问相册功能需要设置权限使用描述,如下图


[4] 去除系统冗余日志输出(非必须)
使用Xcode8调试时请做以下设置,防止无用的系统日志在控制台输出,如下图

1.3.7 dSYM符号化文件配置

[1] dSYM文件
在XCODE编译项目之后,会在app旁看见一个同名的dSYM文件。dSYM文件是iOS编译后保存16进制函数地址映射信息的文件,每次应用程序build后,都会生成对应的xxx.app, xxx.app.dSYM文件。通过此文件可以将16进制地址转换成可读的函数地址,精确定位crash位置,如下图所示:



[2] 工程配置

1.4 接入准备

服务端配置:请参考 通用接入文档—> 《SDK服务端接入说明文档》

2 初始化

2.1 启动接口

功能说明
应用启动时,初始化SDK,并添加奔溃、阻塞监控
接口定义

  1. bool ApplicationDidFinishLaunchingWithOptions(void *application,void *launchOptions);

接口示例

  1. - (BOOL)application:(UIApplication *)application
  2. didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  3. {
  4. //注意这里不可添加其他代码
  5. OPGameSDK::GetInstance().ApplicationDidFinishLaunchingWithOptions(application, launchOptions);
  6. //…
  7. }

2.2 初始化接口

功能说明
1、初始化第三方SDK,同时获取SDK所需要的初始化数据
2、检查版本更新,初始化内部封装了第三方的更新接口
接口定义

  1. void Init(void* controller,OPInitParam opInfo);

注意:
1.初始化接口在不同游戏引擎添加的位置不同,具体参看代码示例
2.游戏本身的初始化最好在SDK的初始化结束并成功后开始,因为部分渠道的SDK有自动展示LOGO的功能,如果游戏的初始化先于SDK的初始化或两者并行可能会造成渠道的LOGO展示部出来或显示时间很短的BUG
3.由于SDK已集成收集奔溃日志的功能,如果游戏使用的是U3D引擎,需要将UnityAppController.mm中的部分代码进行注释,如下图:

参数说明

参数名称 重要性 类型 说明
controller 必填 UIViewController* 游戏rootViewcontroller
opInfo 必填 OPInitParam 用于初始化的参数类

OPInitParam参数说明

参数名称 重要性 类型 说明
mDebugModel 必填 std::string 是否开启测试模式
mGameOnline 必填 bool 游戏类型(false:单机 true:网游)
mGameResVersion 非必填 std::string 游戏资源版本号
mAutoOrientation 非必填 std::string 是否允许自动旋转,默认为true
mScreenOrientation 非必填 OPScreenOrientation 界面初始化方向,默认为横屏
mUseAPIInterface 非必填 bool 设置掌趣官网登录(true:使用API接口,false:使用官网界面

接口示例

  1. //初始化回调函数
  2. void initCallBack(bool result,const char* jsonStr)
  3. {
  4. //返回初始化结果
  5. }

(1)对于coco2d-x引擎:
初始化接口必须放在cocos2d::CCApplication::sharedApplication()->run();之后,且需要添加代码self.window.rootViewController = viewController;

  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
  2. {
  3. //。。。
  4. [windowmakeKeyAndVisible];
  5. //
  6. CGRect rect = [[UIScreen mainScreen] bounds];
  7. bool Ourpalm_Splash = false; //是否显示闪屏
  8. if (Ourpalm_Splash) {
  9. UIImageView *splashImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Ourpalm_Splash"]];
  10. //横屏
  11. splashImageView.frame = CGRectMake(0, 0, rect.size.height, rect.size.width);
  12. //竖屏
  13. //splashImageView.frame = CGRectMake(0, 0, rect.size.width, rect.size.height);
  14. [self.window.rootViewController.view addSubview:splashImageView];
  15. [splashImageView release];
  16. [UIView animateWithDuration:3 animations:^{
  17. } completion:^(BOOL finished) {
  18. [splashImageView removeFromSuperview];
  19. cout<<"OPGameSDK LOG:闪屏结束,OurplamSDK开始初始化!"<<endl;
  20. OPSDK::GetInstance().init(self.viewController);
  21. [NSThread sleepForTimeInterval:3.0];
  22. cout<<"OPGameSDK LOG:游戏开始初始化!"<<endl;
  23. cocos2d::CCApplication::sharedApplication()->run();
  24. }];
  25. }else{
  26. cout<<"OPGameSDK LOG:OurplamSDK开始初始化!"<<endl;
  27. OPSDK::GetInstance().init(self.viewController);
  28. [NSThread sleepForTimeInterval:3.0];
  29. cout<<"OPGameSDK LOG:游戏开始初始化!"<<endl;
  30. cocos2d::CCApplication::sharedApplication()-<run();
  31. }
  32. }

(2)对于unity3d引擎:
初始化接口必须放在OnUnityReady();之后。

  1. - (void)startUnity:(UIApplication*)application
  2. {
  3. //。。。。。。
  4. OnUnityReady();
  5. //掌趣SDK初始化
  6. CGRect rect = [[UIScreen mainScreen] bounds];
  7. bool Ourpalm_Splash = false; //是否显示闪屏
  8. if (Ourpalm_Splash) {
  9. UIImageView *splashImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Ourpalm_Splash"]];
  10. //横屏
  11. splashImageView.frame = CGRectMake(0, 0, rect.size.height, rect.size.width);
  12. //竖屏
  13. //splashImageView.frame = CGRectMake(0, 0, rect.size.width, rect.size.height);
  14. [self.window.rootViewController.view addSubview:splashImageView];
  15. [splashImageView release];
  16. [UIView animateWithDuration:3 animations:^{
  17. } completion:^(BOOL finished) {
  18. [splashImageView removeFromSuperview];
  19. cout<<"OPGameSDK LOG:闪屏结束,OurplamSDK开始初始化!"<<endl;
  20. OPSDK::GetInstance().init(self.viewController);
  21. [NSThread sleepForTimeInterval:3.0];
  22. cout<<"OPGameSDK LOG:游戏开始初始化!"<<endl;
  23. //…….
  24. }];
  25. }else{
  26. cout<<"OPGameSDK LOG:OurplamSDK开始初始化!"<<endl;
  27. OPSDK::GetInstance().init(self.viewController);
  28. [NSThread sleepForTimeInterval:3.0];
  29. cout<<"OPGameSDK LOG:游戏开始初始化!"<<endl;
  30. //…….
  31. }
  32. }
  33. void OPSDK::init(void* rootViewController)
  34. {
  35. OPInitParamopInfo;
  36. opInfo.mDebugModel = false; //debug模式,注意游戏提交ipa时一定要设置为false
  37. opInfo.mGameResVersion = "1.0";//游戏资源版本号
  38. opInfo.mGameOnline = true;//游戏类型(false:单机 true:网游)
  39. opInfo.mAutoOrientation = true; //是否自动旋转
  40. opInfo.mScreenOrientation = OPOrientationLandscapeRight; //界面初始化方向
  41. opInfo.mUseAPIInterface = false; //设置掌趣官网登录(true:使用API接口,false:使用官网界面)
  42. // 初始化回调设置
  43. OPGameSDK::GetInstance().InitCallBack(initCallBack);
  44. }

2.3 获取SDK接口信息

功能说明
获取当前SDK接口哪些接口可用

接口定义

  1. const char* GetEnableInterface();

接口示例

  1. OPGameSDK::GetInstance().GetEnableInterface();

返回数据如下,JSON格式

  1. {"EnterAppBBS":0,"EnterAppCenter":0,"EnterPlatform":1,"EnterUserSetting":1,"HideToolBar":0,"IsLogin":1,"Logout":1,"RegisterLogin":1,"ShowPausePage":0,"ShowToolBar":0,"SwitchAccount":1,"UserFeedback":0}

1: 表示接口可用
0: 表示接口不可用

例如以上返回数据说明:显示隐藏工具栏接口不需要调用,登录、注销、切换账号、用户中心接口需要调用。

2.4 获取渠道信息接口

功能说明
获取当前SDK渠道信息。

接口定义

  1. const char* GetChannelInfo();

接口示例

  1. OPGameSDK::GetInstance().GetChannelInfo();

返回数据如下,JSON格式

  1. {
  2. "channelId":"3101430031014300", //渠道ID
  3. "channelName":"appstore", //渠道名称
  4. "deviceGroupId":"0002", //机型组ID
  5. "localeId":"01", //语言ID
  6. "serviceId":"1000053831014300000" //业务ID
  7. }

为了方便游戏接入,提供以下接口获取:
(1)获取业务ID

  1. OPGameSDK::GetInstance().GetServiceId();

(2)获取渠道ID

  1. OPGameSDK::GetInstance().GetChannelId();

(3)获取渠道名称

  1. OPGameSDK::GetInstance().GetChannelName();

(4)获取机型组ID

  1. OPGameSDK::GetInstance().GetDeviceGroupId();

(5)获取语言ID

  1. OPGameSDK::GetInstance().GetLocaleId();

2.5 设置openURL

功能说明
在调用第三方app进行登录或分享时,通过设置该接口,便可在登录或分享完成后直接返回到游戏中。
接口定义

  1. bool HandleOpenURL(void* url);
  2. bool HandleOpenURL(void* application,void* url,void* sourceApplication,void* annotation);

接口示例

  1. - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
  2. if (OPGameSDK::GetInstance().HandleOpenURL(url)) {
  3. return YES;
  4. }
  5. return NO;
  6. }
  7. - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
  8. sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
  9. {
  10. if(OPGameSDK::GetInstance().HandleOpenURL(application,url,sourceApplication,annotatio)) {
  11. return YES;
  12. }
  13. return NO;
  14. }
  15. - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
  16. {
  17. if (OPGameSDK::GetInstance().HandleOpenURL(application,url,options)) {
  18. return YES;
  19. }
  20. return NO;
  21. }

3 登录功能

3.1 登录流程


1.手机游戏客户端会调用掌趣sdk进行sdk初始化操作
2.掌趣sdk向掌趣用户中心服务器发起登录/注册的请求
3.掌趣用户中心服务器向掌趣sdk返回token、用户信息等等
4.掌趣sdk向返回游戏客户端登录结果和用户信息
5.游戏客户端上传用户信息到游戏服务器
6.服务器根据token向掌趣用户中心服务器获取用户信息
7.掌趣用户中心服务器向游戏服务器返回用户信息
8.游戏服务器向游戏客户端返回登录结果

3.2 登录接口

功能说明
登录掌趣用户中心。游戏客户端调用登录接口(RegisterLogin)前,需要通过设置登录回调接口(RegisterLoginCallBack)将回调函数指针传给SDK,登录成功后,掌趣SDK会通过回调函数通知游戏客户端。

接口定义

  1. //设置登录回调接口
  2. void RegisterLoginCallBack(void (* pf)(bool result,const char* jsonStr));
  3. //登录接口
  4. void RegisterLogin(OPUserType sdkType=kNoneType);

参数说明

参数名称 重要性 类型 说明
OPUserType 必填 enum 掌趣官网登录类型

接口示例

  1. //回调函数
  2. void loginCallBack(bool result,const char* jsonStr)
  3. {
  4. //返回登录结果
  5. }
  6. //设置登录回调接口
  7. OPGameSDK::GetInstance().RegisterLoginCallBack(loginCallBack);
  8. //登录接口
  9. OPGameSDK::GetInstance().RegisterLogin();

返回的JSON数据格式说明
登录成功时

  1. {
  2. "id":"掌趣平台分配的用户唯一id,区分大小写",
  3. "returnJson":{第三方SDK平台返回的数据,一般情况下游戏无需关心},
  4. "tokenId":"掌趣分配的tokenId",
  5. "userName":"掌趣平台中的用户名"
  6. }

登录失败时

  1. {
  2. "desc":"失败描述",
  3. "reset":"状态码","status":"1"
  4. }

注意:
1.返回失败时,SDK会弹出提示框!对于请求超时(状态码为101),不会弹出提示框,游戏可自动重新连接或自己添加提示框。
2.用户ID区分大小写,相同字母和数字、大小写不同的用户ID代表的是两个不同的用户账号。因此,游戏在使用和存储掌趣用户ID时,务必要严格区分大小写,以免造成游戏内账号和角色的混乱等问题。
3.如果游戏有自己的用户ID,必须和掌趣用户中心的用户ID一一对应,不得出现一对多或者多对一的情况。也不得根据其他条件,组合生成新的用户ID,否则将会出现账号丢失的情况。

3.3 设置角色信息

功能说明
当游戏角色注册(登录)成功时设置游戏角色注册(登录)信息。

注:
1、游戏角色注册成功后,调用该接口设置角色注册信息。
2、游戏角色登录成功后,调用该接口设置角色登录信息,否则无法计费。

接口定义

  1. void SetGameLoginInfo(OPGameInfo opGameInfo,OPGameType opGameType);

接口定义

参数名称 重要性 类型 说明
opGameInfo 必须 OPGameInfo 设置游戏账号信息
opGameType 必须 OPGameType 用户标识游戏角色注册登录状态注册:kGameRegister 登录:kGameLogin

OPParam参数说明

参数名称 重要性 类型 说明
mGame_RoleName 必须 std::string 游戏角色名称(不支持富文本)
mGame_RoleId 必须 std::string 游戏角色 id
mGame_ServerId 必须 std::string 游戏服务器id
mGame_ServerName 必须 std::string 游戏服务器名称
mGame_RoleLevel 非必须 std::string 游戏角色等级
mGame_RoleVipLevel 非必须 std::string 游戏角色vip等级

接口示例

  1. OPGameInfo gameInfo;
  2. gameInfo.mGame_RoleId = "123456"; //游戏角色id
  3. gameInfo.mGame_RoleName = "Jack"; //游戏角色名称
  4. gameInfo.mGame_ServerId = "123"; //游戏服务器id
  5. gameInfo.mGame_ServerName = "test"; //游戏服务器名称
  6. gameInfo.mGame_RoleLevel = "1"; //游戏角色等级
  7. gameInfo.mGame_RoleVipLevel = "1"; //游戏角色vip等级
  8. //游戏角色注册成功时调用
  9. OPGameSDK::GetInstance().SetGameLoginInfo(gameInfo,kGameRegister);
  10. //游戏角色登录成功时调用
  11. OPGameSDK::GetInstance().SetGameLoginInfo(gameInfo,kGameLogin);

3.4 注销接口

功能说明
注销当前登陆账号。游戏客户端调用注销接口(LogOut)前,需要通过设置注销回调接口(RegisterLogoutCallBack)将回调函数指针传给SDK,注销成功后,掌趣SDK会通过回调函数通知游戏客户端。

接口定义

  1. void LogOut();

接口示例

  1. //回调函数
  2. void logoutCallBack(bool result,const char* jsonStr)
  3. {
  4. //返回的JSON数据格式说明
  5. 调用登出接口,登出成功时
  6. {"Type":"Logout"} //如果jsonStr == NULL,默认为调用登出接口,登出成功
  7. 调用切换账号,登出成功时
  8. {"Type":"SwitchAccount"}
  9. }
  10. //设置注销回调接口
  11. OPGameSDK::GetInstance().RegisterLogoutCallBack (logoutCallBack);
  12. //注销接口
  13. OPGameSDK::GetInstance().LogOut();

3.5 切换账号

功能说明
注销当前登录账号,切换成功后会调用注销回调函数通知游戏客户端。

接口定义

  1. void SwitchAccount();

接口示例

  1. //回调函数
  2. void logoutCallBack(bool result,const char* jsonStr)
  3. {
  4. //返回的JSON数据格式说明
  5. 调用登出接口,登出成功时
  6. {"Type":"Logout"} //如果jsonStr == NULL,默认为调用登出接口,登出成功
  7. 调用切换账号,登出成功时
  8. {"Type":"SwitchAccount"}
  9. }
  10. //设置注销回调接口
  11. OPGameSDK::GetInstance().RegisterLoginCallBack (logoutCallBack);
  12. //切换账号接口
  13. OPGameSDK::GetInstance().SwitchAccount();

4 支付功能

4.1 支付流程


1.掌趣sdk向掌趣计费服务器发起支付请求
2.掌趣计费服务器生成订单号,并向sdk返回支付结果
3.掌趣计费服务器通知游戏服务器发货
4.游戏服务器发送虚拟物品至玩家手机游戏客户端
5.游戏服务器向计费服务器返回发货结果

4.2 支付接口

功能说明
游戏客户端通过调用计费接口,实现游戏中的道具购买。游戏客户端调用计费接口(Purchase)前,需要继承IAPListener,通过设置接口(SetListener)将对象指针传给SDK,计费成功后,掌趣SDK会通过OnIAPResult通知游戏客户端。
接口定义

  1. void SetListener(IAPListener* listener);
  2. //计费接口
  3. void BuyIAP(OPIAPParam params);

参数说明

参数名称 重要性 类型 说明
mPrice 必填 std::string 商品价格,单位详见3.4货币类型及对应ID
mCurrencyType 必填 std::string 货币类型,详见3.4货币类型及对应ID
mPropName 必填 std::string 商品名称,不含数字
mPropId 必填 std::string 游戏自定义的商品ID,必传。
mPropNum 必填 std::string 商品数量,只能是数字
mPropDescribe 非必填 std::string 商品描述
mDeleverUrl 必填 std::string 发货地址
mExtendParams 非必填 std::string 游戏自定义扩展参数
mGameRoleLevel 非必填 std::string 游戏角色等级
mGameRoleVipLeve 非必填 std::string 游戏角色VIP等级

接口示例

  1. class OPTest : public IAPListener
  2. { //通知计费结果
  3. void OnIAPResult(bool result, const char* jsonStr);
  4. }
  5. void OPTest::OPPurchase
  6. {
  7. OPIAPParam params;
  8. params.mPrice = "100"; //商品价格
  9. params.mCurrencyType = "1"; //货币类型,人民币为1
  10. params.mPropName = "宝石"; //商品名称,不含数字
  11. params.mPropId = "4261299"; //游戏自定义商品id
  12. params.mPropNum = "100"; //商品数量,只能是数字
  13. params.mPropDescribe = ""; //商品描述
  14. params.mDeleverUrl = ""; //发货地址(必填)
  15. params.mExtendParams = ""; //自定义参数
  16. params.mGameRoleLevel = ""; //游戏角色等级(可选)
  17. params.mGameRoleVipLevel = ""; //游戏VIP等级(可选)
  18. OPGameSDK::GetInstance().SetListener(this);
  19. OPGameSDK::GetInstance().BuyIAP(params); //购买接口
  20. }

注:1、Android端和iOS端返回错误码不一致。2、Android返回参数key为小写{String ssid, String pbid},iOS端返回json中的key为小驼峰{ “desc”:成功描述,”propId”:”道具ID”,”reset”:”120”,”ssId”:”订单号}

4.3 恢复购买接口

  1. OPGameSDK::GetInstance().RestorePayments("ubi.heroes.0.99d");

5 礼包码功能

功能说明
兑换礼包码
接口定义

  1. void ExchangeGameCode(const char *gamecode,const char *deleverUrl,const char *extendParams);

参数说明

参数名称 重要性 类型 说明
gamecode 必填 const char * 礼包码
deleverUrl 必填 const char * 礼包码发货地址
extendParams 非必填 const char * 游戏自定义参数

接口示例

  1. void OPSDK::OnGamecodeResult(bool result, const char* jsonStr)
  2. {
  3. // 返回礼包码兑换结果
  4. }
  5. void OPSDK:: ExchangeGameCode()
  6. {
  7. const char* gamecode = "";
  8. const char* deleverUrl = "http://wwww;
  9. const char* extendParams = "";
  10. OPGameSDK::GetInstance().ExchangeGameCode(gamecode,deleverUrl,extendParams);
  11. }

6 appstore促销码领取接口

功能说明
用于玩家在appstore兑换促销码后,领取相关道具时使用的接口,需要在角色登录后才可进行调用
参数说明
参数名称 重要性 类型 说明
deliverUrl 必填 string * 游戏发货地址

  1. OPGameSDK::GetInstance().GetPromotionCode("https://global-1000112300.gamebean.net/index.php?mod=http&act=Account.ouCallBack&ver=current");

7 客服功能

7.1 AIhelp客服

功能说明
在登录游戏后,调用此接口打开用户反馈界面
游戏需要自己设计UI展示以及展示位置,当用户点击此按钮时,调用接口,打开客服反馈页面。
工程配置
添加客服SDK(OPFeedbackSDK.a)及资源(ourpalm_fbres.bundle),如下图

接口定义

  1. void UserFeedback();

接口示例

  1. OPGameSDK::GetInstance().UserFeedback();

7.2 HelpShift客服

7.2.1 展示常见问题

  1. OPGameSDK::GetInstance().ChannelSpreads("ShowFAQ",nil);

7.2.2 展示客服会话

  1. NSArray *array = [[NSArray alloc] initWithObjects:@"odin-hs-open",@"odin-close", nil];
  2. OPGameSDK::GetInstance().ChannelSpreads("ShowConversation",(void*)array);

7.2.3 展示特定问题

  1. NSString *faqId = @"31";
  2. NSArray *array = [[NSArray alloc] initWithObjects:@"odin-hs-open",@"odin-close", nil];
  3. OPGameSDK::GetInstance().ChannelSpreads("ShowSingleFAQ",faqId,(void*)array);

7.2.4 展示问题列表

  1. NSString *faqId = @"29";
  2. NSArray *array = [[NSArray alloc] initWithObjects:@"odin-hs-open",@"odin-close", nil];
  3. OPGameSDK::GetInstance().ChannelSpreads("ShowFAQSection",faqId,(void*)array);

7.2.5 设置用户信息

游戏未登录时,需要通过此接口设置用户信息

  1. NSMutableDictionary *dic = [[[NSMutableDictionary alloc] init] autorelease];
  2. [dic setObject:@"用户名称" forKey:@"userName"];
  3. [dic setObject:@"用户ID" forKey:@"userId"];
  4. [dic setObject:@"角色ID" forKey:@"roleId"];
  5. [dic setObject:@"角色名称" forKey:@"roleName"];
  6. [dic setObject:@"角色等级" forKey:@"roleLevel"];
  7. [dic setObject:@"游戏服ID" forKey:@"serverId"];
  8. OPGameSDK::GetInstance().ChannelSpreads("SetFAQUserInfo",dic);

8 推送功能

功能说明
掌趣APNS推送所必须的接口添加,请在AppDelegate.mm中添加以下方法:

  1. - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
  2. {
  3. OPGameSDK::GetInstance().AppliactionDidRegisterForRemoteNotificationsWithDeviceToken(application, deviceToken);
  4. }
  5. - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
  6. {
  7. OPGameSDK::GetInstance().AppliactionDidFailToRegisterForRemoteNotificationsWithError(application, error);
  8. }
  9. - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
  10. {
  11. OPGameSDK::GetInstance().AppliactionDidReceiveRemoteNotification(application, userInfo);
  12. }

9 删除账号

9.1 检测接口

接口定义:
检测当前账号是否可删除

  1. bool CanShowDeleteAccount();

9.2 删除接口

接口定义:
销毁账号接口

  1. void DeleteAccount(void* func);

接口示例

  1. //删除账号回调
  2. void deleteAccountCallback(bool result,const char* jsonStr)
  3. {
  4. if (result) {
  5. OPSDK::GetInstance().ShowMsg("删除账号成功");
  6. }else{
  7. OPSDK::GetInstance().ShowMsg("删除账号失败");
  8. }
  9. }
  10. void OPSDK::deleteAccount()
  11. {
  12. if (OPGameSDK::GetInstance().CanShowDeleteAccount()) {
  13. OPGameSDK::GetInstance().DeleteAccount((void*)deleteAccountCallback);
  14. }else{
  15. OPSDK::GetInstance().ShowMsg("游客账号不支持删除账号!");
  16. }
  17. }

10 设置语言接口

  1. // 俄语 ru_RU
  2. // 法语 fr_FR
  3. // 德语 de_DE
  4. // 西班牙 es_ES
  5. // 葡萄牙语 pt_BR
  6. // 英国英语 en_GB
  7. // 意大利语 it_IT
  8. // 繁体 zh_HK
  9. // 泰语 th_TH
  10. // 印尼 in_ID
  11. // 韩语 ko_KR
  12. // 日语 ja_JP
  13. // 土耳其语 tr_TR
  14. // 简体中文 zh_CN
  15. // 英语-菲律宾 en_PH
  16. // 英语-新加坡 en_SG
  17. // 泰语 th_TH
  18. // 印尼语 in_ID
  19. // 简体中文-马来西亚 zh_MY
  20. // 英语-其他国家 en_XX
  21. // 越南-越南语 vi_VN
  22. OPGameSDK::GetInstance().ChannelSpreads("SetLanguage",(void*)"zh_CN");

11 admob广告接口

11.1 设置广告参数

(1)Info.plist文件配置参数

  1. <key>GADApplicationIdentifier</key>
  2. <string>ca-app-pub-xxxx~xxxx</string>

(2)admob.plist文件配置广告ID

  1. <key>AdUnitID</key>
  2. <string>ca-app-pub-xxxx/xxxx</string>

(3)info.plist文件配置广告SKAdNetwork

  1. <key>SKAdNetworkItems</key>
  2. <array>
  3. <dict>
  4. <key>SKAdNetworkIdentifier</key>
  5. <string>cstr6suwn9.skadnetwork</string>
  6. </dict>
  7. <dict>
  8. <key>SKAdNetworkIdentifier</key>
  9. <string>4fzdc2evr5.skadnetwork</string>
  10. </dict>
  11. <dict>
  12. <key>SKAdNetworkIdentifier</key>
  13. <string>4pfyvq9l8r.skadnetwork </string>
  14. </dict>
  15. <dict>
  16. <key>SKAdNetworkIdentifier</key>
  17. <string>2fnua5tdw4.skadnetwork</string>
  18. </dict>
  19. <dict>
  20. <key>SKAdNetworkIdentifier</key>
  21. <string>ydx93a7ass.skadnetwork</string>
  22. </dict>
  23. <dict>
  24. <key>SKAdNetworkIdentifier</key>
  25. <string>5a6flpkh64.skadnetwork</string>
  26. </dict>
  27. <dict>
  28. <key>SKAdNetworkIdentifier</key>
  29. <string>p78axxw29g.skadnetwork</string>
  30. </dict>
  31. <dict>
  32. <key>SKAdNetworkIdentifier</key>
  33. <string>v72qych5uu.skadnetwork</string>
  34. </dict>
  35. <dict>
  36. <key>SKAdNetworkIdentifier</key>
  37. <string>ludvb6z3bs.skadnetwork</string>
  38. </dict>
  39. <dict>
  40. <key>SKAdNetworkIdentifier</key>
  41. <string>cp8zw746q7.skadnetwork</string>
  42. </dict>
  43. <dict>
  44. <key>SKAdNetworkIdentifier</key>
  45. <string>c6k4g5qg8m.skadnetwork</string>
  46. </dict>
  47. <dict>
  48. <key>SKAdNetworkIdentifier</key>
  49. <string>s39g8k73mm.skadnetwork</string>
  50. </dict>
  51. <dict>
  52. <key>SKAdNetworkIdentifier</key>
  53. <string>3qy4746246.skadnetwork</string>
  54. </dict>
  55. <dict>
  56. <key>SKAdNetworkIdentifier</key>
  57. <string>3sh42y64q3.skadnetwork</string>
  58. </dict>
  59. <dict>
  60. <key>SKAdNetworkIdentifier</key>
  61. <string>f38h382jlk.skadnetwork</string>
  62. </dict>
  63. <dict>
  64. <key>SKAdNetworkIdentifier</key>
  65. <string>hs6bdukanm.skadnetwork</string>
  66. </dict>
  67. <dict>
  68. <key>SKAdNetworkIdentifier</key>
  69. <string>prcb7njmu6.skadnetwork</string>
  70. </dict>
  71. <dict>
  72. <key>SKAdNetworkIdentifier</key>
  73. <string>v4nxqhlyqp.skadnetwork</string>
  74. </dict>
  75. <dict>
  76. <key>SKAdNetworkIdentifier</key>
  77. <string>wzmmz9fp6w.skadnetwork</string>
  78. </dict>
  79. <dict>
  80. <key>SKAdNetworkIdentifier</key>
  81. <string>yclnxrl5pm.skadnetwork</string>
  82. </dict>
  83. <dict>
  84. <key>SKAdNetworkIdentifier</key>
  85. <string>t38b2kh725.skadnetwork</string>
  86. </dict>
  87. <dict>
  88. <key>SKAdNetworkIdentifier</key>
  89. <string>7ug5zh24hu.skadnetwork</string>
  90. </dict>
  91. <dict>
  92. <key>SKAdNetworkIdentifier</key>
  93. <string>9rd848q2bz.skadnetwork</string>
  94. </dict>
  95. <dict>
  96. <key>SKAdNetworkIdentifier</key>
  97. <string>y5ghdn5j9k.skadnetwork</string>
  98. </dict>
  99. <dict>
  100. <key>SKAdNetworkIdentifier</key>
  101. <string>n6fk4nfna4.skadnetwork</string>
  102. </dict>
  103. <dict>
  104. <key>SKAdNetworkIdentifier</key>
  105. <string>v9wttpbfk9.skadnetwork</string>
  106. </dict>
  107. <dict>
  108. <key>SKAdNetworkIdentifier</key>
  109. <string>n38lu8286q.skadnetwork</string>
  110. </dict>
  111. <dict>
  112. <key>SKAdNetworkIdentifier</key>
  113. <string>47vhws6wlr.skadnetwork</string>
  114. </dict>
  115. <dict>
  116. <key>SKAdNetworkIdentifier</key>
  117. <string>kbd757ywx3.skadnetwork</string>
  118. </dict>
  119. <dict>
  120. <key>SKAdNetworkIdentifier</key>
  121. <string>9t245vhmpl.skadnetwork</string>
  122. </dict>
  123. <dict>
  124. <key>SKAdNetworkIdentifier</key>
  125. <string>a2p9lx4jpn.skadnetwork</string>
  126. </dict>
  127. <dict>
  128. <key>SKAdNetworkIdentifier</key>
  129. <string>22mmun2rn5.skadnetwork</string>
  130. </dict>
  131. <dict>
  132. <key>SKAdNetworkIdentifier</key>
  133. <string>4468km3ulz.skadnetwork</string>
  134. </dict>
  135. <dict>
  136. <key>SKAdNetworkIdentifier</key>
  137. <string>2u9pt9hc89.skadnetwork</string>
  138. </dict>
  139. <dict>
  140. <key>SKAdNetworkIdentifier</key>
  141. <string>8s468mfl3y.skadnetwork</string>
  142. </dict>
  143. <dict>
  144. <key>SKAdNetworkIdentifier</key>
  145. <string>av6w8kgt66.skadnetwork</string>
  146. </dict>
  147. <dict>
  148. <key>SKAdNetworkIdentifier</key>
  149. <string>klf5c3l5u5.skadnetwork</string>
  150. </dict>
  151. <dict>
  152. <key>SKAdNetworkIdentifier</key>
  153. <string>ppxm28t8ap.skadnetwork</string>
  154. </dict>
  155. <dict>
  156. <key>SKAdNetworkIdentifier</key>
  157. <string>424m5254lk.skadnetwork</string>
  158. </dict>
  159. <dict>
  160. <key>SKAdNetworkIdentifier</key>
  161. <string>ecpz2srf59.skadnetwork</string>
  162. </dict>
  163. <dict>
  164. <key>SKAdNetworkIdentifier</key>
  165. <string>uw77j35x4d.skadnetwork</string>
  166. </dict>
  167. <dict>
  168. <key>SKAdNetworkIdentifier</key>
  169. <string>mlmmfzh3r3.skadnetwork</string>
  170. </dict>
  171. <dict>
  172. <key>SKAdNetworkIdentifier</key>
  173. <string>578prtvx9j.skadnetwork</string>
  174. </dict>
  175. <dict>
  176. <key>SKAdNetworkIdentifier</key>
  177. <string>4dzt52r2t5.skadnetwork</string>
  178. </dict>
  179. <dict>
  180. <key>SKAdNetworkIdentifier</key>
  181. <string>gta9lk7p23.skadnetwork</string>
  182. </dict>
  183. <dict>
  184. <key>SKAdNetworkIdentifier</key>
  185. <string>e5fvkxwrpn.skadnetwork</string>
  186. </dict>
  187. <dict>
  188. <key>SKAdNetworkIdentifier</key>
  189. <string>8c4e2ghe7u.skadnetwork</string>
  190. </dict>
  191. <dict>
  192. <key>SKAdNetworkIdentifier</key>
  193. <string>zq492l623r.skadnetwork</string>
  194. </dict>
  195. <dict>
  196. <key>SKAdNetworkIdentifier</key>
  197. <string>3rd42ekr43.skadnetwork</string>
  198. </dict>
  199. <dict>
  200. <key>SKAdNetworkIdentifier</key>
  201. <string>3qcr597p9d.skadnetwork</string>
  202. </dict>
  203. </array>

11.2 设置广告回调

  1. void adResultCallBack(const char* adState,const char* adDesc)
  2. {
  3. cout<<"adState="<<adState<<" adDesc="<<adDesc<<endl;
  4. if (strcmp(adState, "PreparedFailed") == 0) {
  5. //广告准备失败
  6. }else if (strcmp(adState, "PreparedSuccess") == 0){
  7. //广告准备成功
  8. }if (strcmp(adState, "Show") == 0) {
  9. //广告开始展示
  10. }else if (strcmp(adState, "Clicked") == 0){
  11. //广告已被点击
  12. }else if (strcmp(adState, "Closed") == 0){
  13. //广告窗口已关闭
  14. }else if (strcmp(adState, "VideoAdCompleted") == 0){
  15. //广告结束播放
  16. }else if (strcmp(adState, "ShowFailed") == 0){
  17. //广告播放失败
  18. }
  19. }
  20. OPGameSDK::GetInstance().ChannelSpreads("SetAdmobAdResultCallback",(void*)adResultCallBack);

11.3 展示广告

  1. OPGameSDK::GetInstance().ChannelSpreads("ShowAdmobRewardedAd");

12 其他功能接口

12.1 ServiceCode接入流程

功能说明
获取ServiceCode用于服务端日志统计
1.将OPGameKit.framework添加至工程中
2.在调用SDK初始化接口后调用以下方法即可,详情可参见demo
接口示例

  1. const char* gameResVersion = "1.0"; //游戏资源版本号
  2. OPGameKit::GetInstance().GetServiceCode(gameResVersion);

12.2 设置工具栏接口

功能说明
设置工具栏的显示状态和位置
接口定义

  1. //显示工具栏
  2. void ShowToolBar(OPToolBarPlace toolBarPlace);
  3. //隐藏工具栏
  4. void HideToolBar();

接口示例

  1. OPGameSDK::GetInstance().ShowToolBar(OPToolBarAtTopLeft);
  2. OPGameSDK::GetInstance().HideToolBar();

12.3 进入平台中心接口

功能说明
进入平台中心的首页界面
接口定义

  1. void EnterPlatform();

接口示例

  1. OPGameSDK::GetInstance().EnterPlatform();

12.4 显示暂停页面接口

功能说明
在游戏暂停或者从后台恢复的时候显示暂停页
接口定义

  1. void ShowPausePage();

接口示例

  1. -(void)applicationWillEnterForeground:(UIApplication*)application
  2. {
  3. OPGameSDK::GetInstance().ShowPausePage();
  4. }

12.5 打开指定页面接口

功能说明
打开指定页面接口(可用于论坛、社区、活动)

接口示例

  1. OPGameSDK::GetInstance().ChannelSpreads("ShowWebview",(void*)"http://bbs.0708.com");

12.6 隐私协议接口

功能说明
如果玩家当前ip是欧盟或美国,SDK会自动弹出隐私协议弹窗。

隐私弹窗点击“不同意”、“同意”、隐私协议更新或不需要展示隐私协议时,游戏都会收到此回调。
同时,游戏必须等待协议回调通知,然后才能调用登录和打点等其它SDK功能
特别注意:
如果游戏自己实现了IDFA授权功能,则需要主动调用以下接口,具体参看示例
OPGameSDK::GetInstance().ChannelSpreads(“EnableATTracking”);

可选值 意义 说明
0 点击隐私弹窗同意按钮 显示弹窗并且用户点击了同意协议
1 不用展示隐私弹窗 不需要展示协议、或者用户已经同意过协议
2 点击隐私弹窗拒绝按钮 显示弹窗并且用户点击了不同意协议
3 隐私协议更新,并点击隐私弹窗同意按钮 隐私协议内容有变化,并且用户又同意了新版本的协议
4 该产品没有配置隐私协议功能

说明:
如果回调通知为2(用户拒绝),游戏需要主动退出进程
如果回调结果为其他值,游戏可以继续执行登录和打点
(注意:游戏可能在进入游戏后再次收到此回调(例如隐私协议更新时),注意处理此情况)

接口示例

  1. // 隐私协议回调函数
  2. void privacyCallBack(int code)
  3. {
  4. if (code == 0 || code == 1) {
  5. //如果游戏自己实现了IDFA授权功能,则参看以下示例
  6. if (@available(iOS 14, *)) {
  7. [ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
  8. OPGameSDK::GetInstance().ChannelSpreads("EnableATTracking");
  9. }];
  10. } else {
  11. OPGameSDK::GetInstance().ChannelSpreads("EnableATTracking");
  12. }
  13. }
  14. }
  15. //设置用户协议回调
  16. OPGameSDK::GetInstance().ChannelSpreads("SetPrivacyCallback",(void*)privacyCallBack);

13 附录

13.1 客户端错误码

状态码 说明
101 连接超时
102 网络异常,请检查网络
103 数据异常
104 SDK初始化参数错误
105 SDK语言配置文件错误
106 Ourpalm.cfg配置文件错误
107 SDK未初始化成功
108 SDK未设置登录回调
109 未设置服务器id
110 未设置价格
111 未设置货币类型
112 未设置商品名称
113 未设置商品id
114 未设置虚拟货币单位
115 未设置虚拟货币数量
116 未设置发货地址
117 未设虚拟货币单位
118 未设商品数量
119 用户取消支付
120 支付失败
121 支付页面加载失败
200 支付成功
201 下单成功

13.2 用户中心错误码

跳转查询

13.3 计费中心错误码

跳转查询

13.4 货币类型及对应ID

货币ID是没有限定位数的纯自增值,详情:货币类型详情列表

货币ID 货币名 货币单位
1 人民币
2 美元 美分
3 日元
4 港币
5 英镑 便士
6 新加坡币
7 越南盾
8 台币
9 韩元
10 泰铢 萨当
14 马来西亚林令吉
17 菲律宾币
19 印尼卢比 卢比
21 柬埔寨瑞尔 瑞尔
22 加拿大元
28 巴西雷亚尔
29 智利比索
32 欧元
67 墨西哥比索
70 秘鲁新索尔
93 哥斯达黎加科朗
95 俄罗斯卢布 戈比
110 巴拉圭瓜尼
122 缅甸元
125 哥伦比亚比索