Google TagManager 错误:在我们推送一个时触发了两个事件
Google TagManager Bug : Double events are fired while we are pushing one
以下是我用于在 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
日志显示触发了两个事件,但只有一个点击事件。
这可能会导致 GA 分析损坏。
这是我正在使用的依赖项。
compile 'com.google.android.gms:play-services-tagmanager:9.2.1'
如有任何帮助,我们将不胜感激。如果有人需要更多信息,请告诉我。
我们希望找到问题所在。这里没有双数据层推送调用。
是TagManager lib本身健壮性的问题
主要问题是。如果您为单个应用程序实例调用 tagmanager init 两次。
TagManager 将通过发送两次或三次点击开始行为不端。
在我发布在这里的示例应用程序中。其中有一个 activity。
在其 onCreate 中调用 Tag Manager Init。一个按钮。它的 onclick 在数据层上发送一个推送。
新的样品容器。即使是这种最小设置也能够重现此错误。
在我们的例子中,我们在 Launcher Activity OnCreate 中初始化 GTM。按回来再回来。
因为启动器将再次创建。它会再次调用 Init。但是对于这种情况,没有重新创建应用程序实例。
我们的解决方案是将此 Init Tag 管理器代码移至 Application OnCreate。而在任何Activity。
在我们的开发测试中。我们发现它现在已修复。
Google 团队:
tagmanager 文档应该提到 prefer TagManager init in Application class。而不是在任何活动中。如果已经提到了。
然后我可能忽略了它。它应该突出显示,因为它会影响产品的 GA。
TagManager 应该更强大以处理单个应用程序实例的多个初始化。
以下是我用于在 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
日志显示触发了两个事件,但只有一个点击事件。 这可能会导致 GA 分析损坏。
这是我正在使用的依赖项。
compile 'com.google.android.gms:play-services-tagmanager:9.2.1'
如有任何帮助,我们将不胜感激。如果有人需要更多信息,请告诉我。
我们希望找到问题所在。这里没有双数据层推送调用。 是TagManager lib本身健壮性的问题
主要问题是。如果您为单个应用程序实例调用 tagmanager init 两次。 TagManager 将通过发送两次或三次点击开始行为不端。
在我发布在这里的示例应用程序中。其中有一个 activity。 在其 onCreate 中调用 Tag Manager Init。一个按钮。它的 onclick 在数据层上发送一个推送。 新的样品容器。即使是这种最小设置也能够重现此错误。
在我们的例子中,我们在 Launcher Activity OnCreate 中初始化 GTM。按回来再回来。 因为启动器将再次创建。它会再次调用 Init。但是对于这种情况,没有重新创建应用程序实例。
我们的解决方案是将此 Init Tag 管理器代码移至 Application OnCreate。而在任何Activity。 在我们的开发测试中。我们发现它现在已修复。
Google 团队:
tagmanager 文档应该提到 prefer TagManager init in Application class。而不是在任何活动中。如果已经提到了。 然后我可能忽略了它。它应该突出显示,因为它会影响产品的 GA。
TagManager 应该更强大以处理单个应用程序实例的多个初始化。