SDK ์ฐ๋
Hackle Unity SDK๋ Android SDK, iOS SDK ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ํฉ๋๋ค. ์๋ OS๋ฅผ ์ง์ํฉ๋๋ค.
- Android API 16 (4.1 Jelly Bean) ์ด์
- iOS 10 ์ด์
Unity EditorUnity SDK๋ Desktop์ด๋ Editor๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
1. SDK ์ค์น
Unity Package Manager๋ฅผ ํตํด SDK ์ค์น๊ฐ ํ์ํฉ๋๋ค.
์ฌ๊ธฐ๋ฅผ ํด๋ฆญํ์ฌ, SDK๋ฅผ ๋ค์ด๋ก๋ ๋ฐ์ต๋๋ค.
Unity์์ Assets > Import Package > Custom Package๋ฅผ ํด๋ฆญํฉ๋๋ค.
๋ค์ด๋ฐ์ package๋ฅผ ์ ํํ๊ณ , import ํ๋ฉด ์ค์น๊ฐ ์๋ฃ๋ฉ๋๋ค.
Android ProGuard / R8
ProGuard, R8์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, aar ์ํฐํฉํธ์ ๋๋ ํ ๊ท์น์ด ์๋์ผ๋ก ํฌํจ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ์๋ ๊ท์น์ ํฌํจ์์ผ์ผ ํฉ๋๋ค.
-keep class io.hackle.android.** { *; }
-keep class io.hackle.sdk.** { *; }
SDK ์ค์น ํ ์ฑ ์ฌ์ค์นUnity SDK๋ Android, iOS SDK๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
๊ธฐ์กด์ ํ ์คํธ ์ค์ด๋ ์ฑ์ ์๋กญ๊ฒ ๋น๋ํด์ผ ์ฐ๋์ด ์๋ฃ๋ฉ๋๋ค.
์
๋ฐ์ดํธ ์ ์ ์์ฌํญ
์ ๋ฐ์ดํธ๋ฅผ ํ์๋ ๊ฒฝ์ฐ, ๊ธฐ์กด import ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ์์ ์ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ญ์ ํ ๋ค์ import ์์ ์ ์งํํด์ผํฉ๋๋ค.
- hackle-android-sdk-x.x.x
- hackle-android-unity-wrapper-x.x.x
- hackle-sdk-common-x.x.x
- hackle-sdk-core-x.x.x
- ios-arm64_armv7
- ios-arm64_i386_x86_64-simulator
Android SDK ์์กด์ฑ ๊ด๋ฆฌ
Android์์๋ ์๋์ ๊ฐ์ ์์กด์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
Unity SDK๊ฐ Android ํ๊ฒฝ์์ ๋์์ ํ์ง ์๋ ๊ฒฝ์ฐ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์กด์ฌํ๋์ง ํ์ธ์ด ํ์ํฉ๋๋ค.
- hackle-android-sdk-2.12.0
- hackle-android-unity-wrapper-1.5.0
- hackle-sdk-common-2.9.0
- hackle-sdk-core-2.9.0
- core-common
- gson
- kotlin-stdlib
- lifecycle-common
- lifecycle-extensions
- lifecycle-process
- lifecycle-runtime
- okhttp
- okio
2. SDK ์ด๊ธฐํ
SDK๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ ๋ฐ๋์ Hackle์ ์ด๊ธฐํ ํด์ผ ํฉ๋๋ค. Hackle์ ์ด๊ธฐํ ํ๊ธฐ ์ํด SDK ํค๊ฐ ํ์ํฉ๋๋ค.
Hackle์ SDK์ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํ ๋ฉ์๋๋ค์ ์ ๊ณตํ๋ ํด๋์ค์ ๋๋ค.Initialize()๋ฉ์๋์ SDK ํค๋ฅผ ์ ๋ฌํ์ฌ ์ด๊ธฐํํ๊ณ , ์ด๊ธฐํ ์๋ฃ ์๊น์ง ๊ธฐ๋ค๋ฆฌ๊ธฐ ์ํด await๋ฅผ ํฉ๋๋ค.- SDK ํค๋ ํตํด ์๋น์ค์ ๋์๋ณด๋ ์์ ์์นํ SDK ์ฐ๋ ์ ๋ณด์์ ํ์ธํ์ค ์ ์์ต๋๋ค.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HackleInit : MonoBehaviour
{
async void Awake () {
await Hackle.Initialize(YOUR_APP_SDK_KEY);
}
}์ธ์คํด์ค ๊ฐ์ ธ์ค๊ธฐ
์ด๊ธฐํ ์ดํ ์๋ ์ฝ๋๋ฅผ ํตํด Hackle ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
Hackle hackle = Hackle.GetInstance();์ด๊ธฐํ ์ค์ ์ ๋ณด
์ค์ ์ ๋ณด๋ฅผ ํฌํจํ์ฌ SDK๋ฅผ ์ด๊ธฐํ ํ ์ ์์ต๋๋ค.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HackleInit : MonoBehaviour
{
async void Awake () {
HackleConfig config = new HackleConfig.Builder()
.Build();
await Hackle.Initialize("YOUR_APP_SDK_KEY", config: config);
}
}๋ชจ๋ ์ค์ ์ต์
์ค์ | ๊ธฐ๋ฅ | ๊ธฐ๋ณธ๊ฐ | ์ง์ ๋ฒ์ |
|---|---|---|---|
ExposureEventDedupIntervalMillis | ๋์ผํ ์ฌ์ฉ์๊ฐ ์ฐ์์ผ๋ก ๋ฐ์์ํจ ๋์ผํ A/B ํ ์คํธ, ๊ธฐ๋ฅํ๋๊ทธ ๋ถ๋ฐฐ๊ฒฐ๊ณผ์ ๋ํ ๋ ธ์ถ ์ด๋ฒคํธ๋ฅผ ์ ๊ฑฐํฉ๋๋ค. ์ต์๊ฐ: 1000 (1์ด)
| 60000 (1๋ถ) | 1.7.0+ |
Debug | ๋ชจ๋ ๊ธฐ๋ฅ์ ๋ํ ๋ก๊ทธ๋ฅผ ์ฝ์์ ์ถ๋ ฅํ๊ณ , ์ด๋ฒคํธ๋ฅผ ์ฆ์ ์ ์กํฉ๋๋ค. | false | 1.7.0+ |
PollingIntervalMillis | ๋์๋ณด๋์์ ์ค์ ํ ์ ๋ณด๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๋ฐ์ดํธ ํ ์ ์์ต๋๋ค. ์ต์๊ฐ : 60000 (60์ด) | -1 | 1.7.0+ |
3. ์ฌ์ฉ์ ์ค์
์ฌ์ฉ์ ์ ๋ณด๋ฅผ SDK์ ์ค์ ํ ์ ์์ต๋๋ค.
์ฌ์ฉ์ ID ์ค์
์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธํ ๊ฒฝ์ฐ, SetUserId๋ฅผ ํธ์ถํด์ ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ID๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
- ๋ก๊ทธ์ธ ์ ํ๋ฒ๋ง ์ค์ ํ๋ฉด ๋ฉ๋๋ค.
- ์ด๋ฏธ ๋ก๊ทธ์ธ์ด ๋์ด์๋ ์ฌ์ฉ์์ ๊ฒฝ์ฐ์๋ ๋ก๊ทธ์ธํ ์ ๋ณด๋ฅผ ํ์ธํ๋ ์์ ์ ํธ์ถํ๋ฉด ๋ฉ๋๋ค.
string userId = ... // ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ ID (ํ์๋ฒํธ, ๋ฉค๋ฒ ID ๋ฑ)
hackle.SetUserId(userId);์ฌ์ฉ์ ์์ฑ ์ค์
์ด๋ฉ์ผ์ฃผ์, ์์น, ๋์ด, ํ์๋ฑ๊ธ๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ์ฌ์ฉ์ ์์ฑ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
PropertyOperations operations = new PropertyOperations.Builder()
.Set("age", 42)
.Set("grade", "GOLD")
.Build();
hackle.UpdateUserProperties(operations);์ฌ์ฉ์ ๋ก๊ทธ์์ ์ ์ฌ์ค์
์ฌ์ฉ์๊ฐ ๋ก๊ทธ์์ ํ ๊ฒฝ์ฐ ResetUser๋ฅผ ํธ์ถํ์ฌ ๊ธฐ์กด์ ์ค์ ํ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ๋ฆฌ์
ํ ์ ์์ต๋๋ค. ์๋ ์ ๋ณด๊ฐ ๋ฆฌ์
๋ฉ๋๋ค.
- ์ฌ์ฉ์ ID
- ์ฌ์ฉ์ ์์ฑ
hackle.ResetUser();4. ์ด๋ฒคํธ ์ ์ก
์ฌ์ฉ์๊ฐ ์ํํ๋ ํ๋์ ์ด๋ฒคํธ๋ก ์ ์กํ ์ ์์ต๋๋ค. ์ ์ก๋ ์ด๋ฒคํธ๋ A/B ํ ์คํธ ๋ถ์, ๋ฐ์ดํฐ ๋ถ์ ๋ฑ์ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ๋ค์ด, ์ฌ์ฉ์๊ฐ ๊ตฌ๋งค๋ผ๋ ํ๋์ ํ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ด๋ฒคํธ๋ฅผ ์ ์กํ ์ ์์ต๋๋ค.
// ์ด๋ฒคํธ ์ ์ก
hackle.Track("purchase")
// ์ด๋ฒคํธ๋ฅผ ์์ฑ๊ณผ ํจ๊ป ์ ์ก
Dictionary<string, object> properties = new Dictionary<string, object>();
properties["amount"] = 4200;
properties["pay_method"] = "CARD";
properties["is_discount"] = false;
properties["product_ids"] = [42, 43];
HackleEvent event = new HackleEvent(
eventKey: "purchase",
properties: properties
);
hackle.Track(event);์ ์กํ ์ด๋ฒคํธ ํ์ธํ๊ธฐ
๋์๋ณด๋ ์ด๋ฒคํธ๊ด๋ฆฌ ๋ฉ๋ด์์ ์ ์กํ ์ด๋ฒคํธ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ฒคํธ ์ ์ก ํ ๋์๋ณด๋์ ํ์๋๊ธฐ๊น์ง ์ผ๋ฐ์ ์ผ๋ก ~60์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค.
5. A/B ํ
์คํธ
์ฌ์ฉ์๋ฅผ ํ
์คํธ ๊ทธ๋ฃน์ผ๋ก ๋ถ๋ฐฐํ๊ณ ๋ถ๋ฐฐ๋ ๊ฒฐ๊ณผ์ ํด๋นํ๋ ๋ก์ง์ ์์ฑํ์ฌ A/B ํ
์คํธ๋ฅผ ๊ตฌํํฉ๋๋ค. variation์ ์คํํค๋ฅผ ์ ๋ฌํ์ฌ ํธ์ถํ๋ฉด ๋ถ๋ฐฐ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํด๋ฐ์ ์ ์์ต๋๋ค.
์คํํค: ๊ฐ A/B ํ ์คํธ๋ณ๋ก ๊ฐ๊ฒ ๋๋ ๊ณ ์ ๋ฒํธ์ ๋๋ค. A/B ํ ์คํธ๋ฅผ ์์ฑํ๋ฉด ์๋์ผ๋ก ๋ฐ๊ธ๋ฉ๋๋ค.
// ์คํ ํค๊ฐ 42์ธ A/B ํ
์คํธ์์ ์ฌ์ฉ์์๊ฒ ๋
ธ์ถํ ํ
์คํธ ๊ทธ๋ฃน์ ๊ฒฐ์ ํฉ๋๋ค.
string variation = hackle.Variation(42);
// ํ ๋น๋ฐ์ ๊ทธ๋ฃน์ ๋ํ ๋ก์ง
if (variation == "A") {
// ๊ทธ๋ฃน A ๋ก์ง
} else if (variation == "B") {
// ๊ทธ๋ฃน B ๋ก์ง
}๋ถ๋ฐฐ ๊ฒฐ๊ณผ ํ์ธํ๊ธฐ
๋์๋ณด๋ A/B ํ ์คํธ์ ์์ธํ์ด์ง์ ์ค์๊ฐ ๋ ธ์ถ ํํฉ ํญ์์ ๋ถ๋ฐฐ๋ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ๋ถ๋ฐฐ ํ ๋์๋ณด๋์ ํ์๋๊ธฐ๊น์ง ์ผ๋ฐ์ ์ผ๋ก ~60์ด๊ฐ ๊ฑธ๋ฆฝ๋๋ค.
6. ๊ธฐ๋ฅ ํ๋๊ทธ
๊ธฐ๋ฅ ํ๋๊ทธ๋ ์ผ์ง(on) ์ํ์ ๊บผ์ง(off) ์ํ๊ฐ ์์ต๋๋ค. ์ํ์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ก์ง์ ์์ฑํ์ฌ ๊ธฐ๋ฅ ํ๋๊ทธ๋ฅผ ๊ตฌํํฉ๋๋ค. isFeatureOn์ ๊ธฐ๋ฅํ๋๊ทธํค๋ฅผ ์ ๋ฌํ์ฌ ํธ์ถํ๋ฉด on/off ์ฌ๋ถ๋ฅผ ๋ฆฌํด๋ฐ์ ์ ์์ต๋๋ค.
๊ธฐ๋ฅํ๋๊ทธํค: ๊ฐ ๊ธฐ๋ฅํ๋๊ทธ๋ณ๋ก ๊ฐ๊ฒ ๋๋ ๊ณ ์ ๋ฒํธ์ ๋๋ค. ๊ธฐ๋ฅํ๋๊ทธ๋ฅผ ์์ฑํ๋ฉด ์๋์ผ๋ก ๋ฐ๊ธ๋ฉ๋๋ค.
Unity EditorUnity SDK๋ Android, iOS SDK๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํฉ๋๋ค.
๋ฐ๋ผ์, Unity Editor์์๋ ๊บผ์ง(off)์ํ์ธ false๋ฅผ ๋ฆฌํดํฉ๋๋ค.
// ๊ธฐ๋ฅ ํค๊ฐ 42์ธ ๊ธฐ๋ฅ ํ๋๊ทธ์์ ์ฌ์ฉ์์ ์ํ๋ฅผ ๊ฒฐ์ ํฉ๋๋ค.
// ๊ฒฐ์ ํ์ง ๋ชปํ๋ ์ํฉ์ธ ๊ฒฝ์ฐ false(๊บผ์ง ์ํ)๋ฅผ ๋ฐํํฉ๋๋ค.
bool isFeatureOn = hackle.IsFeatureOn(42);
if (isFeatureOn) {
// ON ๊ธฐ๋ฅ
} else {
// OFF ๊ธฐ๋ฅ
}Updated 9 days ago
