cocos-creator使用记录30_微信小游戏接入腾讯移动分析sdk


1.前言
腾讯移动分析
http://mta.qq.com/mta/
文档
http://docs.developer.qq.com/mta/
2018.6.14文档只有Android、iOS、H5、微信小程序的配置。
接入微信小游戏需要修改SDK。

(1)需要按文档配置appID,eventID
这里的appID是注册时的公司账号,所有小游戏公用一个,不是小游戏的appID。
eventID是在腾讯移动分析创建小游戏的数据分析管理页面时,由运营添加的一个id,用于区分不同的小游戏。
注意:这一步通常运营已经做完了,开发人员只需要向对应的策划获得账号,登录,在对应你的项目的应用管理
   页面会看到appID、eventID。

(2)下载下来的SDK如下:
mta_analysis.js

(3)需要将以下添加到微信公众平台小游戏的设置分页的服务器域名:
https://pingtas.qq.com

(4)适应的场景:小程序点击跳转按钮,带一个参数,跳转到小游戏。此参数形如
source=xxx
通过xxx参数就可以确定是从哪个小程序跳转过来的。统计数据保存在腾讯移动分析上。

2.代码
2.1.小程序跳转调用接口
wx.navigateToMiniProgram({
    appId: game.appid,
    path: "",
    extraData: {source="xxxx"},
    complete:res=>{
    }
});
其中source后的字符串就代表是从谁那里跳转的。比如
source=guess_song
就代表是从猜歌跳转的。

2.2.修改mta_analysis.js
var MTA_CONFIG = {
  app_id: "",
  event_id: "",
  api_base: "https://pingtas.qq.com/pingd",
  prefix: "_mta_",
  version: "1.3.5",
  stat_share_app: !1,
  stat_pull_down_fresh: !1,
  stat_reach_bottom: !1
};

function getNetworkType(a) {
  wx.getNetworkType({
    success: function (b) {
      a(b.networkType)
    }
  })
}

function getSystemInfo() {
  var a = wx.getSystemInfoSync();
  return {
    adt: encodeURIComponent(a.model),
    scl: a.pixelRatio,
    scr: a.windowWidth + "x" + a.windowHeight,
    lg: a.language,
    fl: a.version,
    jv: encodeURIComponent(a.system),
    tz: encodeURIComponent(a.platform)
  }
}

function getUID() {
  try {
    return wx.getStorageSync(MTA_CONFIG.prefix + "auid")
  } catch (a) { }
}

function setUID() {
  try {
    var a = getRandom();
    wx.setStorageSync(MTA_CONFIG.prefix + "auid", a);
    return a
  } catch (b) { }
}

function getSID() {
  try {
    return wx.getStorageSync(MTA_CONFIG.prefix + "ssid")
  } catch (a) { }
}

function setSID() {
  try {
    var a = "s" + getRandom();
    wx.setStorageSync(MTA_CONFIG.prefix + "ssid", a);
    return a
  } catch (b) { }
}

function getRandom(a) {
  for (var b = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], c = 10; 1 < c; c--) {
    var d = Math.floor(10 * Math.random()),
      e = b[d];
    b[d] = b[c - 1];
    b[c - 1] = e
  }
  for (c = d = 0; 5 > c; c++) d = 10 * d + b[c];
  return (a || "") + (d + "" + +new Date)
}

function getPagePath() {
  try {
    var
      b = "/";
    return b
  } catch (c) {
    console.log("get current page path error:" + c)
  }
}

function getMainInfo() {
  var a = {
    dm: "wechat.apps.xx",
    url: getPagePath(),
    pvi: "",
    si: "",
    ty: 0
  };
  a.pvi = function () {
    var b = getUID();
    b || (b = setUID(), a.ty = 1);
    return b
  }();
  a.si = function () {
    var a = getSID();
    a || (a = setSID());
    return a
  }();
  return a
}

function getBasicInfo() {
  var a = getSystemInfo();
  getNetworkType(function (a) {
    try {
      wx.setStorageSync(MTA_CONFIG.prefix + "ntdata", a)
    } catch (c) { }
  });
  a.ct = wx.getStorageSync(MTA_CONFIG.prefix + "ntdata") || "4g";
  return a
}

