简介

    Splus Game Analytics SDK是一套针对移动平台游戏完整的游戏数据采集分析解决方案. 主要用于帮助手机游戏开发者运营并分析相关游戏内用户行为数据.并以行业标准指标和模型来帮助开展深度的指标分析.

    快速接入

    第一步:申请APPID

    S+网站中创建一款应用,获取相应的APPID.

    第二步:导入SDK

    2.1 下载SDK

    请到平台的开发者中心,具体网址为https://wiki.splus.cn/下载最新的SDK.

    下载包中的内容如下图所示:

    2.2 导入Jar包

    解压ZIP包将SDK核心jar包(SplusSDK_GA_*.jar)合并到目标游戏的构建路径中.

    2.2.1 Eclipse ADT 17 以上版本用户

    Eclipse ADT 17 以上版本用户,请在工程目录下建一个文件夹libs,把jar包直接拷贝到这个文件夹下,刷新下 Eclipse中工程就好了.

    2.2.2 Eclipse ADT 17 以下版本用户

    Eclipse ADT 17 以下版本用户,通过在右键工程根目录,选择Properties -> Java Build Path -> Libraries,然后点击Add External JARs... 选择指向jar的路径,点击OK,即导入成功.

    2.2.3 其他IDE

    使用其他IDE的用户,请遵循各自IDE的设置方式将jar包添加到编译路径中去. 请参考《Dealing with dependencies in Android projects》

    2.3 那些前人爬过的坑

    部分开发者遇到在Eclipse中导入通过在右键工程根目录,选择Properties -> Java Build Path -> Libraries,然后点击Add External JARs...方式导入jar包,程序代码编译没有任何问题,但是通过Eclipse打包导出apk文件后,运行出现"NoClassFoundException cn.splus.sdk.api.ga.DCAgent"错误.出现这种情况一般来说是由于Eclipse与ADT不兼容导致的,ADT在打包过程中不会识别通过上述方式引入的Jar包,而在编译过程中Eclipse本身是识别的.遇到这种情况在工程目录下建一个文件夹libs,把jar包直接拷贝到libs目录下来完成导入的方式做就可以了.

    2.2 导入工程

    2.2.1 下载SDK并集成

    在xcode工程文件右键-Add Files to “xx”,选择将libSplus.a文件及DCAgent.h等头文件添加到工程中.添加成功后可以在Linker Binary with Libraries中看到刚刚添加的.a文件.

    2.3 添加引用库

    在项目targets的Build Phases选项栏的Link Binary with Libraries中添加libz.tbd、CoreTelephony.framework、CoreLocation.framework、Security.framework、AdSupport.framework、SystemConfiguration.framework动态链接库即可.

    2.4 配置权限

    本步骤为可选步骤,用于将设备标识ID保存在钥匙串中,便于同一个开发商的不同APP间共享该设备ID.这样可以使关于设备的指标更为精确.如果开发商觉得不需要,可以直接跳过这一步.

    在Capabilities选项中打开keychain Sharing功能,此时xcode会默认向工程中添加一个与工程同名的entitlements文件.在Keychain Groups中添加cn.splus.deviceIdentify

    2.5 配置HTTP参数

    因最新IOS版本默认使用https上报协议,SplusSDK暂时末使用该上报协议,因此需要开发者在工程的Info.plist文件中以下配置参数:

    2.2导入工程

    将SDK包中的Splus文件夹拷贝到游戏工程的代码目录内.

    2.3 Android平台

    1.将Splus/Android/Splus_GA_Cocos_V*.jar文件复制拷贝到游戏工程的proj.android/libs目录内(Android平台).

    2.在AndroidManifest.xml中配置SDK工作所需要的权限

    							
    							
    						    
    						    
    						    
    						

    权限说明:

    权限 用途
    INTERNET(必须) 允许应用程序联网,以便向我们的服务器端发送数据
    READ_PHONE_STATE(必须) 获取用户手机的IMEI,用来生成唯一的标识用户
    ACCESS_NETWORK_STATE(必须) 检测网络状态
    WRITE_EXTERNAL_STORAGE(必须) 读写SD卡,用户备份统计数据
    ACCESS_WIFI_STATE(必须) 读取MAC地址,用来生成唯一的标识用户

    3.修改proj.android/jni/Android.mk文件,将Splus/Android目录内的DCJniHelper、SplusCocos两个类文件加入到编译路径中去.参考代码如下:

    4.修改proj.android/jni/*/main.cpp文件,调用DCJniHelper::setJVM接口,设置SDK使用的JNI环境.

    								#include “DCJniHelper.h”
    								extern "C"
    								{
    									jint JNI_OnLoad(JavaVM *vm, void *reserved)
    									{
    										JniHelper::setJavaVM(vm);
    										DCJniHelper::setJVM(vm);
    										return JNI_VERSION_1_4;
    									}
    								}
    							

    注意,因cocos2d版本变更的原因,在cocos2d-x 3.x版本之后JNI_Onload函数变移动到了工程目录cocos2d/cocos/platform/android/javaactivity.cpp文件中(3.3版本为javaactivity-android.cpp).开发者需要将该函数从文件中直接删除.

    2.4 iOS平台

    1.在xcode工程文件右键-Add Files to “xx”,将Splus/IOS整个文件夹添加到工程(文件夹内有libSplus.a与SplusCocos.h两个文件).添加成功后可以在Linker Binary with Libraries中看到刚刚添加的.a文件.

    2.在项目targets的Build Phases选项栏的Link Binary with Libraries中添加libz.tbd、CoreTelephony.framework、AdSupport.framework、Security.framework、SystemConfiguration.framework、CoreLocation.framework动态链接库即可.

    3.本步骤为可选步骤,用于将设备标识ID保存在钥匙串中,便于同一个开发商的不同APP间共享该设备ID.这样可以使关于设备的指标更为精确.如果开发商觉得不需要,可以直接跳过这一步.

    在Capabilities选项中打开keychain Sharing功能,此时xcode会默认向工程中添加一个与工程同名的entitlements文件.在Keychain Groups中添加cn.splus.deviceIdentify.

    2.2导入SDK包

    请将解压后的文件放置在全英文路径下,如果路径中含有中文字符,很可能会出现无法导入的问题.如下图:

    双击后缀名为unitypackage的文件,unity会自动将Splus SDK导入到游戏工程中,如图:

    2.3 Android平台

    在AndroidManifest.xml中配置SDK工作所需要的权限

    							
    							
    						    
    						    
    						    
    
    						

    权限说明:

    权限 用途
    INTERNET(必须) 允许应用程序联网,以便向我们的服务器端发送数据
    READ_PHONE_STATE(必须) 获取用户手机的IMEI,用来生成唯一的标识用户
    ACCESS_NETWORK_STATE(必须) 检测网络状态
    WRITE_EXTERNAL_STORAGE(必须) 读写SD卡,用户备份统计数据
    ACCESS_WIFI_STATE(必须) 读取MAC地址,用来生成唯一的标识用户

    如果游戏工程Assets/Plugins/Android目录下没有AndroidManifest.xml文件,请参照游戏本身参数配置该文件,或者可以通过Unity3d导出Android工程的方式获得该文件.具体方式请与Splus联系询问或者google.

    2.4 iOS平台

    1.在项目targets的Build Phases选项栏的Link Binary with Libraries中添加libz.tbd、CoreTelephony.framework、AdSupport.framework、Security.framework、SystemConfiguration.framework、CoreLocation.framework动态链接库即可.

    2.本步骤为可选步骤,用于将设备标识ID保存在钥匙串中,便于同一个开发商的不同APP间共享该设备ID.这样可以使关于设备的指标更为精确.如果开发商觉得不需要,可以直接跳过这一步.

    在Capabilities选项中打开keychain Sharing功能,此时xcode会默认向工程中添加一个与工程同名的entitlements文件.在Keychain Groups中添加cn.splus.deviceIdentify.

    第三步:权限配置

    在AndroidManifest.xml中配置SDK工作所需要的权限

    							
    							
    						    
    						    
    						    
    						

    权限说明:

    权限 用途
    INTERNET(必须) 允许应用程序联网,以便向我们的服务器端发送数据
    READ_PHONE_STATE(必须) 获取用户手机的IMEI,用来生成唯一的标识用户
    ACCESS_NETWORK_STATE(必须) 检测网络状态
    WRITE_EXTERNAL_STORAGE(必须) 读写SD卡,用户备份统计数据
    ACCESS_WIFI_STATE(必须) 读取MAC地址,用来生成唯一的标识用户

    3.1 那些前人爬过的坑

    权限信息不要添加到<application>标签内或者<activity>标签内. 如果不是添加到<manifest>标签内,编译过程中虽然不会出错,但是权限属性不会发挥效果. 此处易引起错误,请接入者注意.

    第四步:初始化SDK

    重要: SDK初始化接口是SDK一切功能的基础,必须接入成功.

    4.1 调用DCAgent.initWithAppIdAndChannelId

    在Application派生类的onCreate方法中调用DCAgent.initWithAppIdAndChannelId.

    SplusSDK中提供了如下方法:

    								DCAgent.initWithAppIdAndChannelId(Context context ,String appId,String channelId , boolean hasRoleSystem)
    							
    接口定义
    DCAgent.initWithAppIdAndChannelId(Context context,String appId, String channelId , boolean hasRoleSystem)
    接口说明
    负责进行SDK的初始化
    参数说明
    参数 是否为空 类型 参数说明
    context 不可为空 Context上下文对象 传Context对象,可以用当前的Activity对象传入
    appId 不可为空,不可为空串 字符串 平台申请的APPID
    channelId 不可为空,不可为空串 字符串 渠道编号,由开发者根据发布渠道自行定义.
    hasRoleSystem 不可为空 布尔值 表示游戏系统是否存在角色系统,默认为false表示无角色系统.

    第三步:初始化SDK

    重要: SDK初始化接口是SDK一切功能的基础,必须接入成功.

    3.1 调用DCAgent类方法initWithAppId:andChannelId:hasRoleSystem

    在AppDelegate中的application:didFinishLaunchingWithOptions:方法中调用,初始化方法定义如下

    								+(void)initWithAppId:(NSString*)appId andChannelId:(NSString*)channelId hasRoleSystem:(BOOL)hasRoleSystem
    							
    接口定义
    +(void)initWithAppId:(NSString*)appId andChannelId:(NSString*)channelId hasRoleSystem:(BOOL)hasRoleSystem
    接口说明
    负责进行SDK的初始化
    参数说明
    参数 是否为空 类型 参数说明
    appId 不可为空,不可为空串 字符串 平台申请的APPID
    channelId 不可为空,不可为空串 字符串 渠道编号
    hasRoleSystem 不可为空 布尔值 是否有角色体系

    第三步:初始化SDK

    重要: 只有SDK初始化成功后 , SDK的其他接口才可以使用.

    调用Agent::initWithAppIdAndChannelId

    该接口需要在AppDelegate.cpp中的applicationDidFinishLaunching方法中调用.

    该接口位于SplusCocos.h文件中,命名空间为Splus,后文不再说明.

    DCAgent.getInstance().initWithAppIdAndChannelId()

    该方法需要在游戏开始前的第一个场景中调用,方法内部会创建一个绑定DCAgent.cs脚本的Object,该Object会存在于游戏的所有场景中,用于监控游戏的整个生命周期.

    接口定义
    Agent::initWithAppIdAndChannelId(const char* appId, const char* channelId, bool hasRoleSystem)
    public void initWithAppIdAndChannelId(string appId, string channelId, bool hasRoleSystem)
    接口说明
    负责进行SDK的初始化
    参数说明
    参数 是否为空 类型 参数说明
    appId 不可为空,不可为空串 字符串 平台申请的APPID
    channelId 不可为空,不可为空串 字符串 渠道编号
    hasRoleSystem 不可为空 布尔值 是否有角色体系

    第五步:接入SDK生命周期接口

    在所有的Activity中添加代码引用: import cn.splus.sdk.api.ga.DCAgent;并在Activity类的生命周期中嵌入如下代码:

    							Activity.onResume方法调用DCAgent.resume(Context);
    							Activity.onPause方法调用DCAgent.pause(Context);
    						

    这个两个方法必须接入主要监控应用的前后台切换,以便计算在线时长. 需要注意的是,游戏分析中在线时长与DCAccount.login接口关联,调用DCAccount.login接口后才会上报在线时长.

    第四步:接入SDK生命周期接口

    这两个生命周期接口适用于Android平台,如果游戏在Android与IOS平台都会上线的话,请在接口调用时加入Android平台宏控.

    							applicationDidEnterBackground方法调用Agent::pause();
    							applicationWillEnterForeground方法调用Agent::resume();
    						

    这个两个方法必须接入主要监控应用的前后台切换,以便计算在线时长. 需要注意的是,游戏分析中在线时长与Account::login接口关联,调用Account::login接口后才会上报在线时长.

    第五步:脚本接口注入

    如果开发者使用的是js或者lua语言,希望在js或者lua侧同样能够成功的调用我们提供的接口,那么这一步骤是你需要关注的.

    如果开发者使用的是cpp语言,可以直接跳过该步骤进入下一步.

    开发者需要在AppDelegate::applicationDidFinishLaunching函数中调用Splus提供的脚本注入接口即可完成所有接口的注入工作,然后开发者就可以在脚本语言中调用Splus提供的脚本接口了.

    脚本注入接口位于Splus.h头文件中,js语言的调用代码参考如下:

    							ScriptingCore* sc = ScriptingCore::getInstance();
    							...
    							//向JS语言侧注入脚本侧接口,使开发者能够在JS中调用DCAgent.js中的接口
    							sc->addRegisterCallback(register_splus_function);
    							sc->start();
    						

    lua语言的调用代码参考如下:

    							lua_State* L = engine->getLuaStack()->getLuaState();
    							...
    							luaopen_splus(L);
    						

    另外,使用js语言的开发者还需要注意一点:cocos中使用的spidermonkey对外接口变更比较大,Splus为了兼容各个版本,使用了一个版本宏来控制Splus.cpp中的代码编译,因此需要开发者根据自己cocos2d版本的不同来打开关闭不同的宏控.

    版本宏位于Splus.h文件中,具体如何使用可以参考Splus.h中的使用说明,这里截图如下,请开发者自行参考.

    使用lua语言的开发者没有这方面的顾虑,这点不需要关注.

    第六步:接入DCAccount.login接口

    第四步:接入DCAccount.login接口

    重要:DCAccount.login接口必须调用,DCAccount.login调用后才允许调用SDK中其他的业务接口.如任务,关卡等.

    在玩家登录的场景发生的时候需要调用login接口.

    如果游戏本身不存在账号系统,可以直接使用Splus提供DCAgent.getUID来获取当前设备ID,并使用该ID登陆即可.

    接口说明:

    接口定义
    DCAccount.login(DCAccount account);
    +(void)login:(DCAccount*)account;
    DCAccount::login(Account* account)
    DCAccount.login(DCAccount account);
    接口说明
    实现玩家登录.需要在SDK初始化之后调用
    参数说明
    参数 是否为空 类型 参数说明
    account 不能为空 DCAccount对象 创建一个游戏账号. 玩家编号,要求全局唯一.即相同游戏中不同平台,不同区服,不同渠道的玩家编号必须唯一. 如果游戏中无特定的accountId,可以调用DCAgent.getUID方法来获取uid作为accountId.
    示例
    											//一个用户编号为“PJ”的玩家登录游戏
    											DCAccount account = DCAccount.newBuilder().setAccountId("PJ").setAge(15).setGender("男").setType("QQ").build();
    											DCAccount.login(account);
    											//如果游戏中没有账号体系,比如各种单机游戏, 那么可以使用UID来替换账号编号.
    											String accountId = DCAgent.getUID();
    											DCAccount account = DCAccount.newBuilder().setAccountId(accountId).setAge(15).setGender("男").setType("QQ").build();
    											DCAccount.login(account);
    										
    											//一个用户编号为“PJ”的玩家登录游戏
    											DCAccount* account = [DCAccount createWithBuilder:^(DCAccountBuilder* builder){
    												[builder setAccountId:@"PJ"];
    												[builder setAge:1];
    												[builder setGender:@"男"];
    												[builder setType:@"QQ"];
    											}];
    											[DCAccount login:account];
    											//如果游戏中没有账号体系,比如各种单机游戏, 那么可以使用UID来替换账号编号.
    											NSString* accountId = [DCAgent getUID];
    											DCAccount* account = [DCAccount createWithBuilder:^(DCAccountBuilder* builder){
    												[builder setAccountId:accountId];
    											}];
    											[DCAccount login:account];
    										
    											//一个用户编号为“PJ”的玩家登录游戏
    											Account account("PJ", "QQ", "男", 15);
    											Account::login(account);
    											//如果游戏中没有账号体系,比如各种单机游戏, 那么可以使用UID来替换账号编号.
    											const char* accountId = DCAgent::getUID();
    											Account account(accountId, "default", "男", 0);
    											Account::login(account);
    										
    											//一个用户编号为“PJ”的玩家登录游戏
    											DCAccount account = new DCAccount("PJ");
    											account.accountType = "QQ";
    											account.gender = "男";
    											account.age = 15;
    											DCAccount.login(account);
    											//如果游戏中没有账号体系,比如各种单机游戏, 那么可以使用UID来替换账号编号.
    											String accountId = DCAgent.getUID();
    											DCAccount account = new DCAccount(accountId);
    											account.accountType = "device";
    											DCAccount.login(account);
    										

    第七步:接入角色使用接口

    第五步:接入角色使用接口

    接口定义:enable

    在游戏中使用某个角色请调用enable接口. 结束使用某个角色请使用disable接口.调用enable接口后,在线时长会主动关联角色相关信息. 由于角色是挂靠用户之下的,所以使用调用角色接口前,必须调用账号的login接口.

    接口说明:

    接口定义
    DCRole.enable(DCRole role)
    +(void)enable:(DCRole*)role
    Role::enable(Role* role)
    DCRole.enable(DCRole role)
    接口说明
    使用某个角色时候调用
    参数说明
    参数 是否为空 类型 参数说明
    role 不能为空 DCRole对象 使用某个角色

    与enable接口对应的 disable接口.

    接口定义
    DCRole.disable()
    +(void)disable
    Role::disable()
    DCRole.disable()
    接口说明
    停止某个角色时候调用

    注意:disable接口与 enable接口一对一配对调用.

    示例
    											DCRole role = DCRole.newBuilder().setRoleId("PJ_Role2"). setGameServer("gameServer2")
    												. setCareer("牧师2").setLevel(1).setRace("人族2").setRoleName("ebadao2").build()
    											DCRole.enable(role);
    											退出某个角色的游戏后:
    											DCRole.disable();
    										
    											DCRole* role = [DCRole createWithBuilder:^(DCRoleBuilder* builder){
    												[role setRoleId:@ "PJ_Role2"];
    												[role setGameServer@"gameServer2"];
    											}]; 
    											[role setCareer@"牧师"];
    											[role setLevel:1];
    											[role setRace:@ "人族"];
    											[role setRoleName:@ "ebadao2"];
    											[DCRole enable:role];
    											退出某个角色的游戏后:
    											[DCRole disable];
    										
    											Role role("PJ_Role2", "ebadao2", "牧师2", "人族2", 1, "gameServer2");
    											Role::enable(&role);
    											退出某个角色的游戏后:
    											Role::disable();
    										
    											DCRole role = new DCRole("PJ_Role2", "gameServer2");
    											role.roleCareer = "牧师2";
    											role.roleRace = "人族2";
    											role.roleName = "ebadao2";
    											role.roleLevel = 1;
    											DCRole.enable(role);
    											退出某个角色的游戏后:
    											DCRole.disable();
    										

    接口定义:createRole

    创建角色接口.

    接口说明:

    接口定义
    DCRole.createRole(String accountId , DCRole role)
    +(void)createRole(NSString*)accountId role:(DCRole*)role
    Role::createRole(const char* accountId , Role* role);
    DCRole.createRole(string accountId , DCRole role)
    接口说明
    创建某个角色时候调用
    参数说明
    参数 是否为空 类型 参数说明
    accountId 不能为空 字符串 账号ID
    role 不能为空 DCRole对象 角色对象
    示例
    											//在服务器"飞龙在天",创建一个人族牧师,角色名称为ebadao. 内部角色编号为"PJ_Role1"
    											DCRole role = DCRole.newBuilder().setRoleId("PJ_Role1").setGameServer("飞龙在天").setCareer("牧师")
    												.setLevel(1).setRace("人族").setRoleName("ebadao").build() ;
    											DCRole.createRole("PJ", role );
    										
    											//在服务器"飞龙在天",创建一个人族牧师,角色名称为ebadao. 内部角色编号为"PJ_Role1"
    											DCRole* role = [DCRole createWithBuilder:^(DCRoleBuilder* builder){
    												[role setRoleId:@ "PJ_Role2"];
    												[role setGameServer@"gameServer2"];
    											}]; 
    											[role setCareer@"牧师"];
    											[role setLevel:1];
    											[role setRace:@"人族"];
    											[role setRoleName:@"ebadao2"];
    											[DCRole createRole:@"PJ" role:role];
    										
    											//在服务器"飞龙在天",创建一个人族牧师,角色名称为ebadao. 内部角色编号为"PJ_Role1"
    											Role role("PJ_Role2", "ebadao2", "牧师2", "人族2", 1, "gameServer2");
    											Role::createRole("PJ", &role);
    										
    											//在服务器"飞龙在天",创建一个人族牧师,角色名称为ebadao. 内部角色编号为"PJ_Role1"
    											DCRole role = new DCRole("PJ_Role2", "gameServer2");
    											role.roleCareer = "牧师2";
    											role.roleRace = "人族2";
    											role.roleName = "ebadao2";
    											role.roleLevel = 1;
    											DCRole.createRole("PJ", role);
    										

    接口定义:levelUp

    接口说明:

    接口定义
    DCRole.levelUp(String roleId, int startLevel, int endLevel, int spendTime)
    +(void)levelUp:(NSString*)roleId prevLevel:(int)startLevel nowLevel:(int)endLevel spendTime:(int)spendTime
    Role::levelUp(const char* roleId, int startLevel, int endLevel, int spendTime)
    DCRole.levelUp(string roleId, int startLevel, int endLevel, int spendTime)
    接口说明
    使用某个角色升级时候调用
    参数说明
    参数 是否为空 类型 参数说明
    roleId 不能为空 字符串 角色编号
    startLevel 不能为空 整型数值 开始等级
    endLevel 不能为空 整型数值 结束等级
    spendTime 不能为空 整型数值 升级时长,单位秒
    示例
    											//角色Role2从1级升级到2级,消耗60秒.
    											DCRole.levelUp("Role2", 1, 2, 60);
    										
    											//角色Role2从1级升级到2级,消耗60秒.
    											[DCRole levelUp:@"Role2" prevLevel:1 nowLevel:2 spendTime:60];
    										
    											//角色Role2从1级升级到2级,消耗60秒.
    											Role::levelUp("Role2", 1, 2, 60);
    										
    											//角色Role2从1级升级到2级,消耗60秒.
    											DCRole.levelUp("Role2", 1, 2, 60);
    										

    业务接口场景

    1. 设置自定义版本

    Splus SDK默认使用安装包本身的版本号作为游戏版本上报,而某些场景下开发者需要自定义版本时可以使用,如下接口设置.

    接口定义
    DCAgent.setVersion(String version);
    +(void)setVersion:(NSString*)version;
    Agent::setVersion(const char* version);
    DCAgent.setVersion(string version);
    接口说明
    自定义版本号
    参数说明
    参数 是否为空 类型 参数说明
    version 否,不能为空也不能为空串 字符串 自定义版本号

    注意:该接口可以随意调用,调用后下一次上报数据会以最新设置的版本号上报.

    2. 自定义事件

    自定义事件可以实现在应用程序中埋点来统计用户的行为.自定义事件在SDK初始化之后就可以正常调用.这区别于其他业务接口需要在DCAccount.login接口调用后才能被调用.

    接入方法:通过调用onEvent接口来设置.

    接口定义
    DCEvent.onEvent(String eventId);
    +(void)onEvent:(NSString*)eventId;
    Event::onEvent(const char* eventId);
    DCEvent.onEvent(string eventId);
    接口说明
    自定义事件,需要在SDK初始化之后调用
    参数说明
    参数 是否为空 类型 参数说明
    eventId 否,不能为空也不能为空串 字符串 事件编号
    接口定义
    DCEvent.onEvent(String eventId,Map map);
    +(void)onEvent:(NSString*)eventId dictionary:(NSDictionary*)map;
    Event::onEvent(const char* eventId,map* map);
    DCEvent.onEvent(string eventId,Dictionary map);
    接口说明
    多属性自定义事件,带有字符属性集
    参数说明
    参数 是否为空 类型 参数说明
    eventId 否,不能为空也不能为空串 字符串 事件编号
    map 不可为空 属性键值对集合 事件需要关注的属性集合
    接口定义
    DCEvent.onEventCount(String eventId,int count);
    +(void)onEventCount:(NSString*)eventId count:(int)count;
    Event::onEventCount(const char* eventId,int count);
    DCEvent.onEventCount(string eventId,int count);
    接口说明
    自定义事件,需要在SDK初始化之后调用
    参数说明
    参数 是否为空 类型 参数说明
    eventId 否,不能为空也不能为空串 字符串 事件编号
    count 整型数值 事件发生次数
    接口定义
    DCEvent.onEventDuration(String eventId,long duration);
    +(void)onEventDuration:(NSString*)eventId duration:(long long)duration;
    Event::onEventDuration(const char* eventId,long duration);
    DCEvent.onEventDuration(string eventId,long duration);
    接口说明
    统计自定义事件的使用时长,需要在SDK初始化之后调用
    参数说明
    参数 是否为空 类型 参数说明
    eventId 否,不能为空也不能为空串 字符串 事件编号
    duration 整型数值 事件时长,可以指事件发生过程所消耗的时间,也可以指事件发生过程中,某一个过程的时长,具体需要看调用时的定义. 时长的单位是秒
    示例1
    											//玩家触发分享的次数
    											DCEvent.onEvent("touch_share_btn");
    										
    											//玩家触发分享的次数
    											+(void)onEvent:@"touch_share_btn";
    										
    											//玩家触发分享的次数
    											Event::onEvent("touch_share_btn");
    										
    											//玩家触发分享的次数
    											DCEvent.onEvent("touch_share_btn");
    										
    示例2
    											//游戏内玩家"兑换礼品"这个行为,可能涉及到"兑换礼品"的种类和数量
    											HashMap map = new HashMap();
    											map.put("item","skill book"); //技能书
    											map.put("count","4"); //数量
    											DCEvent.onEvent("cash_gift" ,map);
    										
    											//游戏内玩家"兑换礼品"这个行为,可能涉及到"兑换礼品"的种类和数量
    											NSMutableDictionary* dictionary = [NSMutableDictionary dictionary];
    											[dictionary setValue:@"item" forKey:@"skill book"]; //技能书
    											[dictionary setValue:@"count" forKey:@"4"]; //数量
    											[DCEvent onEvent:@"cash_gift" dictionary:dictionary];
    
    										
    											//游戏内玩家"兑换礼品"这个行为,可能涉及到"兑换礼品"的种类和数量
    											map map;
    											map.insert(pair("item","skill book")); //技能书
    											map.insert(pair("count","4")); //数量
    											Event::onEvent("cash_gift" , &map);
    										
    											//游戏内玩家"兑换礼品"这个行为,可能涉及到"兑换礼品"的种类和数量
    											Dictionary map = new Dictionary();
    											map.Add("item","skill book"); //技能书
    											map.Add("count","4"); //数量
    											DCEvent.onEvent("cash_gift" ,map);
    										

    3. 关卡统计

    Splus提供了DCLevels类来负责相关游戏关卡的统计,在关卡结束的时候,接入相关的

    统计接口.具体的接口定义如下:

    接口定义
    DCLevels.complete(String levelId,String levelType,long spendTime,boolean result , boolean isFirst , String failReason)
    +(void)complete:(NSString*)levelId levelType:(NSString*)levelType spendTime:(long long)spendTime result:(bool)result completeFirst:(bool)isFirst reason:(NSString*)failReason
    Levels::complete(const char* levelId,const char* levelType,long spendTime,bool result , bool isFirst , const char* failReason)
    DCLevels.complete(string levelId,string levelType,long spendTime,bool result , bool isFirst , string failReason)
    接口说明
    游戏关卡完成,需要在DCAccount.login接口之后调用.
    参数说明
    参数 是否为空 类型 参数说明
    levelId 不能为空,也不可以设置空字符串 字符串 游戏关卡编号
    levelType 不能为空 字符串 关卡类型
    spendTime 不能为空 整型数值 完成关卡耗费的时间,成功或者失败都需要填写
    result 不能为空 布尔值 是否通关,通关填true,失败填false
    isFirst 不能为空 布尔值 是否是首次出现通过成功或者失败的情况. 首次成功 或者 首次失败都要记录.
    failReason 可以为空 字符串 游戏失败时,填写
    示例
    										//通过成功, 但并非第一次通过:
    										DCLevels.complete("level-1", "普通", 100L, true, false, null);
    										//通过成功,首次通过:
    										DCLevels.complete("level-1", "普通", 100L, true, true, null);
    										//通过失败, 首次失败:
    										DCLevels.complete("level-2", "普通", 0L, false, true, "戰鬥力不足"); 
    										//通过失败, 再次失败:
    										DCLevels.complete("level-3", "普通", 0L, false, false , "戰鬥力不足");
    									
    										//通过成功, 但并非第一次通过:
    										[DCLevels complete:@"level-1" levelType:@"普通" spendTime:100L result:true completeFirst:false failReason:nil);
    										//通过成功,首次通过:
    										[DCLevels complete:@"level-1" levelType:@"普通" spendTime:100L result:true completeFirst:true failReason:nil);
    										//通过失败, 首次失败:
    										[DCLevels complete:@"level-2" levelType:@"普通" spendTime:0L result:false completeFirst:true failReason: @"戰鬥力不足"]; 
    										//通过失败, 再次失败:
    										[DCLevels complete:@"level-3" levelType:@"普通" spendTime:0L result:false completeFirst:false , failReason:@"戰鬥力不足"];
    									
    										//通过成功, 但并非第一次通过:
    										Levels::complete("level-1", "普通", 100L, true, false, null);
    										//通过成功,首次通过:
    										Levels::complete("level-1", "普通", 100L, true, true, null);
    										//通过失败, 首次失败:
    										Levels::complete("level-2", "普通", 0L, false, true, "戰鬥力不足"); 
    										//通过失败, 再次失败:
    										Levels::complete("level-3", "普通", 0L, false, false , "戰鬥力不足");
    									
    										//通过成功, 但并非第一次通过:
    										DCLevels.complete("level-1", "普通", 100L, true, false, null);
    										//通过成功,首次通过:
    										DCLevels.complete("level-1", "普通", 100L, true, true, null);
    										//通过失败, 首次失败:
    										DCLevels.complete("level-2", "普通", 0L, false, true, "戰鬥力不足"); 
    										//通过失败, 再次失败:
    										DCLevels.complete("level-3", "普通", 0L, false, false , "戰鬥力不足");
    									

    4. 付费统计

    SplusSDK通过DCVirtualCurrency类提供了真实付费过程的记录方法

    具体的接口定义如下:

    接口定义
    DCVirtualCurrency.paymentSuccess(String orderId,String iapId, double currencyAmount,String currencyType ,String paymentType, String levelId)
    +(void)paymentSuccess:(NSString*)orderId iapId:(NSString*)iapId currencyAmount:(double)currencyAmount currencyType:(NSString*)currencyType paymentType:(NSString*)paymentType levelId:(NSString*)levelId
    VirtualCurrency::paymentSuccess(const char* orderId,const char* iapId, double currencyAmount,const char* currencyType ,const char* paymentType, const char* levelId)
    DCVirtualCurrency.paymentSuccess(string orderId,string iapId, double currencyAmount,string currencyType ,string paymentType, string levelId)
    接口说明
    付费完成接口,需要在DCAccount.login接口之后调用.
    参数说明
    参数 是否为空 类型 参数说明
    orderId 不可为空 字符串 支付流水号,付费的惟一标识,不能重复,用于去重处理,相同orderId的付费数据只会统计一笔。如果开发者无法从第三方支付SDK中获取到,请自行生成传入。
    iapId 可以为空 字符串 礼包编号
    currencyAmount 不能为空 整型数值 付费现金或现金等价物的额度
    currencyType 不能为空,也不可以设置空字符串 字符串 国际标准组织ISO4217中规范的货币代码,如:人民币CNY、美元USD等
    paymentType 不能为空 字符串 支付途径:如"xxx支付SDK","支付宝"等.
    levelId 可以为空 字符串 当前玩家所在关卡
    示例
    									//示例:如果某个玩家通过支付宝付费了100人民币,支付宝给出的付费流水号
    									//为"21asdfefa".那么可以通过如下方式调用
    									DCVirtualCurrency.paymentSuccess("21asdfefa","iapId001",100.00,"CNY","支付宝", "level-1");
    									
    										//示例:如果某个玩家通过支付宝付费了100人民币,支付宝给出的付费流水号
    										//为"21asdfefa".那么可以通过如下方式调用
    										[DCVirtualCurrency paymentSuccess:@"21asdfefa" iapId:@"iapId001" currencyAmount:100.00 currencyType:@"CNY" paymentType:@"支付宝" levelId:@"level-1"];
    									
    									//示例:如果某个玩家通过支付宝付费了100人民币,支付宝给出的付费流水号
    									//为"21asdfefa".那么可以通过如下方式调用
    									VirtualCurrency::paymentSuccess("21asdfefa","iapId001",100.00,"CNY","支付宝", "level-1");
    									
    									//示例:如果某个玩家通过支付宝付费了100人民币,支付宝给出的付费流水号
    									//为"21asdfefa".那么可以通过如下方式调用
    									DCVirtualCurrency.paymentSuccess("21asdfefa","iapId001",100.00,"CNY","支付宝", "level-1");
    									

    5.虚拟币统计

    虚拟币统计是用来统计分析游戏内虚拟货币的留存,收支的情况

    5.1接口定义:DCCoin.get

    接口定义
    DCCoin.get(String reason, String coinType, long gain, String levelId);
    +(void)get:(NSString*)reason coinType:(NSString*)coinType gainCoin:(long long)gain levelId:(NSString*)levelId
    Coin::get(const char* reason, const char* coinType, long long gain,String levelId);
    DCCoin.get(string reason, string coinType, long gain, string levelId);
    接口说明
    记录玩家虚拟币获取并同时记录虚拟币留存总量,需要在DCAccount.login接口之后调用.
    参数说明
    参数 是否为空 类型 参数说明
    reason 不可为空,不可为空串 字符串 玩家获取上虚拟币原因
    coinType 不可为空,不可为空串 字符串 虚拟币类型
    gainCoin 整型数字 玩家获取的虚拟币数量,请不要传入负值
    levelId 字符串 当前所在关卡

    5.2接口定义:DCCoin.use

    接口定义
    DCCoin.use(String reason, String coinType, long lost, String levelId);
    +(void)use:(NSStirng*)reason coinType:(NSString*)coinType lostCoin:(long long)lost levelId:(NSString*)levelId
    Coin::use(const char* reason, const char* coinType, long long lost,String levelId)
    DCCoin.use(string reason, string coinType, long lost, string levelId)
    接口说明
    记录玩家虚拟币消耗并同时记录虚拟币留存总量,需要在DCAccount.login接口之后调用.
    参数说明
    参数 是否为空 类型 参数说明
    reason 不可为空,不可为空串 字符串 玩家消耗虚拟币原因
    coinType 不可为空,不可为空串 字符串 虚拟币类型
    lostCoin 整型数字 玩家消耗的虚拟币数量,请不要传入负值
    levelId 字符串 当前所在关卡

    5.3接口定义:DCCoin.buy

    接口定义
    DCCoin.buy(double currencyAmount, String currencyType, String coinType, long coinNum, String levelId);
    +(void)buy:(double)currencyAmount currencyType:(NSStirng*)currencyType coinType:(NSString*)coinType coinNum:(long long)coinNum levelId:(NSStirng*)levelId
    Coin::buy(long long currencyAmount, const char* currencyType, const char* coinType, long long coinNum, const char* levelId)
    DCCoin.buy(double currencyAmount, string currencyType, string coinType, long coinNum, string levelId)
    接口说明
    记录玩家购买虚拟币行为并同时记录虚拟币留存总量,需要在DCAccount.login接口之后调用.
    参数说明
    参数 是否为空 类型 参数说明
    currencyAmount double型数字 玩家花费真实货币数量
    currencyType 字符串 玩家花费的真实货币类型
    coinType 不可为空,不可为空串 字符串 虚拟币类型
    coinNum 整型数字 玩家获得的虚拟币数量
    levelId 字符串 当前所在关卡

    5.4使用须知

    虚拟币接口是支持多类型虚拟币统计的,这是一个非常重要的特性.很多游戏都有一种以上的虚拟币类型.比如金币+钻石组合, 金币+人气组合等等.通过接口中的coinType类型,SplusSDK可以区分出不同的虚拟币类型,进而进行分类的计算

    虚拟币中通过DCCoin.get接口来统计虚拟币获取,通过DCCoin.use来统计虚拟币消耗. 通过DCCoin.buy来统计系统中真实货币兑换出来虚拟币的数量.

    5.5那些前人爬过的坑

    由于虚拟币所涉及的游戏经济系统,是游戏中一个非常重要的环节.大部分游戏类型都有非常强的接入意识遇到的问题也比较多. 常见的场景如下

    场景1:游戏里面既有金币又有钻石,金币和钻石还可以相互转换. 虚拟币统计傻傻分不清应该怎么接了?

    SplusSDK是支持多种虚拟币统计接入的,所以游戏中的金币和钻石这些都可以算出一种虚拟币. 每种虚拟币可以通过coinType参数进行区分

    示例
    											//示例:如果一个当前具有70000金币,10钻石的玩家,在商店中将10000金币兑换成10钻石,那么对应的接入代码如下
    											Coin::use("1W金兑10钻","金币",10000, "天下第一关"); 
    											Coin::get("1W金兑10钻","钻石",10 ,"天下第一关");
    										
    											//示例:如果一个当前具有70000金币,10钻石的玩家,在商店中将10000金币兑换成10钻石,那么对应的接入代码如下
    											[DCCoin use:@"1W金兑10钻" coinType:@"金币" lostCoin:10000 levelId:@"天下第一关"]; 
    											[DCCoin get:@"1W金兑10钻" coinType:@"钻石" gainCoin:10 levelId:@"天下第一关"];
    										
    											//示例:如果一个当前具有70000金币,10钻石的玩家,在商店中将10000金币兑换成10钻石,那么对应的接入代码如下
    											DCCoin.use("1W金兑10钻","金币",10000, "天下第一关"); 
    											DCCoin.get("1W金兑10钻","钻石",10,"天下第一关");
    										

    场景2:游戏里面可以通过支付渠道直接使用真实货币(比如人民币)购买道具.这个应该怎么处理?

    将真实货币看成一种虚拟币来处理,比如100圆人民币兑换黄金礼包.那么,在真实货币付费接口调用成功后,再调用DCCoin.get接口来记录虚拟币获取,在虚拟币使用的时候调用DCCoin.use来记录消耗

    示例
    												Coin::get("玩家付费","CNY",100 ,"天下第一关"); //CNY是人民币的国际通用标识
    												Coin::use("兑换黄金大礼包","CNY",100,"天下第一关"); 
    											
    												[DCCoin get:@"玩家付费" coinType:@"CNY" gainCoin:100 levelId:@"天下第一关"]; //CNY是人民币的国际通用标识
    												[DCCoin use:@"兑换黄金大礼包" coinType:@"CNY" lostCoin:100 levelId:@"天下第一关"]; 
    											
    												DCCoin.get("玩家付费","CNY",100 ,"天下第一关"); //CNY是人民币的国际通用标识
    												DCCoin.use("兑换黄金大礼包","CNY",100,"天下第一关"); 
    											

    5.6示例

    示例1
    											//人人打飞机游戏中有个世界对战的场景,进入世界对战的不同频道会有不同的门槛.
    											//比如进入5000金币场,需要支付2888金币,如果获胜可以获得5000金币,外加20积分
    											//如果一个当前具有70000金币,300积分的玩家进入世界对战5000金币场游戏.这种场景中需要在代码中嵌入如下代码
    
    											//进入频道
    											Coin::use("进入世界对战5000金币场","金币",2888,"天下第一关"); 
    
    											//如果对战获胜
    											Coin::get("进入世界对战5000金币场","金币",5000,"天下第一关"); 
    											Coin::get("进入世界对战5000金币场","积分",300, "天下第一关");
    										
    											//人人打飞机游戏中有个世界对战的场景,进入世界对战的不同频道会有不同的门槛.
    											//比如进入5000金币场,需要支付2888金币,如果获胜可以获得5000金币,外加20积分
    											//如果一个当前具有70000金币,300积分的玩家进入世界对战5000金币场游戏.这种场景中需要在代码中嵌入如下代码
    
    											//进入频道
    											[DCCoin use:@"进入世界对战5000金币场" coinType:@"金币" lostCoin:2888 levelId:@"天下第一关"]; 
    
    											//如果对战获胜
    											[DCCoin get:@"进入世界对战5000金币场" coinType:@"金币" gainCoin:5000 level levelId:@"天下第一关"]; 
    											[DCCoin get:@"进入世界对战5000金币场" coinType:@"积分" gainCoin:300 levelId:@"天下第一关"];
    										
    											//人人打飞机游戏中有个世界对战的场景,进入世界对战的不同频道会有不同的门槛.
    											//比如进入5000金币场,需要支付2888金币,如果获胜可以获得5000金币,外加20积分
    											//如果一个当前具有70000金币,300积分的玩家进入世界对战5000金币场游戏.这种场景中需要在代码中嵌入如下代码
    
    											//进入频道
    											DCCoin.use("进入世界对战5000金币场" "金币",2888, "天下第一关"); 
    
    											//如果对战获胜
    											DCCoin.get("进入世界对战5000金币场","金币",5000, "天下第一关"); 
    											DCCoin.get("进入世界对战5000金币场","积分",300, "天下第一关");
    										

    6.道具统计

    道具统计是用来统计玩家在游戏内虚拟道具消费数据的统计,比如魔法药水,生命药水之类的. 用于帮助运营来发现玩家对游戏道具的使用习惯和偏好,以便更好的支持后续的道具设计.

    SplusSDK通过DCItem类完成相关统计,主要方法如下

    6.1接口定义:DCItem.get

    接口定义
    DCItem.get(String itemId, String itemType, int itemCnt, long coinNum, String coinType, String reason, String levelId);
    +(void)get:(NSString*)itemId type:(NSString*)itemType itemCount:(int)itemCnt coinNum:(long long)coinNum coinType:(NSString*)coinType reason:(NSString*)reason levelId:(NSString*)levelId
    Item::get(const char* itemId, const char* itemType, int itemCnt, long long coinNum, const char* coinType, const char* reason, String levelId)
    DCItem.get(string itemId, string itemType, int itemCnt, long coinNum, string coinType, string reason, string levelId)
    接口说明
    获得道具,需要在DCAccount.login接口之后调用.
    参数说明
    参数 是否为空 类型 参数说明
    itemId 不能为空,也不可以设置空字符串 字符串 道具编号
    itemType 不可为空,不可为空串 字符串 道具类型
    itemCnt 整型数字 购买的道具数量
    coinNum 整型数字 购买道具消耗的虚拟币数量
    coinType 字符串 购买道具消耗的虚拟币类型
    reason 不可为空,不可为空串 字符串 获得道具的原因
    levelId 字符串 当前所在的关卡

    6.2接口定义:DCItem.use

    接口定义
    DCItem.use(String itemId, String itemType, int itemCnt,String reason, String levelId);
    +(void)use:(NSString*)itemId type:(NSString*)itemType itemCount:(int)itemCnt reason:(NSString*)reason levelId:(NSStirng*)levelId;
    Item::use(const char* itemId, const char* itemType, int itemCnt,const char* reason, const char* levelId);
    DCItem.use(string itemId, string itemType, int itemCnt,string reason, string levelId);
    接口说明
    消耗道具,需要在DCAccount.login接口之后调用.
    参数说明
    参数 是否为空 类型 参数说明
    itemId 不能为空,也不可以设置空字符串 字符串 道具编号
    itemType 不可为空,不可为空串 字符串 道具类型
    itemCnt 整型数字 道具数量
    reason 不可为空,不可为空串 字符串 消耗道具的原因
    levelId 字符串 当前所在关卡

    6.3使用须知

    DCItem.get对应于获取,DCItem.use对应于消耗,用来记录玩家的道具的使用情况.其中需要注意的一个字段是其中的reason字段.针对reason字段,Splus平台会进行归并计算

    6.4示例

    示例
    											//在一场战斗中,玩家通过商店花费了3000虚拟金币购买了20瓶血,战斗过程中消耗了15瓶,战斗胜利后系统赠送了一个魔法权杖
    											//通过商品购买血瓶
    											DCItem.get("血瓶","消耗品",20 ,3000,"金币", "使用金币购买", null);
    
    											//战斗过程中,自己补血或者转移给队友
    											DCItem.use ("血瓶","消耗品",5,"补血", null);
    											DCItem.use ("血瓶","消耗品",10,"转移给队友", null);
    
    											//战斗结束,获得魔法权杖
    											DCItem.get("魔法权杖","武器",1, 0, null, "战斗奖励", null);
    										
    											//在一场战斗中,玩家通过商店花费了3000虚拟金币购买了20瓶血,战斗过程中消耗了15瓶,战斗胜利后系统赠送了一个魔法权杖
    											//通过商品购买血瓶
    											[DCItem get:@"血瓶" type:@"消耗品" itemCount:20 coinNum:3000 coinType:@"金币", reason:@"使用金币购买" levelId:nil];
    
    											//战斗过程中,自己补血或者转移给队友
    											[DCItem use:@"血瓶" type:@"消耗品" itemCount:5 reason:@"补血" levelId:nil];
    											[DCItem use:@"血瓶" type:@"消耗品" itemCount:10 reason:@"转移给队友" levelId:nil];
    
    
    											//战斗结束,获得魔法权杖
    											[DCItem get:@"魔法权杖" type:@"武器" itemCount:1 coinNum:0 coinType:nil reason:@"战斗奖励" levelId:nil];
    										
    											//在一场战斗中,玩家通过商店花费了3000虚拟金币购买了20瓶血,战斗过程中消耗了15瓶,战斗胜利后系统赠送了一个魔法权杖
    											//通过商品购买血瓶
    											Item::get("血瓶","消耗品",20 ,3000,"金币", "战斗奖励", NULL);
    
    											//战斗过程中,自己补血或者转移给队友
    											Item::use ("血瓶","消耗品",5,"补血", NULL);
    											Item::use ("血瓶","消耗品",10,"转移给队友", NULL);
    
    											//战斗结束,获得魔法权杖
    											Item::get("魔法权杖","武器",1, 0, NULL,"战斗奖励", NULL);
    										
    											//在一场战斗中,玩家通过商店花费了3000虚拟金币购买了20瓶血,战斗过程中消耗了15瓶,战斗胜利后系统赠送了一个魔法权杖
    											//通过商品购买血瓶
    											DCItem.get("血瓶","消耗品",20 ,3000,"金币", "战斗奖励", null);
    
    											//战斗过程中,自己补血或者转移给队友
    											DCItem.use ("血瓶","消耗品",5,"补血", null);
    											DCItem.use ("血瓶","消耗品",10,"转移给队友", null);
    
    											//战斗结束,获得魔法权杖
    											DCItem.get("魔法权杖","武器",1, 0, null,"战斗奖励", null);
    										

    7.任务统计

    SDK提供了DCTask类来负责相关任务的统计,具体的方法有

    7.1接口定义:DCTask.complete

    接口定义
    DCTask.complete(String taskId, int taskMode, String taskType, long time, bool result, bool isFirst, String failReason)
    +(void)complete:(NSString*)taskId taskMode:(int)taskMode taskType:(NSString*)taskType spendTime:(long long)time result:(Bool)result firstComplete:(BOOL)isFirst failReason:(NSString*)reason
    Task::complete(const char* taskId, int taskMode, const char* taskType, long long spendTime, bool result, bool isFirst, const char* reason)
    DCTask.complete(string taskId, int taskMode, string taskType, long long spendTime, bool result, bool isFirst, string reason)
    接口说明
    任务完成.需要在DCAccount.login接口之后调用.
    参数说明
    参数 是否为空 类型 参数说明
    taskId 不能为空,也不可以设置空字符串 字符串 游戏任务编号
    taskMode 整型数字 任务模式,有可重复任务与非重复任务两种模式
    taskType 字符串 游戏类型
    time 整型数字 完成任务花费时间
    result BOOL型 游戏完成结果
    isFirst BOOL型 是否是第一次完成
    reason 不能为空,也不可以设置空字符串 字符串 任务失败原因

    7.2使用须知

    关卡统计接口与任务统计接口两者设计的非常相似,但他们对应的后台指标不同,请使用时注意区分.

    7.3示例

    示例
    											//获取钥匙任务成功
    											DCTask.complete("get_key", 0, "主线任务", 1000, true, true, null); //任务成功
    											//…
    											//解救公主任务失败
    											DCTask.complete("help_priness", 0, "主线任务", 2000, true, true, "生命耗尽"); //任务失败
    										
    											//获取钥匙任务成功
    											[DCTask complete:@"get_key" taskMode:0 taskType:@"主线任务" spendTime:1000 result:true firstComplete:YES failReason:nil]; //任务成功
    											//…
    											//解救公主任务失败
    											[DCTask complete:@"help_priness" taskMode:0 taskType:@"主线任务" spendTime:2000 result:YES firstComplete:YES failReason:@"生命耗尽"]; //任务失败
    										
    											//获取钥匙任务成功
    											Task::complete("get_key", 0, "主线任务", 1000, true, true, NULL);
    											//…
    											//解救公主任务结束
    											Task::complete("help_priness", 0, "主线任务", 2000, true, true, "生命耗尽"); //任务失败
    										
    											//获取钥匙任务成功
    											DCTask.complete("get_key", 0, "主线任务", 1000, true, true, NULL);
    											//…
    											//解救公主任务失败
    											DCTask.complete("help_priness", 0, "主线任务", 2000, true, true, "生命耗尽"); //任务失败
    										

    8.新手引导任务

    玩家首次进入游戏时的新手引导中的相关统计可以使用该系列接口,接口定义如下:

    8.1接口定义:DCNewbieTask.setStep

    接口定义
    DCNewbieTask.setStep(String stepId)
    +(void)setStep:(NSString*)stepId
    NewbieTask::setStep(const char* stepId)
    DCNewbieTask.setStep(string stepId)
    接口说明
    新手引导任务步骤.需要在DCAccount.login接口之后调用.
    参数说明
    参数 是否为空 类型 参数说明
    stepId 不能为空,也不可以设置空字符串 字符串 新手引导任务步骤ID

    8.2接口定义:DCNewbieTask.complete

    接口定义
    DCNewbieTask.complete()
    +(void)complete
    NewbieTask::complete()
    DCNewbieTask.complete()
    接口说明
    新手引导任务完成所有步骤.需要在DCAccount.login接口之后调用.
    参数说明

    8.3示例

    示例
    										//完成步骤1
    										DCNewbieTask.setStep("步骤1");
    										//完成步骤2
    										DCNewbieTask.setStep("步骤2");
    										//完成步骤3
    										DCNewbieTask.setStep("步骤3");
    										//…
    										//完成整个引导任务
    										DCNewbieTask.complete(); 
    									
    										//获取钥匙任务成功
    										[DCNewbieTask setStep:@"步骤1"]; 
    										//完成步骤2
    										[DCNewbieTask setStep:@"步骤2"]; 
    										//完成步骤3
    										[DCNewbieTask setStep:@"步骤3"]; 
    										//…
    										//完成整个引导任务
    										[DCNewbieTask complete];
    									
    										//完成步骤1
    										NewbieTask::setStep("步骤1");
    										//完成步骤2
    										NewbieTask::setStep("步骤2");
    										//完成步骤3
    										NewbieTask::setStep("步骤3");
    										//…
    										//完成整个引导任务
    										NewbieTask::complete(); 
    									
    										//完成步骤1
    										DCNewbieTask.setStep("步骤1");
    										//完成步骤2
    										DCNewbieTask.setStep("步骤2");
    										//完成步骤3
    										DCNewbieTask.setStep("步骤3");
    										//…
    										//完成整个引导任务
    										DCNewbieTask.complete(); 
    									

    9.账号角色信息

    有关玩家账号的账号类型、账号ID、性别、年龄等属性信息、角色的创建、使用、升级、删除等行为,Splus都提供了对应的接口,且这些接口需要开发者在SDK接入的最初阶段就配置好

    发布前必读

    代码混淆

    一般来说SplusSDK混淆无需特殊设置,如果游戏发布前混淆出错,并确认是SplusSDK引起的,请在混淆脚本中添加如下代码.

    						-libraryjars libs/Splus*.jar
    						-keep public class cn.splus.sdk.api.ga.** {*;} 
    						-keep public interface cn.splus.sdk.api.ga.** {*;}
    						-keepattributes SourceFile,LineNumberTable
    					

    Splus SDK的iOS版本中使用Apple提供的IDFA技术用作标识唯一的用户设备.而Apple在应用审核过程中对IDFA的使用一些审核项目.如果提交信息不当会导致应用审核不通过.请提交审核时,严格按下面的提示操作.

    根据苹果审核政策,使用该技术的游戏在提交审核时需要根据游戏自身带不带广告的情况选择不同的IDFA选项.如下图:

    Splus请开发者或运营人员在提交应用时注意:如果游戏不带广告,请勾选下图红框中的两者或者两者之一.如果游戏本身带广告,请勾选红框上方的第一项.如果你希望使用非IDFA版本的SDK,请联系我们获取.

    因XCODE7默认使用了HTTPS上报协议,而Splus的这个版本暂时没有采用该上报协议,因此需要开发者在Info.plist文件中配置以下参数:

    咨询 顶部