# Corona
:::: 팁
구현하기 전에 데이터 엑세스 준비를 확인하십시오.
Corona SDK는 iOS, Android를 지원하며, 크기는 약 0.5M입니다.
::::
최신 버전: v2.0.1 다운로드 (opens new window)
업데이트 시간: 2023-11-24
소스 코드: Source Code (opens new window)
# 1. SDK 액세스
- Corona 구성 추가
- Corona SDK (opens new window) 리소스 파일을 다운로드하고, 파일을 압축 해제한 후, TDAnalytics.lua를 Corona 디렉터리에 복사합니다.
- Android 구성 추가
- android/ThinkingPluginProxy.java를 android/plugin/src/main/java/plugin/library 디렉터리에 복사합니다.
- Android Studio를 사용하여 Android 프로젝트를 열고, 표시 모드를 Android로 전환한 다음, build.gradle에 의존성을 추가하고, [지금 동기화]를 클릭하여 업데이트합니다.
dependencies {
implementation 'cn.thinkingdata.android:ThinkingAnalyticsSDK:3.0.0'
}
- plugin.library.LuaLoader에 코드 추가
WARNING
plugin.library.LuaLoader에서 함수를 확장하지 않을 경우, android/LuaLoader.java를 android/plugin/src/main/java/plugin/library 디렉터리에 직접 복사하여, 원본 LuaLoader.java 파일을 덮어쓸 수 있습니다.
public int invoke(LuaState L) {
NamedJavaFunction[] luaFunctions = new NamedJavaFunction[] {
...
// ThinkingAnalyticsSDK: add code
new ThinkingBridgingWrapper(),
...
};
String libName = L.toString( 1 );
L.register(libName, luaFunctions);
return 1;
}
public void dispatchEvent(final String message) {
CoronaEnvironment.getCoronaActivity().getRuntimeTaskDispatcher().send( new CoronaRuntimeTask() {
@Override
public void executeUsing(CoronaRuntime runtime) {
LuaState L = runtime.getLuaState();
CoronaLua.newEvent( L, EVENT_NAME );
...
// ThinkingAnalyticsSDK: add code
JSONObject jsonObject = null;
String newMessage = null;
String type = null;
try {
jsonObject = new JSONObject(message);
newMessage = jsonObject.optString("message");
type = jsonObject.optString("type");
} catch (Exception ignored) {
}
if (!TextUtils.isEmpty(newMessage) && !TextUtils.isEmpty(type)) {
L.pushString(newMessage);
L.setField(-2, "message");
L.pushString(type);
L.setField(-2, "type");
} else {
L.pushString(message);
L.setField(-2, "message");
}
...
try {
CoronaLua.dispatchEvent( L, fListener, 0 );
} catch (Exception ignored) {
}
}
} );
}
...
// ThinkingAnalyticsSDK: add code
@SuppressWarnings({"WeakerAccess", "SameReturnValue"})
public int thinkingBridging(LuaState L) {
CoronaActivity activity = CoronaEnvironment.getCoronaActivity();
if (activity == null) {
return 0;
}
String word = L.checkString( 1 );
JSONObject params = null;
try {
params = new JSONObject(word);
} catch (JSONException e) {
params = new JSONObject();
}
String method = params.optString("method");
if (method.length() > 0) {
try {
Class aClass = Class.forName("plugin.library.ThinkingPluginProxy");
Method aMethod = aClass.getDeclaredMethod(method, JSONObject.class);
JSONObject jsonObject = (JSONObject) aMethod.invoke(aClass, params);
if (jsonObject != null && jsonObject.getClass() == JSONObject.class && jsonObject.has("message")) {
(new Thread() {
@Override
public void run() {
dispatchEvent(jsonObject.toString());
}
}).start();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return 0;
}
...
...
// ThinkingAnalyticsSDK: add code
@SuppressWarnings("unused")
private class ThinkingBridgingWrapper implements NamedJavaFunction {
@Override
public String getName() {
return "thinkingBridging";
}
@Override
public int invoke(LuaState L) {
return thinkingBridging(L);
}
}
...
iOS 구성 추가
- Xcode를 사용하여 iOS 프로젝트를 열고, ios 디렉터리의 ThinkingAnalyticsSDK 폴더를 App 디렉터리로 드래그합니다.
- Xcode를 사용하여 iOS 프로젝트를 열고, ios 디렉터리의 ThinkingAnalyticsSDK 폴더를 App 디렉터리로 드래그합니다.
개발자 ARC 지원, 다음 선택으로 TARGETS -> App -> Build Settings -> Objective-C Automatic Reference Counting, 및 YES로 설정
TARGETS -> App -> Build Phases -> Compile Sources -> ThinkingPluginLibrary.mm, 추가 설정 -fno-objc-arc
# 2. 초기 설정
-- TDAnalytics 임포트
local TDAnalytics = require("TDAnalytics")
-- TDAnalytics 초기화
local params = {
appId = "YOUR_APP_ID",
serverUrl = "YOUR_SERVER_URL"
}
TDAnalytics.shareInstance(params)
주의: 일부 디바이스에서는 기본적으로 평문 전송이 금지되어 있으므로, HTTPS 형식의 수신 주소 사용을 강력히 권장합니다.
# 3. 주요 기능
# 3.1 계정 ID 설정
유저가 로그인할 때, login
을 호출하여 유저의 계정ID를 설정할 수 있습니다. TE 플랫폼은 logout
을 호출하기 전까지 계정ID를 식별ID로 유지합니다. login
을 여러 번 호출하면 이전 계정ID는 덮어씌워집니다.
-- 유저의 고유 로그인 식별자로, 데이터 추적에서 #account_id에 해당합니다. #Account_id는 현재 TE입니다.
TDAnalytics.login("TE")
이 방법으로는 로그인 이벤트가 전송되지 않습니다
# 3.2 공통 이벤트 속성 설정
공통 이벤트 속성은 모든 이벤트에 포함되는 속성입니다. setSuperProperties
함수를 호출하여 설정할 수 있습니다. 이벤트 전송 전에 공통 이벤트 속성을 설정해주세요.
예를 들어: 플레이어의 레벨, 전투력, 소지 자원 등의 속성을 포함할 수 있습니다.
-- 공통 속성 설정
TDAnalytics.setSuperProperties({
channel = "App Store",
trip = {"Car", "Train"}
})
공통 이벤트 속성은 앱을 시작할 때마다 호출할 필요가 없도록 캐시에 저장됩니다. setSuperProperties()
를 호출하여 이전에 설정한 공통 이벤트 속성을 업로드하면, 이전의 속성은 덮어씌워집니다. 공통 이벤트 속성이 track()
함수로 업로드된 이벤트의 속성 키와 같다면, 이벤트의 속성은 공통 이벤트 속성에 의해 덮어씌워집니다.
# 3.3 자동 수집 이벤트 활성화
초기화 매개변수 호출로 활성화할 수 있습니다.
-- 자동 추적 활성화
-- appInstall=앱 설치 자동 추적 활성화
-- appStart=앱 시작 자동 추적 활성화
-- appEnd=앱 종료 자동 추적 활성화
local params = {
appId = "YOUR_APP_ID",
serverUrl = "YOUR_SERVER_URL",
autoTrack = {
"appStart", "appEnd", "appInstall"
}
}
TDAnalytics.shareInstance( params )
주의:게스트 ID를 커스터마이즈할 필요가 있는 경우, 자동 수집 기능을 활성화하기 전에
identify()
함수를 호출하여 게스트 ID를 설정해야 합니다.
# 3.4 이벤트 전송
미리 정의된 데이터 플랜에 따라 이벤트의 속성과 정보를 설정하는 것이 좋습니다. 이벤트 이름은 문자로 시작해야 하며 숫자, 문자, 및 "_"를 포함할 수 있고, 최대 길이는 50자이며, 대소문자를 구분합니다
TDAnalytics.track("product_buy", {product_name="product name"});
- 이벤트 속성은 테이블 타입이며, 각 요소는 속성을 나타냅니다.
- 이벤트 속성 키는 문자열 타입의 이름이며, 문자로만 시작할 수 있고, 숫자, 문자, 및 "_"를 포함할 수 있으며, 최대 길이는 50자입니다.
- 속성 값은 문자열, 숫자, 불린, 배열, 객체, 객체 그룹 타입을 지원합니다. 복잡한 데이터 타입은 객체와 객체 그룹으로 저장할 수 있습니다.
# 3.5 유저 속성 설정
일반적인 유저 속성에 대해서는, userSet()
을 이용하여 설정할 수 있지만, UserSet
은 원래의 값을 덮어씁니다. 본래 해당 속성에 값이 없는 경우는, 속성이 새로 생성됩니다. 아래는 코드 예시입니다.
-- 유저 속성 설정
TDAnalytics.userSet({user_name = "TE"})
속성 형식은 이벤트 속성과 동일한 요구 사항을 따릅니다.
# 4. 코드 예시 (Example Code)
아래의 코드 예시에 모든 작업이 포함되어 있으며, 아래 순서대로 사용하는 것을 권장합니다:
-- TDAnalytics 임포트
local TDAnalytics = require("TDAnalytics")
if (privacy policy is authorized) {
-- SDK 초기화
local params = {
appId = "YOUR_APP_ID",
serverUrl = "YOUR_SERVER_URL"
}
TDAnalytics.init(params)
-- 유저가 로그인한 경우, 유저의 계정 ID를 고유 식별자로 설정할 수 있습니다
TDAnalytics.login("TE")
-- 슈퍼 속성 설정 후, 각 이벤트는 슈퍼 속성을 갖게 됩니다
local superProperties = {}
superProperties["channel"] = "TE" -- 문자열
superProperties["age"] = 1 -- 숫자
superProperties["isSuccess"] = true -- 불린
superProperties["birthday"] = os.date("%Y-%m-%d %H:%M:%S") -- 시간
superProperties["object"] = { key="value" } -- 객체
superProperties["object_arr"] = { { key="value" } } -- 객체 배열
superProperties["arr"] = { "value" } -- 배열
TDAnalytics.setSuperProperties(superProperties) -- 슈퍼 속성 설정
-- 자동 추적 활성화
TDAnalytics.track("product_buy", {
product_name="book"
-- 유저 속성 설정
TDAnalytics.userSet({
user_name = "TE"
})
}