打点统计
新增的一个时间戳属性,用来打点
给
CandyManager
类增加一个属性,在long time_total, time_left, time_used;
之后:string level_timestamp; // 用于记录下of_start的时间,用来在数据中唯一标识一局游戏。
在
CandyManager::CandyManager(void)
里加一句初始化这个属性的代码:level_timestamp = ""; // 形成新的时间标识。
在
CandyManager::of_start
函数里增加一句给这个属性赋值的代码:level_timestamp = PF::tostring(PFJava::of_get_time_seconds()); // 形成新的时间标识。
使用这个属性是在
CandyYifanTrack::of_get_pub_string()
函数里。
Adjust的几个属性
概述:这几个属性是java端才知道的。通过
buyItemOk
这个函数传回给c++端。通过字符串ON_ADJUST_USER_INFO_GET:
来标志。在
PubConfigParm.h
里增加一个宏定义,在CandyYifanTrack.cpp
里会用到,所以现在就去CandyYifanTrack.cpp
里写上#include "PubConfigParm.h"
。在
DreamPub.java
里给DreamPub类增加一个属性public static String pub_dev_key = "+:::::+";
给CandyYifanTrack类增加几个属性和一个方法,放在
#pragma region 数据存储
这个区域内。string is_user_tracktoken; string is_user_network; string is_user_campaign; string is_user_adgroup; string is_user_creative; // 因为名字中的内容比较长,比较乱,所以要注意分隔符。 // token+:::::+networe+:::::+campaign+:::::+adgroup+:::::+creative void of_set_adjust_user_info(const string& as_info);
在构造函数
CandyYifanTrack::CandyYifanTrack()
里增加初始化这几个变量的代码:// adjust信息 is_user_tracktoken = ""; is_user_network = ""; is_user_campaign = ""; is_user_adgroup = ""; is_user_creative = "";
在存盘的函数
CandyYifanTrack::of_save_track_info()
里,存一下这几个变量:ls_text += PF::create_key("is_user_tracktoken", is_user_tracktoken); ls_text += PF::create_key("is_user_network", is_user_network); ls_text += PF::create_key("is_user_campaign", is_user_campaign); ls_text += PF::create_key("is_user_adgroup", is_user_adgroup); ls_text += PF::create_key("is_user_creative", is_user_creative);
在读盘的函数
CandyYifanTrack::of_load_track_info()
里,读一下这几个变量:// adjust信息 is_user_tracktoken = PF::key_format(ls_text, "is_user_tracktoken"); is_user_network = PF::key_format(ls_text, "is_user_network"); is_user_campaign = PF::key_format(ls_text, "is_user_campaign"); is_user_adgroup = PF::key_format(ls_text, "is_user_adgroup"); is_user_creative = PF::key_format(ls_text, "is_user_creative");
刚增加的方法,的实现部分:
// 因为名字中的内容比较长,比较乱,所以要注意分隔符。 // token+:::::+networe+:::::+campaign+:::::+adgroup+:::::+creative void CandyYifanTrack::of_set_adjust_user_info(const string& as_info) { auto ss = PF::spilt(as_info, PUB_KEY_JAVA_INFO_DEV_STRING); if (ss.size() >= 5) { is_user_tracktoken = ss[0]; is_user_network = ss[1]; is_user_campaign = ss[2]; is_user_adgroup = ss[3]; is_user_creative = ss[4]; of_save_track_info(); } }
修改
CandyYifanTrack::of_get_pub_string
方法,在string ls_msg = PF::create_track_line("u_event", as_event );
后面增加如下代码:// 这里要先计算一下。 g.cm->of_cal_life(); // SDK的通用需求:发布的市场字段 ls_msg += PF::create_track_line("__store", "Google Play"); ls_msg += PF::create_track_line("__store", "App Store"); // 公用部分事件属性,注意里面有 max_level ls_msg += PF::create_track_line("u_model", g.game_model); ls_msg += PF::create_track_line("u_level", g.game_level); ls_msg += PF::create_track_line("u_page", is_current_page); ls_msg += PF::create_track_line("max_level", il_max_level);// 最大关卡号 ls_msg += PF::create_track_line("life_count", g.cm->pub_life); // adjust的属性段 ls_msg += PF::create_track_line("user_tracktoken", is_user_tracktoken); ls_msg += PF::create_track_line("user_network", is_user_network); ls_msg += PF::create_track_line("user_campaign", is_user_campaign); ls_msg += PF::create_track_line("user_adgroup", is_user_adgroup); ls_msg += PF::create_track_line("user_creative", is_user_creative); // 金币段 ls_msg += PF::create_track_line("money1_count", g.cm->pub_money1); ls_msg += PF::create_track_line("money2_count", g.cm->pub_money2); ls_msg += PF::create_track_line("money3_count", 0); ls_msg += PF::create_track_line("money4_count", 0); ls_msg += PF::create_track_line("money5_count", 0); ls_msg += PF::create_track_line("money6_count", 0); // 道具的状态. ls_msg += PF::create_track_line("tool_hammer_left", g.cm->of_get_magic("hammer").count); ls_msg += PF::create_track_line("tool_bomb_left", g.cm->of_get_magic("bomb").count); ls_msg += PF::create_track_line("tool_same_left", g.cm->of_get_magic("same").count); ls_msg += PF::create_track_line("tool_beforelineline_left", g.cm->of_get_magic("beforelineline").count); ls_msg += PF::create_track_line("tool_beforebombbomb_left", g.cm->of_get_magic("beforebombbomb").count); ls_msg += PF::create_track_line("tool_beforesame_left", g.cm->of_get_magic("beforesame").count); // 活动的状态 //ls_msg += PF::create_track_line("activity_treasure", g.candy_treasure->of_is_doing()); //ls_msg += PF::create_track_line("activity_littlebuilding", g.candy_building_little->of_is_in_task()); //ls_msg += PF::create_track_line("activity_ranking", g.candy_competition->is_in_competing()); //ls_msg += PF::create_track_line("activity_bigspin", g.candy_big_spin->of_is_doing()); // 装修的状态 ::: 需要待定处理 //ls_msg += PF::create_track_line("area_id", StoryManager::getInstance()->of_get_area_id()); //ls_msg += PF::create_track_line("area_task_done", StoryManager::getInstance()->of_get_task_done()); //ls_msg += PF::create_track_line("area_task_all", StoryManager::getInstance()->of_get_task_all()); // 关卡进度相关的数据,这个只同关卡事件相关,放在公用位置更汇总一些。 ls_msg += PF::create_track_line("level_timestamp", g.level_timestamp); ls_msg += PF::create_track_line("level_move_used", g.moves_used); ls_msg += PF::create_track_line("level_move_left", g.moves_left); ls_msg += PF::create_track_line("level_move_total", g.moves_total); ls_msg += PF::create_track_line("level_second_used", il_time_count_second); ls_msg += PF::create_track_line("level_time_used", g.time_used); ls_msg += PF::create_track_line("level_time_total", g.time_total); ls_msg += PF::create_track_line("level_tools_used", is_magic_used); ls_msg += PF::create_track_line("level_goon_count", g.ii_count_goon_current_level - 1); // 注意这里是需要减一下的,这个变量代表了是弹出了多少次窗口。
处理Java端的回调
在
CandyMagic::of_buy_succ
函数里增加处理java端回调的代码://// 因为名字中的内容比较长,比较乱,所以要注意分隔符。 // token+:::::+networe+:::::+campaign+:::::+adgroup+:::::+creative string ls_key_adjust_info = "ON_ADJUST_USER_INFO_GET:"; if (ls_temp.find(ls_key_adjust_info) == 0) {//因为Java那里肯定是以这个开头的 auto sss1 = ls_temp.substr(ls_key_adjust_info.size()); g.candy_yifan_track->of_set_adjust_user_info(sss1); return; }
string ls_temp = good_id;
Java端的修改
先按文档做好。
在
AppActivity.java
文件里的广告监听器里增加打点:SDKAgent.setAdListener(new AdListener() { public void onAdClicked(AdBase var1) { super.onAdClicked(var1); // 此处通过回调进行数据的打点 // 广告类型 interstitial video // 广告方 facebook , admob , ,,, // 广告位ID:广告类型:广告方:广告位置 String ls_info = var1.adId +":" + var1.type + ":" + var1.name + ":" + var1.page; buyItemOk("ON_AD_CLICK:" + ls_info ); // 用户增加类属性 HashMap userAddMap = new HashMap(); userAddMap.put("ad_click_count" , 1 ); if (AdType.TYPE_INTERSTITIAL.equals(var1.type)){ userAddMap.put("ad_click_count_interstitial" , 1 ); } if (AdType.TYPE_VIDEO.equals(var1.type)){ userAddMap.put("ad_click_count_video" , 1 ); } YFDataAgent.trackUserAdd(userAddMap); } public void onAdShow(AdBase var1) { super.onAdShow(var1); // 此处通过回调进行数据的打点 // 广告类型 interstitial video // 广告方 facebook , admob , ,,, // 广告位ID:广告类型:广告方:广告位置 String ls_info = var1.adId +":" + var1.type + ":" + var1.name + ":" + var1.page; buyItemOk("ON_AD_SHOW:" + ls_info ); HashMap userAddMap = new HashMap(); userAddMap.put("ad_count_all" , 1 ); if (AdType.TYPE_INTERSTITIAL.equals(var1.type)){ userAddMap.put("ad_count_interstitial" , 1 ); } if (AdType.TYPE_VIDEO.equals(var1.type)){ userAddMap.put("ad_count_video" , 1 ); } YFDataAgent.trackUserAdd(userAddMap); } });
在类
PubAdjustNew
里新增几个属性,放在public long il_goon_coin_times_total = 0 ; // 一共进行了多少继续游戏的操作
之后就行。public String user_tracktoken = ""; public String user_network = ""; public String user_campaign = ""; public String user_adgroup = ""; public String user_creative = "";
在类
PubAdjustNew
文件里新增一个函数of_read_adjust_info
用来读取Adjust传过来的几个属性。/** * 读取玩家来源信息 * 2.3 版本起自然用户全部置为 PAY 用户 */ public void of_read_adjust_info(){ if(user_creative != null && user_creative.length() > 0 ){ return; } try{ new Thread(new Runnable() { public void run() { try{ AdjustAttribution info1 = Adjust.getAttribution(); user_tracktoken = info1.trackerToken; user_network = info1.network; user_campaign = info1.campaign; user_adgroup = info1.adgroup; user_creative = info1.creative; if( user_tracktoken == null ) user_tracktoken = ""; if( user_network == null ) user_network = ""; if( user_campaign == null ) user_campaign = ""; if( user_adgroup == null ) user_adgroup = ""; if( user_creative == null ) user_creative = ""; // 提交数据至用户属性 if( user_tracktoken.length() > 1 ){ //user_setonce用户属性打点 HashMap userSetOnceMap = new HashMap(); userSetOnceMap.put("user_tracktoken",user_tracktoken); userSetOnceMap.put("user_network",user_network); userSetOnceMap.put("user_campaign",user_campaign); userSetOnceMap.put("user_adgroup",user_adgroup); userSetOnceMap.put("user_creative",user_creative); YFDataAgent.trackUserSetOnce(userSetOnceMap); } // 传给c++ String ls_info = "ON_ADJUST_USER_INFO_GET:" ; ls_info += user_tracktoken + DreamPub.pub_dev_key; ls_info += user_network + DreamPub.pub_dev_key; ls_info += user_campaign + DreamPub.pub_dev_key; ls_info += user_adgroup + DreamPub.pub_dev_key; ls_info += user_creative ; ((AppActivity)_activity).buyItemOk(ls_info); } catch (Exception e2){ e2.printStackTrace(); } } }).start(); } catch (Exception e1){ e1.printStackTrace(); } }
粘贴完刚才的代码后,可能需要引入相应的包。
这几个属性在这里赋值:
public class PubAdjustNew { public void onResume(){ of_read_adjust_info(); } }
内购的打点
- 内购成功的函数:
VerifyPurchaseUtil.OnVerifyPurchaseListener onVerifyPurchaseListener = new VerifyPurchaseUtil.OnVerifyPurchaseListener(){
public void onVerifyFinish(GooglePurchase googlePurchase) {
DreamPub._adjustnew.of_track_moneypay( googlePurchase.getOrderId() , googlePurchase.getProductId() );//这里调用打点的代码
}
}
- 给
PubAdjustNew
新增一个函数:
public class PubAdjustNew {
// 只处理次数统计,不处理金额部分
public void of_track_moneypay( String as_orderid ,String as_goodid ){
if(as_goodid == null ) as_goodid = "";
if(as_orderid == null ) as_orderid = "";
// 购买成功次数的计算与打点 // 注意要修改此值
long ll_count = 0;
String save_key = "paymoney_count";
String save_name = "pub_adjust_count" ;
SharedPreferences sh =_activity .getSharedPreferences(save_name, 0);
ll_count = sh.getLong( save_key ,0);
ll_count ++;
SharedPreferences.Editor shedit = sh.edit();
shedit.putLong ( save_key , ll_count );
shedit.commit();
// 一共买了多少次的打点
String ls_adjust_times = "money_pay_" + ll_count;
if( ll_count >= 5 ){
ls_adjust_times = "money_pay_5more";
}
of_track_adjust(ls_adjust_times);
// 首次内购日期时。
//user_setonce用户属性打点
try {
// 根据goodid的后四位来作为价格
String ls_price = "0";
if(as_goodid.length() >= 4 ){
int li_pos_last1 = as_goodid.lastIndexOf(".");
if(li_pos_last1 > 0 && li_pos_last1 < as_goodid.length() ){ // 这里是肯定大于0的。
ls_price = as_goodid.substring(li_pos_last1 + 1 );
}
}
// 得到价格信息
float lf_price = 0;
try{
lf_price = Float.parseFloat(ls_price);
}
catch (NumberFormatException e){
}
lf_price = lf_price / 100; // 转为美元。
// 事件数据追踪打点
// 一次性
HashMap userSetOnceMap = new HashMap();
userSetOnceMap.put("purchase_first_date", DreamPub.of_get_today_number()+ "");
YFDataAgent.trackUserSetOnce(userSetOnceMap);
// 增加类属性
HashMap userAddMap = new HashMap();
userAddMap.put("purchase_times" , 1 );
userAddMap.put("purchase_sum" , lf_price );
YFDataAgent.trackUserAdd(userAddMap);
// 返回给c++端
// 内购点:订单号:价格
String ls_info = as_goodid + DreamPub.pub_dev_key + as_orderid + DreamPub.pub_dev_key + ls_price;
((AppActivity)_activity).buyItemOk("ON_PURCHASE_VERIFIED:" + ls_info );
}
catch (Exception e){
e.printStackTrace();
}
}
}
在C++那边处理一下Java的回调:
void CandyMagic::of_buy_succ(string good_id){ // 内购完成的追踪 // 返回给c++端 // 内购点:订单号:价格 //String ls_info = as_goodid + "+:::::+" + as_orderid + "+:::::+" + ls_price; //((AppActivity)_activity).buyItemOk("ON_PURCHASE_VERIFIED:" + ls_info); // string ls_key_purchase_verified = "ON_PURCHASE_VERIFIED:"; if (ls_temp.find(ls_key_purchase_verified) == 0) { auto sss2 = ls_temp.substr(ls_key_purchase_verified.size()); g.candy_yifan_track->of_track_purchase_verified(ls_temp); return; } }
给
CandyYifanTrack
类增加一个方法:class CandyYifanTrack { void of_track_purchase_verified(const string& as_string); }
定义部分:
// 内购完成的追踪 // 返回给c++端 // 内购点:订单号:价格 //String ls_info = as_goodid +PUB_KEY_JAVA_INFO_DEV_STRING + as_orderid + PUB_KEY_JAVA_INFO_DEV_STRING + ls_price; //((AppActivity)_activity).buyItemOk("ON_PURCHASE_VERIFIED:" + ls_info); void CandyYifanTrack::of_track_purchase_verified(const string& as_string) { auto ss = PF::spilt(as_string, PUB_KEY_JAVA_INFO_DEV_STRING); if (ss.size() >= 3) { auto ls_msg = of_get_pub_string("purchase_succ"); ls_msg += PF::create_track_line("purchase_good_id", ss[0]); ls_msg += PF::create_track_line("purchase_order_id", ss[1]); ls_msg += PF::create_track_line("purchase_price", ss[2]); PFJava::of_satcic_yifan_track(ls_msg); } }
处理一下java发来的广告部分回调
处理
ON_AD_CLICK:
和ON_AD_SHOW:
:void CandyMagic::of_buy_succ(string good_id){ // 广告事件打点的处理 // 此处通过回调进行数据的打点 // 广告类型 interstitial video // 广告方 facebook , admob , ,,, // 广告位ID:广告类型:广告方:广告位置 //String ls_info = var1.adId + ":" + var1.type + ":" + var1.name + ":" + var1.page; //buyItemOk("ON_AD_CLICK:" + ls_info); //buyItemOk("ON_AD_SHOW:" + ls_info ); if (ls_temp.find("ON_AD_CLICK:") == 0 || ls_temp.find("ON_AD_SHOW:") == 0) { g.candy_yifan_track->of_track_ad(ls_temp); return; } }
补上缺少的函数:
// 广告的追踪,通过回调过来的内容进行处理 // 此处通过回调进行数据的打点 // 广告类型 interstitial video // 广告方 facebook , admob , ,,, // 广告位ID:广告类型:广告方:广告位置,对于视频的这个位置并不准确 // String ls_info = var1.adId + ":" + var1.type + ":" + var1.name + ":" + var1.page; // buyItemOk("ON_AD_CLICK:" + ls_info); // buyItemOk("ON_AD_SHOW:" + ls_info); void CandyYifanTrack::of_track_ad(const string& as_string) { auto ss = PF::spilt(as_string, ":"); if (ss.size() < 5) return; // 无法解析,数量不足 //ad_show 广告展示(回调中触发) //ad_click 广告点击(回调中触发) //ad_video_show 调用端触发。只处理page信息 string ls_event = "none"; if (ss[0] == "ON_AD_CLICK") ls_event = "ad_click"; if (ss[0] == "ON_AD_SHOW") ls_event = "ad_show"; auto ls_msg = of_get_pub_string(ls_event); ls_msg += PF::create_track_line("ad_pid", ss[0]); ls_msg += PF::create_track_line("ad_adtype", ss[1]); ls_msg += PF::create_track_line("ad_adnet", ss[2]); ls_msg += PF::create_track_line("ad_page", ss[3]); PFJava::of_satcic_yifan_track(ls_msg); }