‹ Google Analytics Doc Home

Google Analytics 集成指南

For the Lua version of cocos2d-x v3.x - (all other versions)

集成

在您确保正确安装了 SDKBOX installer 的情况下,运行下面的命令来集成 SDKBOX Google Analytics 插件。

sdkbox import googleanalytics

~~从 China 服务器下载~~ 服务器已停止

如果你在中国, 并且下载插件的速度比较慢, 可以尝试使用位于中国的服务器来下载, 查询插件, 使用方法为在你的 sdkbox import 后加 --server china 及可, 比如:

sdkbox import xxx  --server china

xxx 为你的插件名字

重点注意事项

如果您升级到了 Xcode7, 则需要以下额外步骤来确保插件工作正常:

禁用应用程序安全传输策略

添加以下项到 plist:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

添加后的文件内容看起来就像这样:

禁止 Bitcode 支持

您必须禁止 Bitcode 的支持,否则将会编译失败。

游戏全屏配置

如果您的游戏不同时支持横竖屏,则必须在 Xcode 中选中 Requires full screen,否则将不会通过 Apple 的审核。

canOpenURL 白名单

取决于您使用哪些插件。需要在 info.plistLSApplicationQueriesSchemes 下添加名单。

JSON 配置

SDKBOX Installer 将会自动在您的 res/sdkbox_config.json 中插入一份配置样例。请修改这份配置样例,使其能用于您自己的 app 。

对于一个 Google Analytics 插件的配置样例,您需要将其中的 <TRACKING_CODE> 替换成您特定的 Google Analytics 帐号中的信息。

"GoogleAnalytics" : {
    "trackingCode" : "<TRACKING_CODE>",
    "anonymizeIp": true
}

追踪器

一个 追踪器 用于统计被追踪的事件。这里有以下几点需要开发人员注意:

使用

修改 Lua 代码

修改 ./frameworks/runtime-src/Classes/lua_module_register.h 文件,包含必要的头文件并且注册 Google Analytics 的 Lua_State。 Note: 请注意该注册函数需要一个 lua_State* 参数。

#include "PluginGoogleAnalyticsLua.hpp"
static int lua_module_register(lua_State* L)
{
  register_all_PluginGoogleAnalyticsLua(L);
}

初始化 Google Analytics

sdkbox.PluginGoogleAnalytics:init()

API Reference

Methods

sdkbox.PluginGoogleAnalytics:init()

initialize the plugin instance.

sdkbox.PluginGoogleAnalytics:startSession()

The analytics session is being explicitly started at plugin initialization time.

sdkbox.PluginGoogleAnalytics:stopSession()

You normally will never stop a session manually.

sdkbox.PluginGoogleAnalytics:dispatchHits()

Manually request dispatch of hits. By default, data is dispatched from the Google Analytics SDK for Android every 5 minutes.

sdkbox.PluginGoogleAnalytics:dispatchPeriodically(seconds)

Change the dispatch info time period to the desired amount of seconds.

sdkbox.PluginGoogleAnalytics:stopPeriodicalDispatch()

Stop periodically sending info. Then manually the dispatchPeridically or dispatchHits should be called.

sdkbox.PluginGoogleAnalytics:logScreen(title)

Log screen info. title is the title of a screen. Screens are logical units inside your app you'd like to identify at analytics panel.

sdkbox.PluginGoogleAnalytics:logEvent(eventCategory,
                                       eventAction,
                                       eventLabel,
                                       value)

GoogleAnalytics::logEvent("Achievement", "Unlocked", "Slay 10 dragons", 5);

sdkbox.PluginGoogleAnalytics:logException(exceptionDescription, isFatal)

Log an exception. It is a basic support for in-app events.

sdkbox.PluginGoogleAnalytics:logTiming(timingCategory,
                                        timingInterval,
                                        timingName,
                                        timingLabel)

Measure a time inside the application.

sdkbox.PluginGoogleAnalytics:logSocial(socialNetwork,
                                        socialAction,
                                        socialTarget)

Log a social event.