function getExtentInfo() {
  var a = MTA.Data.userInfo;
  var b = [],
    c;
  for (c in a) a.hasOwnProperty(c) && b.push(c + "=" + a[c]);
  a = b.join(";");
  return {
    r2: MTA_CONFIG.app_id,
    r4: "wx",
    ext: "v=" + MTA_CONFIG.version + (null !== a && "" !== a ? ";ui=" + encodeURIComponent(a) : "")
  }
}
var MTA = {
  App: {
    init: function (a) {
      "appID" in a && (MTA_CONFIG.app_id = a.appID);
      "eventID" in a && (MTA_CONFIG.event_id = a.eventID);
      "statShareApp" in a && (MTA_CONFIG.stat_share_app = a.statShareApp);
      "statPullDownFresh" in a && (MTA_CONFIG.stat_pull_down_fresh = a.statPullDownFresh);
      "statReachBottom" in a && (MTA_CONFIG.stat_reach_bottom = a.statReachBottom);
      setSID();
      "lauchOpts" in a && (MTA.Data.lanchInfo = a.lauchOpts, MTA.Data.lanchInfo.landing = 1)
    }
  },
  Page: {
    init: function () {
      var a = { onShow: true, __route__: "pages/index/index" };
      a.onShow &&
        ! function () {
          var b = a.onShow;
          a.onShow = function () {
            MTA.Page.stat();
            b.call(this, arguments)
          }
        }();
      MTA.Page.stat();
      MTA_CONFIG.stat_pull_down_fresh && a.onPullDownRefresh && ! function () {
        var b = a.onPullDownRefresh;
        a.onPullDownRefresh = function () {
          MTA.Event.stat(MTA_CONFIG.prefix + "pulldownfresh", {
            url: a.__route__
          });
          b.call(this, arguments)
        }
      }();
      MTA_CONFIG.stat_reach_bottom && a.onReachBottom && ! function () {
        var b = a.onReachBottom;
        a.onReachBottom = function () {
          MTA.Event.stat(MTA_CONFIG.prefix + "reachbottom", {
            url: a.__route__
          });
          b.call(this, arguments)
        }
      }();
      MTA_CONFIG.stat_share_app && a.onShareAppMessage && ! function () {
        var b = a.onShareAppMessage;
        a.onShareAppMessage = function () {
          MTA.Event.stat(MTA_CONFIG.prefix + "shareapp", {
            url: a.__route__
          });
          return b.call(this, arguments)
        }
      }()
    },
    stat: function () {
      if ("" != MTA_CONFIG.app_id) {
        var a = [],
          b = getExtentInfo(),
          c = [getMainInfo(), b, getBasicInfo()];
        MTA.Data.lanchInfo && (c.push({
          ht: MTA.Data.lanchInfo.scene,
          rdm: "/",
          rurl: MTA.Data.lanchInfo.path
        }), MTA.Data.lanchInfo.query && MTA.Data.lanchInfo.query._mta_ref_id && c.push({
          rarg: MTA.Data.lanchInfo.query._mta_ref_id
        }),
          1 == MTA.Data.lanchInfo.landing && (b.ext += ";lp=1", MTA.Data.lanchInfo.landing = 0));
        c.push({
          rand: +new Date
        });
        b = 0;
        for (var d = c.length; b < d; b++)
          for (var e in c[b]) c[b].hasOwnProperty(e) && a.push(e + "=" + ("undefined" == typeof c[b][e] ? "" : c[b][e]));
        wx.request({
          url: MTA_CONFIG.api_base + "?" + a.join("&").toLowerCase()
        })
      }
    }
  },
  Event: {
    stat: function (a, b) {
      if ("" != MTA_CONFIG.event_id) {
        var c = [],
          d = getMainInfo(),
          e = getExtentInfo();
        d.dm = "wxapps.click";
        d.url = a;
        e.r2 = MTA_CONFIG.event_id;
        var f = "undefined" === typeof b ? {} : b;
        var k = [],
          g;
        for (g in f) f.hasOwnProperty(g) &&
          k.push(encodeURIComponent(g) + "=" + encodeURIComponent(f[g]));
        f = k.join(";");
        e.r5 = f;
        f = 0;
        d = [d, e, getBasicInfo(), {
          rand: +new Date
        }];
        for (e = d.length; f < e; f++)
          for (var h in d[f]) d[f].hasOwnProperty(h) && c.push(h + "=" + ("undefined" == typeof d[f][h] ? "" : d[f][h]));
        wx.request({
          url: MTA_CONFIG.api_base + "?" + c.join("&").toLowerCase()
        })
      }
    }
  },
  Data: {
    userInfo: null,
    lanchInfo: null
  }
};
module.exports = MTA;
注意:为了方便调用,我们将放在项目脚本目录下,对应的还要添加前缀,如下
assets
--zqddn_zhb
  --script
    --zqddn_zhb_mta_analysis.js

2.3.在你的项目的脚本中添加统计数据逻辑
zqddn_zhb_Common.js--------------------
module.exports = {
checkFunnelMode: function(type){ //检查漏斗模型
    if(this.mta == null) return;
    if(type == 0){ //进入首页
        this.mta.Event.stat(this.channel,{'home':'true'});
    }else if(type == 1){ //进入选择关卡界面
        this.mta.Event.stat(this.channel,{'selectlevel':'true'});
    }else if(type == 2){ //进入第1关
        this.mta.Event.stat(this.channel,{'level1':'true'});
    }else if(type == 3){ //进入第3关
        this.mta.Event.stat(this.channel,{'level3':'true'});
    }else if(type == 4){ //进入第10关
        this.mta.Event.stat(this.channel,{'level10':'true'});
    }
},
});

