Google TagManager Bug:在我们推送一个事件时会触发双事件

时间:2017-06-11 09:38:01

标签: android google-analytics google-play-services google-tag-manager

以下是我用于在tagmanager的数据层上发送推送事件的所有代码。包括tagmanager的init。

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import com.google.android.gms.common.api.PendingResult;
import com.google.android.gms.tagmanager.ContainerHolder;
import com.google.android.gms.tagmanager.DataLayer;
import com.google.android.gms.tagmanager.TagManager;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button b = (Button) findViewById(R.id.button);
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sendOpenScreenWithDeviceInfo("HEllo world","hello world", MainActivity.this);
            }
        });

        initTagmanager(this);

    }


    public static void sendOpenScreenWithDeviceInfo(final String screenName, final String vertical, final Context context) {

        DataLayer dataLayer = TagManager.getInstance(context).getDataLayer();
        dataLayer.pushEvent("openScreen", DataLayer.mapOf("screenName", screenName));

    }

    public static void initTagmanager(Context context) {
        prepareTagManager(BuildConfig.CONTAINER_ID_1, R.raw.defaultcontainer_binary_1, context);
        prepareTagManager(BuildConfig.CONTAINER_ID_2, R.raw.defaultcontainer_binary_2, context);
    }

    public static void prepareTagManager(String containerName, int rawContainer,final Context context) {
        try {
            TagManager tagManager = TagManager.getInstance(context);
            PendingResult<ContainerHolder> pending =
                            tagManager.loadContainerPreferNonDefault(containerName,
                        rawContainer);

            } catch (Exception e) {
                Log.e("GTM", e.getMessage(), e);
            }
    }

}

当我按下按钮后,它会打印此日志。

06-11 15:02:34.657 22292 22932 D GAv4    : Hit delivery requested: ht=1497173554549, _s=23, _v=ma9.2.56, a=1556722142, adid=2d68a735-0d98-4e3f-9588-07ade43f9ff6, aid=com.example.sibadityamaiti.myapplication, an=My Application, ate=1, av=1.0, cd=HEllo world, cd11=NA, cd12=NA, cd13=NA, cd14=NA, cd15=NA, cd20=NA, cd6=NA, cd7=NA, cd8=NA, cid=8f3adfc2-2cbe-49c0-b2b3-d3913ff4e5f9, sr=1080x1920, t=appview, tid=UA-36768858-15, uid=NA, ul=en-in, v=1
06-11 15:02:34.672 22292 22932 D GAv4    : Hit delivery requested: ht=1497173554553, _s=23, _v=ma9.2.56, a=1556722143, adid=2d68a735-0d98-4e3f-9588-07ade43f9ff6, aid=com.example.sibadityamaiti.myapplication, an=My Application, ate=1, av=1.0, cd=HEllo world, cd11=NA, cd12=NA, cd13=NA, cd14=NA, cd15=NA, cd20=NA, cd6=NA, cd7=NA, cd8=NA, cid=8f3adfc2-2cbe-49c0-b2b3-d3913ff4e5f9, sr=1080x1920, t=appview, tid=UA-36768858-8, uid=NA, ul=en-in, v=1
06-11 15:02:34.734 22292 22932 D GAv4    : Hit sent to the device AnalyticsService for delivery
06-11 15:02:34.755 22292 22932 D GAv4    : Hit sent to the device AnalyticsService for delivery

日志显示两个事件被触发但是只有一个点击事件。 这可能会导致分析损坏。

这是我正在使用的依赖。

 compile 'com.google.android.gms:play-services-tagmanager:9.2.1'

任何帮助将不胜感激。如果有人需要更多信息,请告诉我。

1 个答案:

答案 0 :(得分:0)

我们希望找到问题所在。这里没有双数据层推送调用。 这是TagManager lib本身的健壮性问题。

主要问题是。如果为单个应用程序实例调用tagmanager init两次。 TagManager将通过发送双击或三击命令开始行为不端。

在我发布的示例应用中。哪一个活动。 在其onCreate中调用Tag Manager Init。一个按钮。它onclick在数据层上发送一次推送。 新样品容器。即使这个最小设置也能够重现这个错误。

在我们的案例中,我们在Launcher Activity OnCreate中初始化GTM。按下然后再回来。 随着启动器将再次创建。它会再次调用Init。但是对于这种情况,没有重新创建Application实例。

我们的解决方案是将此Init Tag管理器代码移动到Application OnCreate。而是在任何活动中。 在我们的开发测试中。我们现在发现它已修复。

对于Google团队:

  1. tagmanager doc应该提到首选Application类中的TagManager init。而不是任何Activty。如果它已经提到过。  然后我可能会忽略它。它应该突出显示,因为它可以影响产品的GA。

  2. TagManager应该更健壮,可以处理单个应用实例的多个init。