sdkbox.PluginGoogleAnalytics:setDryRun(dr)

While running on dry run, the tracked events won't be sent to the actual analytics account.

sdkbox.PluginGoogleAnalytics:enableAdvertisingTracking(e)

Enable advertising tracking when in google's ad vendors.

sdkbox.PluginGoogleAnalytics:createTracker(trackerId)

Create a tracker identified by the google analytics tracker id XX-YYYYYYYY-Z. If the tracker already existed, no new tracker will be created. In any case, the tracker associated with tracker id will be set as default tracker for analytics operations.

sdkbox.PluginGoogleAnalytics:enableTracker(trackerId)

Enable a tracker identified by a trackerId. If the tracker does not exist, nothing will happen.

Listeners

手动集成

如果 SDKBOX 安装器 安装插件失败了,那么需要手动集成插件.如果安装器安装插件成功了,那么不需要,也没必要,按文档再手动集成一次.

下面列出的的步骤一般很少用到.如果你按下面的步骤完成了集成,请在完成集成后,再按步骤检查一次.

iOS 平台手动集成

拖拽下列 framework 从 GoogleAnalytics 插件包的 plugins/ios 目录到您的 Xcode 工程中,在添加 frameworks 的时候,请勾选 Copy items if needed

sdkbox.framework

PluginGoogleAnalytics.framework

上面的 frameworks 依赖于其他 frameworks。如果您没有添加它们,您也需要添加下列这些 frameworks:

CoreData.framework

Security.framework

SystemConfiguration.framework

libz.dylib

libsqlite3.dylib

libAdIdAccess.a (optional, required for IDFA)

AdSupport.framework (optional, required for IDFA)

Add a linker flag, if your setup requires it, to: Target -> Build Settings -> Linking -> Other Linker Flags:

-force_load /path/to/libAdIdAccess.a

plugin/luabindings 文件夹中所有的头文件和源文件都拷贝到你的工程的 Classes 文件夹中.

把刚刚拷贝的文件拖动到 Xcode 中或使用 File -> Add files to... 来添加.

Android 平台手动集成

拷贝文件

从插件安装包中的 plugin/android/libs 目录拷贝下列 jar 文件到您的工程的 proj.android/libs 目录。

PluginGoogleAnalytics.jar

sdkbox.jar

plugin/android/jni 目录拷贝 plugingoogleanalytics 以及 sdkbox 目录到您的工程的 proj.android/jni 目录。如果 sdkbox 目录在工程中已经存在,请覆盖它。

编辑 AndroidManifest.xml

在标签 application tag 上添加下列权限:

  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.WAKE_LOCK" />

还有一些必要的元数据标签需要添加:

<meta-data android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" />
<meta-data
    android:name="com.google.android.gms.analytics.globalConfigResource"
    android:resource="@xml/global_tracker" />

编辑元数据文件

在上面的步骤中,会指定一个名为 global_tracker.xml 的文件。这个文件必须放在 proj.android/res/xml/ 目录下,并包含一些必要的设置。如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="ga_dispatchPeriod">300</integer>
    <string name="ga_logLevel">verbose</string>
</resources>

编辑 Android.mk

编辑 proj.android/jni/Android.mk

LOCAL_STATIC_LIBRARIES 添加额外的库:

LOCAL_STATIC_LIBRARIES += PluginGoogleAnalytics
LOCAL_STATIC_LIBRARIES += sdkbox

在所有 import-module 语句之前添加一条 call 语句:

$(call import-add-path,$(LOCAL_PATH))

在最后添加额外的 import-module 语句:

$(call import-module, ./sdkbox)
$(call import-module, ./plugingoogleanalytics)

这意味着您的语句顺序看起来像是这样:

$(call import-add-path,$(LOCAL_PATH))
$(call import-module, ./sdkbox)
$(call import-module, ./plugingoogleanalytics)

Note: 如果您使用的是 cocos2d-x 预编译库,那么保证这些语句在已有的 $(call import-module,./prebuilt-mk) 语句之上非常重要。

