捕获ga事件发送失败

时间:2016-03-31 15:18:21

标签: google-analytics google-analytics-api

我注意到,当禁用Cookie时,ga发送呼叫将会失败 例如 ga('发送','事件','视频','播放','秋季广告'); 控制台将显示“存储不可用”。中止命中。'

我尝试使用回调'hitCallback',但会在成功或失败时触发。

如何知道http呼叫是否实际通过?

1 个答案:

答案 0 :(得分:0)

在analytics.js库中观察TASKS

Google Analytics库有一些内部验证处理的被调用任务。如果其中任何一个失败,则脚本抛出中止并且命中被取消。

任务是:

  • previewTask
  • checkProtocolTask​​
  • validationTask
  • checkStorageTask
  • historyImportTask
  • samplerTask
  • buildHitTask
  • sendHitTask
  • timingTask
  • displayFeaturesTask

最有趣的任务是 sendHitTask

跟踪器回调

我们可以将回调传递到 ga 跟踪器,如下所示:

ga(function(tracker) {
  var originalHitTask = tracker.get('sendHitTask');   
  tracker.set('sendHitTask', function(model) {
    originalHitTask(model);    
  });
});

当验证任务没有失败时,回调:

function(model) {
    originalHitTask(model);    
}

已处理。

但如果跟踪失败,则不会处理回调。所以我尝试用setTimeout检测这种行为,并将tmp变量设置为true或false。

Meta检测

ga(function(tracker) {
   var originalbuildHitTask = tracker.get('sendHitTask');
   var tmp = false;
     setTimeout(function(){
        if(tmp) {
            console.log("Success");
        }
        else {
            console.log("Failure");
        }
    },500);
  tracker.set('sendHitTask', function(model) {
    originalbuildHitTask(model);
    tmp = true;  
  });
});

工作示例

ga('create', 'UA-XXXXX-Y', {
  'cookieDomain' : 'bad.cxf', // set wrong domain, tracking will fail
});

// add task into tracker
ga(function(tracker) {
   var originalbuildHitTask = tracker.get('sendHitTask');
   var tmp = false;
   setTimeout(function(){
    if(tmp) {
      console.log("Success");
    }
    else {
      console.log("Failure");
    }
  },500);
  tracker.set('sendHitTask', function(model) {
    originalbuildHitTask(model);
    tmp = true;  
  });
});

ga('send', "pageview");

Conslusion

这种技术绝对不是最好的,但是我在互联网上开发和发现的唯一技术。如果有人能够改进它,我将非常高兴。

其他可能的解决方案

检测analytics.js中的中止

在分解的分析库中有抛出中止的方法,因此可能有直接观察中止的可能性:

sc = function(a) {
        if (K(a[0])) this.u = a[0];
        else {
            var b = td.exec(a[0]);
            null != b && 4 == b[y] && (this.c = b[1] || "t0", this.e = b[2] || "", this.d = b[3], this.a = [][ha][C](a, 1), this.e || (this.A = "create" == this.d, this.i = "require" == this.d, this.g = "provide" == this.d, this.ba = "remove" == this.d), this.i && (3 <= this.a[y] ? (this.X = this.a[1], this.W = this.a[2]) : this.a[1] && (qa(this.a[1]) ? this.X = this.a[1] : this.W = this.a[1])));
            b = a[1];
            a = a[2];
            if (!this.d) throw "abort";
            if (this.i && (!qa(b) || "" == b)) throw "abort";
            if (this.g &&
                (!qa(b) || "" == b || !K(a))) throw "abort";
            if (ud(this.c) || ud(this.e)) throw "abort";
            if (this.g && "t0" != this.c) throw "abort";
        }
    };

function Ja(a) {
    if (100 != a.get(Ka) && La(P(a, Q)) % 1E4 >= 100 * R(a, Ka)) throw "abort";
}

function Ma(a) {
    if (xa(P(a, Na))) throw "abort";
}

function Oa() {
    var a = M[B][E];
    if ("http:" != a && "https:" != a) throw "abort";
}

另一种解决方案可能是访问某些任务并尝试找到有关中止命中的一些指示。