打点统计

新增的一个时间戳属性,用来打点

  1. 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的几个属性

  1. 概述:这几个属性是java端才知道的。通过buyItemOk这个函数传回给c++端。通过字符串ON_ADJUST_USER_INFO_GET:来标志。

  2. PubConfigParm.h里增加一个宏定义,在CandyYifanTrack.cpp里会用到,所以现在就去CandyYifanTrack.cpp里写上#include "PubConfigParm.h"

    #define PUB_KEY_JAVA_INFO_DEV_STRING "+:::::+"

    DreamPub.java里给DreamPub类增加一个属性

    public static String pub_dev_key = "+:::::+";
  3. 给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);
  4. 在构造函数CandyYifanTrack::CandyYifanTrack()里增加初始化这几个变量的代码:

    // adjust信息
    is_user_tracktoken = "";
    is_user_network = "";
    is_user_campaign = "";
    is_user_adgroup = "";
    is_user_creative = "";
  5. 在存盘的函数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);
  6. 在读盘的函数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");
  7. 刚增加的方法,的实现部分:

    // 因为名字中的内容比较长,比较乱,所以要注意分隔符。
    // 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();
        }
    }
  8. 修改CandyYifanTrack::of_get_pub_string方法,在string ls_msg = PF::create_track_line("u_event", as_event );后面增加如下代码:

    // 这里要先计算一下。
    g.cm->of_cal_life(); 
    
    // SDK的通用需求:发布的市场字段
    #if(CC_TARGET_PLATFOREM == CC_PLATFORM_ANDROID)
        ls_msg += PF::create_track_line("__store", "Google Play");
    #endif
    #if(CC_TARGET_PLATFOREM == CC_PLATFORM_IOS)
        ls_msg += PF::create_track_line("__store", "App Store");
    #endif
    
    // 公用部分事件属性,注意里面有 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端的回调

  1. CandyMagic::of_buy_succ函数里增加处理java端回调的代码:

    #pragma region java or ios callback event
    string ls_temp = good_id;
    //// 因为名字中的内容比较长,比较乱,所以要注意分隔符。
    // 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;
    }
    #pragma endregion

Java端的修改

  1. 先按文档做好。

  2. AppActivity.java文件里的广告监听器里增加打点:

    SDKAgent.setAdListener(new AdListener() {
        @Override
        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);
        }
    
        @Override
        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);
        }
    });
  3. 在类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 = "";
  4. 在类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() {
                 @Override
                 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();
         }
    
     }

    粘贴完刚才的代码后,可能需要引入相应的包。

  5. 这几个属性在这里赋值:

    public class PubAdjustNew {
        public void onResume(){
            of_read_adjust_info();
        }
    }

内购的打点

  1. 内购成功的函数:
VerifyPurchaseUtil.OnVerifyPurchaseListener onVerifyPurchaseListener = new VerifyPurchaseUtil.OnVerifyPurchaseListener(){
    public void onVerifyFinish(GooglePurchase googlePurchase) {
        DreamPub._adjustnew.of_track_moneypay( googlePurchase.getOrderId()  , googlePurchase.getProductId()  );//这里调用打点的代码
    }
}
  1. 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();
        }
    }
}
  1. 在C++那边处理一下Java的回调:

    void CandyMagic::of_buy_succ(string good_id){
        #pragma region java or ios callback event
        // 内购完成的追踪
        // 返回给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;
        }
        #pragma endregion
    }
  2. CandyYifanTrack类增加一个方法:

    class CandyYifanTrack {
        #pragma region 跟踪类的方法
            void of_track_purchase_verified(const string& as_string);
        #pragma endregion
    }

    定义部分:

    // 内购完成的追踪
    // 返回给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发来的广告部分回调

  1. 处理ON_AD_CLICK:ON_AD_SHOW:

    void CandyMagic::of_buy_succ(string good_id){
        #pragma region java or ios callback event
            // 广告事件打点的处理
            // 此处通过回调进行数据的打点
            //  广告类型 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;
            }
        #pragma endregion
    }
  2. 补上缺少的函数:

    // 广告的追踪,通过回调过来的内容进行处理
    // 此处通过回调进行数据的打点
    //  广告类型 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);
    
    }