menu
Is this helpful?

# 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 디렉터리로 드래그합니다.
  • 개발자 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"
    })
}