‹ Flurry Analytics Doc Home

Flurry Analytics 集成指南

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

集成

用如下命令来集成 SDKBOX Flurry Analytics 插件,请确保您可以正常执行的 SDKBOX 安装器.

sdkbox import flurryanalytics

重点注意事项

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

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

添加以下项到 plist:

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

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

禁止 Bitcode 支持

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

游戏全屏配置

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

canOpenURL 白名单

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

关于 Creator 工程

Creator 导出工程会修改工程的配置, 这可能会影响 SDKBox 对工程的配置修改. 所以可以有以下做法(任选其一):

  1. 保存导出工程中的修改, 对于 SDKBox 来说可能有这些文件(mk, gradle, gradle.properties, AppDelegate.cpp, ...), 导出后再恢复对应该文件
  2. 在每一次 Creator 导出工程后, 重新 import 插件.

推荐第一种, 但是第一种的麻烦点在于, 对于第一次(或很久没接触的人)可能会有露掉某个文件 第二种, 很方便, 它的麻烦点在于, 如果你对工程有自己的修改, SDKBox 的重新 import 不能帮你恢复.

JSON 配置

SDKBOX 安装器会自动在您的工程中添加一个样例配置文件 sdkbox_config.json.在您编译工程前,请用您自己的应用信息修改里面的参数值

下面给出一个 Flurry Analytics 的配置样例,您需要用在 Flurry Analytics ID注册的帐号信息,替换 <API KEY>.

下面给出一个 iOS 下的配置例子

"FlurryAnalytics":{
            "APIKey":"<API KEY>",
            "AppVersion":"V0.1",
            "Debug":false,
            "Level":2,
            "SessionTimeout":10,
            "CrashReport":true
}

Android上的配置文件要复杂一点,里面包含了 locations, pulse and origin 的一些设置,下面给出一个例子:

"FlurryAnalytics":{
            "APIKey":"<API KEY>",
            "AppVersion":"V0.1",
            "Debug":false,
            "LogEvent":true,
            "Level":2,
            "SessionTimeout":10,
            "CrashReport":true,
            "LocationReport":true,
            "DefLocationLat":104.06,
            "DefLocationLon":30.67,
            "Pulse":true,
            "Origin":[
                {
                    "OriginName":"sdkbox",
                    "OriginVersion":"v0.1",
                    "OriginParams":{
                        "Key1":"Val1",
                        "Key2":"Val2",
                        "Key3":"Val3"
                    }
                },
                {
                    "OriginName":"sdkbox",
                    "OriginVersion":"v0.1"
                }
            ]
}

使用

修改 Lua 代码

修改 ./frameworks/runtime-src/Classes/lua_module_register.h 包含下面这几个必要的头文件,并注册 FlurryAnalytics 到lua中.注意他们的参数 lua_State*:

#include "PluginFlurryAnalyticsLua.hpp"
#include "PluginFlurryAnalyticsLuaHelper.h"
static int lua_module_register(lua_State* L)
{
  register_all_PluginFlurryAnalyticsLua(L);
  register_all_PluginFlurryAnalyticsLua_helper(L);
}

初始化 Flurry Analytics

修改您的lua代码来初始化这个插件. 这个初始化,可以在您的代码中任意地方,但是必须在您调用插件的功能接口之前.

sdkbox.PluginFlurryAnalytics:init()

使用 Flurry Analytics

在初始化完成后,您就可以使用 Flurry Analytics 提供的功能了. 在您的代码中任意地方,使用 logevent:

local eventName = "test event1"
sdkbox.PluginFlurryAnalytics:logEvent(eventName)

接收 Flurry Analytics 事件 (可选)

您可以接收 FlurryAnalytics 事件, 然后对不同事件做不同的程序响应,一个简单的例子可以会像这样:

sdkbox.PluginFlurryAnalytics:init()
sdkbox.PluginFlurryAnalytics:setListener(function(data)
        local ret = json.decode(data)
        print("apiKey:", ret.apiKey, "sessionId:", ret.sessionId)
        -- check session state
        print("Flurry analytics session exist: ", f:activeSessionExists())
        print("Flurry analytics session: ", f:getSessionID())
        local eventName = "test event1"
        sdkbox.PluginFlurryAnalytics:logEvent(eventName)
    end)
sdkbox.PluginFlurryAnalytics:startSession()

结束 Flurry Analytics (只在 Android 上有效)

当您不再使用 FlurryAnalytics 或您的游戏结束时, 必须要把 FlurryAnalytics 会话结束. 这个在 Android 上必须调用,但是在 iOS 上是可选的. 比如:

// 这个只在 android 上有效, 但是您在 iOS 调用,也没有关系
sdkbox.PluginFlurryAnalytics:endSession()

API Reference

Methods

sdkbox.PluginFlurryAnalytics:init()

init plugin, must be first invoke

sdkbox.PluginFlurryAnalytics:setAppVersion(version)

Explicitly specifies the App Version that Flurry will use to group Analytics data.

sdkbox.PluginFlurryAnalytics:getFlurryAgentVersion()

Retrieves the Flurry Agent Build Version.

sdkbox.PluginFlurryAnalytics:setShowErrorInLogEnabled(value)

Displays an exception in the debug log if thrown during a Session.

sdkbox.PluginFlurryAnalytics:setDebugLogEnabled(value)

Generates debug logs to console.

sdkbox.PluginFlurryAnalytics:setLogLevel(value)

Generates debug logs to console.

sdkbox.PluginFlurryAnalytics:setSessionContinueSeconds(seconds)