编辑 Application.mk (只限 Cocos2d-x v3.0 到 v3.2 版本)

编辑 proj.android/jni/Application.mk 保证 APP_STL 的定义正确。如果 Application.mk 包含了 APP_STL := c++_static 语句,那么这条语句应该被改为:

APP_STL := gnustl_static

plugin/luabindings 文件夹中所有的头文件和源文件都拷贝到你的工程的 Classes 文件夹中.

把你刚刚拷贝的 .cpp 文件添加到 Android.mk 文件的的 LOCAL_SRC_FILES 项.比如

LOCAL_SRC_FILES := hellocpp/main.cpp \
                ../../Classes/AppDelegate.cpp \
                ../../Classes/HelloWorldScene.cpp \
                                ../../Classes/NewSourceFile.cpp

修改 AppActivity.java

插件版本 >= 2.4.0.3

  1. 找到 AppActivity.java 文件
find . -name "AppActivity.java"
  1. extends Cocos2dxActivity 替换为 extends com.sdkbox.plugin.SDKBoxActivity

以下是 AppActivity.java 不同版本的引擎所在的目录:

cpp
  - proj.android/src/org/cocos2dx/cpp/AppActivity.java
  - proj.android-studio/app/src/org/cocos2dx/cpp/AppActivity.java
  - proj.android/app/src/org/cocos2dx/cpp/AppActivity.java ( from cocos2d-x 3.17)

lua
  - frameworks/runtime-src/proj.android/src/org/cocos2dx/lua/AppActivity.java
  - frameworks/runtime-src/proj.android-studio/app/src/org/cocos2dx/lua/AppActivity.java
  - frameworks/runtime-src/proj.android/app/src/org/cocos2dx/lua/AppActivity.java (from cocos2d-x 3.17)

js
  - frameworks/runtime-src/proj.android/src/org/cocos2dx/javascript/AppActivity.java
  - frameworks/runtime-src/proj.android/app/src/org/cocos2dx/javascript/AppActivity.java ( from cocos2d-x 3.17)

插件版本 < 2.4.0.3

Note: 当你使用 cocos2d-x 源代码时,不同的版本中 Cocos2dxActivity.java 文件的位置也不同。一个确定该文件位置的方法是查看 proj.android/project.properties 。比如:

android.library.reference.1=../../cocos2d-x/cocos/platform/android/java

在这个例子中, Cocos2dxActivity.java 文件应该在如下位置:

../../cocos2d-x/cocos/platform/android/java/src/org/cocos2dx/lib/Cocos2dxActivity.java
import android.content.Intent;
import com.sdkbox.plugin.SDKBox;
onLoadNativeLibraries();
SDKBox.init(this);
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          if(!SDKBox.onActivityResult(requestCode, resultCode, data)) {
            super.onActivityResult(requestCode, resultCode, data);
          }
    }
    @Override
    protected void onStart() {
          super.onStart();
          SDKBox.onStart();
    }
    @Override
    protected void onStop() {
          super.onStop();
          SDKBox.onStop();
    }
    @Override
    protected void onResume() {
          super.onResume();
          SDKBox.onResume();
    }
    @Override
    protected void onPause() {
          super.onPause();
          SDKBox.onPause();
    }
    @Override
    public void onBackPressed() {
          if(!SDKBox.onBackPressed()) {
            super.onBackPressed();
          }
    }

使用 Proguard (release模式下可选)

proguard.config=proguard.cfg
-libraryjars libs/android-support-v4.jar

-keep class * extends java.util.ListResourceBundle {
    protected Object[][] getContents();
}

-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable {
    public static final *** NULL;
}

-keepnames @com.google.android.gms.common.annotation.KeepName class *
-keepclassmembernames class * {
    @com.google.android.gms.common.annotation.KeepName *;
}

-keepnames class * implements android.os.Parcelable {
    public static final ** CREATOR;
}

Note: Proguard 只能工作在 Release 模式下 (比如: cocos run -m release) debug 模式下不会触发 Proguard。