zqddn_zhb_Start.js--------------------
var common = require('zqddn_zhb_Common');
cc.Class({
onLoad: function(){
    //腾讯移动分析
    this.WXAnalysis();
    if(cc.sys.platform === cc.sys.WECHAT_GAME){ //微信平台
        this.scheduleOnce(function(){
            //统计数据
            common.mta.Event.stat('weidu',{'totaluser':'true'}); //进入游戏总人数
            common.checkFunnelMode(0); //漏斗模型
        }, 1); //延迟1秒
    }
},
WXAnalysis: function(){ //腾讯移动分析
    if(!(cc.sys.platform === cc.sys.WECHAT_GAME)) return; //微信平台
    var options = wx.getLaunchOptionsSync();
    common.mta = require('zqddn_zhb_mta_analysis'); 
    common.mta.App.init({
        "appID": "500212226", //这里的数字只用于演示,实际使用的appID请询问运营或策划
        "eventID": "500622235",// 高级功能-自定义事件统计ID,配置开通后在初始化处填写
        "lauchOpts": options, //渠道分析,需在onLaunch方法传入options,如onLaunch:function(options){...}
        "statPullDownFresh": true, // 使用分析-下拉刷新次数/人数,必须先开通自定义事件,并配置了合法的eventID
        "statShareApp": true, // 使用分析-分享次数/人数,必须先开通自定义事件,并配置了合法的eventID
        "statReachBottom": true // 使用分析-页面触底次数/人数,必须先开通自定义事件,并配置了合法的eventID
    });
    common.mta.Page.init();
    //获取query参数;
    if (options.query.scene || options.query.source){
        var $obj = options.query;
        for(var key in $obj){
            var $key = key,
                $item = $obj[$key];
            common.channel = $item;
            if(common.channel != null){
                common.mta.Event.stat("merchants", {[$key]:  $item});
            }
        }
    }
    if(common.channel == null){ //若query中取不到数据
        if (options.referrerInfo != null && options.referrerInfo.extraData != null && (options.referrerInfo.extraData.scene || options.referrerInfo.extraData.source)){
            var $obj = options.referrerInfo.extraData;
            for(var key in $obj){
                var $key = key,
                    $item = $obj[$key];
                common.channel = $item;
                if(common.channel != null){
                    common.mta.Event.stat("merchants", {[$key]:  $item});
                }
            }
        }
        if(common.channel == null){ //若没有渠道,则默认使用统计自身的漏斗
            common.channel = "zuiqiangdedanao";
        }
    }
},
});

zqddn_zhb_Game.js--------------------
onTipBtn: function() { //提示按钮
    if(common.keyCount > 0){
        //统计数据
        if(cc.sys.platform === cc.sys.WECHAT_GAME){ //微信平台
            common.mta.Event.stat('weidu',{'tips': common.currentLevel}); //按关卡统计点击提示的人数
        }
    }
},

2.4.设置到你的项目的腾讯移动分析管理页面
(1)创建统计渠道的事件
默认是在“基础分析”分页。展开左侧的“自定义事件”,点击“事件列表”,点击新增事件,
在弹出窗口,输入事件ID为 merchants,  
输入事件名称为 商家。
点击“保存”按钮,这样就创建了一个事件。
然后,还要给这个事件添加参数,点击“参数配置”,再点击“新增参数”,
在弹出窗口,输入如下的参数ID和参数名称:
 source 链接
 scene 二维码

这样,一个统计不同渠道进入游戏的事件就定义完了。
命名规则:
a.事件名称为中文英文数字下划线;
b.事件ID为英文数字;
c.参数名称为中文英文数字;
d.参数ID为英文数字;
e.参数取值为可以是任意字符(建议中文)
mta.Event.stat("ico_search", {"query":"特斯拉"});//这里要统计一个搜索事件

(2)创建统计游戏中玩家行为的事件
同前面创建渠道一样,创建如下事件:
 weidu  游戏关卡维度
然后,创建如下参数:
 totaluser  进入游戏总人数
 levelwin  通关人数
 tips  点击提示按钮的人数
 helpshare  求助按钮人数
 shopshare  挑战群友
 watchvideos  观看15秒视频
其中,在项目中发levelwin、tips、helpshare的事件消息时,需要传关卡序号,以区分玩家是在哪一关。

(3)创建漏斗
同前面创建渠道一样,创建漏斗
qudao1
 home    进入首页        
 selectlevel    进入选择关卡界面
 level1        通过第1关    
 level3        通过第3关    
 level10    通过第10关    
这里,在程序中渠道名要对应qudao1。
且漏斗的数据要第2天才可以看到。
另外,注意前面的代码中有“若没有渠道,则默认使用统计自身的漏斗”,这表示你应该创建一个测试用
漏斗,可以在接入渠道之前确定是否代码有问题。

3.实际中的经验
(1)在创建漏斗时,设置的事件名字必须是16个字符以内,对应代码中埋点时发送的事件名字。
(2)运营人员需要去整理统计数据到excel中,因此在创建自定义事件时要方便运营人员复制数据。
我采用是直接创建事件,不创建子事件。这样,运营只点击事件的查看,就可以直接看到按日期排的每天的点击数。
如下:
事件ID           事件名称
2guanqia4        求助按钮 
common.mta.Event.stat('2guanqia4',{}); //腾讯统计-求助按钮
(3)创建的事件删不掉。请谨慎添加事件。


 

你可能感兴趣的:(cocos,creator)