Set the timeout for expiring a Flurry session.

sdkbox.PluginFlurryAnalytics:setCrashReportingEnabled(value)

Enable automatic collection of crash reports.

sdkbox.PluginFlurryAnalytics:startSession()

Start a Flurry session for the project denoted by apiKey.

sdkbox.PluginFlurryAnalytics:endSession()

end session, just valid on Android

sdkbox.PluginFlurryAnalytics:activeSessionExists()

Start a Flurry session for the project denoted by apiKey.

sdkbox.PluginFlurryAnalytics:getSessionID()

Start a Flurry session for the project denoted by apiKey.

sdkbox.PluginFlurryAnalytics:pauseBackgroundSession()

Pauses a Flurry session left running in background. on valid on iOS

sdkbox.PluginFlurryAnalytics:addOrigin(originName, originVersion)

Adds an SDK origin specified by originName and originVersion.

sdkbox.PluginFlurryAnalytics:addOrigin(originName, originVersion, parameters)

Adds a custom parameterized origin specified by originName with originVersion and parameters.

sdkbox.PluginFlurryAnalytics:addOrigin(originName, originVersion, parameters)

just for lua, js binding, have the same function with addOrigin(string, string, map)

sdkbox.PluginFlurryAnalytics:logEvent(eventName)

Records a custom event specified by eventName.

sdkbox.PluginFlurryAnalytics:logEvent(eventName, parameters)

Records a custom parameterized event specified by eventName with parameters.

sdkbox.PluginFlurryAnalytics:logEvent(eventName, parameters)

just for lua, js binding, have same function with logEvent(string, map)

sdkbox.PluginFlurryAnalytics:logEvent(eventName, timed)

Records a timed event specified by eventName.

sdkbox.PluginFlurryAnalytics:logEvent(eventName, parameters, timed)

Records a custom parameterized timed event specified by eventName with parameters.

sdkbox.PluginFlurryAnalytics:logEvent(eventName, parameters, timed)

just for lua, js binding, have the same function with logEvent(string, map, bool)

sdkbox.PluginFlurryAnalytics:endTimedEvent(eventId)

End a timed event

sdkbox.PluginFlurryAnalytics:endTimedEvent(eventName, parameters)

Ends a timed event specified by eventName and optionally updates parameters with parameters.

sdkbox.PluginFlurryAnalytics:endTimedEvent(eventName, parameters)

just for lua, js binding, have same function with endTimeEvent(string, map)

sdkbox.PluginFlurryAnalytics:logError(errorID, message, info)

Records an app exception. Commonly used to catch unhandled exceptions.

sdkbox.PluginFlurryAnalytics:logPageView()

Explicitly track a page view during a session.

sdkbox.PluginFlurryAnalytics:setUserID(userID)

Assign a unique id for a user in your app.

sdkbox.PluginFlurryAnalytics:setAge(age)

Set your user's age in years.

sdkbox.PluginFlurryAnalytics:setGender(gender)

Set your user's gender.

sdkbox.PluginFlurryAnalytics:setReportLocation(reportLocation)

Set whether Flurry should record location via GPS. Defaults to true. valid on Android

sdkbox.PluginFlurryAnalytics:setLatitude(latitude,
                                          longitude,
                                          horizontalAccuracy,
                                          verticalAccuracy)

Set the location of the session.

sdkbox.PluginFlurryAnalytics:clearLocation()

clear the default location.valid on Android

sdkbox.PluginFlurryAnalytics:setSessionReportsOnCloseEnabled(sendSessionReportsOnClose)

Set session to report when app closes.valid on iOS

sdkbox.PluginFlurryAnalytics:setSessionReportsOnPauseEnabled(setSessionReportsOnPauseEnabled)

Set session to report when app is sent to the background.valid on iOS

sdkbox.PluginFlurryAnalytics:setBackgroundSessionEnabled(setBackgroundSessionEnabled)

Set session to support background execution.valid on iOS

sdkbox.PluginFlurryAnalytics:setEventLoggingEnabled(value)

Enable custom event logging.

sdkbox.PluginFlurryAnalytics:setPulseEnabled(value)

Enables Flurry Pulse

sdkbox.PluginFlurryAnalytics:setListener(listener)

set listener for session callback

Listeners

flurrySessionDidCreateWithInfo(info)

Invoked when analytics session is created,

手动集成

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

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

iOS 平台手动集成

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

sdkbox.framework

PluginFlurryAnalytics.framework

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

Security.framework

SystemConfiguration.framework

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

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

Android 平台手动集成

拷贝文件

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

FlurryAnalytics-5.5.0.jar

PluginFlurryAnalytics.jar

sdkbox.jar

plugin/android/jni 目录拷贝 pluginflurryanalytics 以及 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.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

使 hardware acceleration 属性生效。这一标签是一个在新版本 sdk 上的选项,不能用于2.3.3版本。

<android:hardwareAccelerated="true" />

编辑 Android.mk

编辑 proj.android/jni/Android.mk

LOCAL_STATIC_LIBRARIES 添加额外的库:

LOCAL_STATIC_LIBRARIES += PluginFlurryAnalytics
LOCAL_STATIC_LIBRARIES += sdkbox

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

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

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

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

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

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

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();
          }
    }

混淆 (release, optional)

proguard.config=proguard.cfg
-dontwarn android.webkit.**

注意: 混淆只在 Release 编译模式下有效 (i.e cocos run -m release) debug 编译下不会调用到混淆规则.