[UPDATED] Unity SDK 연동 가이드

 

필요 사항: SDK 전제 조건

Singular SDK 연동하기: 계획 방법과 전제 조건에 제시된 단계들을 따릅니다.

다음 단계들은 모든 Singular SDK 연동들에 대한 전제 조건들입니다.

1. SDK 인스톨

1.1. Android 설정

  1. AndroidManifest.xml 파일에, 다음 퍼미션을 추가합니다.

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
  2. Singular SDK에서 transitive dependencies를 비활성화했다면, 다음을 앱의 build.gradle에 추가합니다.

    implementation 'com.android.installreferrer:installreferrer:2.2'
    implementation 'com.google.android.gms:play-services-appset:16.0.0'
  3. Singular SDK는 Google Play Services APIs 17.0.0+의 부분이기도한 Google Mobile Ads API 를 필요로 합니다. 이미 Google Play Services를 앱에 연동했다면, 필수 조건은 충족된 것입니다. 연동하지 않았다면, 다음 디펜던시를 앱의 build.gradle file에 추가하여 개별적으로 Google Mobile Ads를 연동할 수 있습니다.

    implementation 'com.google.android.gms:play-services-ads-identifier:17.0.0+'

    더 자세한 정보는, Google의 Google Play Services 설정 가이드를 참조합니다.

Android 설정 (프로가드와 이클립스 - Proguard and Eclipse)

프로가드 또는 이클립스를 활용하여 Android를 설정하는 방법에 대해 알아봅니다. ▼

프로가드로 빌드하는 경우라면, 다음 코드를 proguard-unity.txt 파일에 추가합니다.

-keep class com.singular.sdk.** { *; }
-keep public class com.android.installreferrer.** { *; }
-keep public class com.singular.unitybridge.** { *; }

이클립스로 빌드하는 경우라면, 다음 메서드 중 하나를 활용하여 AAR 를 이클립스 프로젝트에 연동합니다.

  1. singular_sdk-9.x.x.aar의 압축을 풉니다.
  2. classes.jarsingular_sdk-9.x.x.jar로 변경합니다. (이것이 주요 SDK jar입니다).
  3. 상단의 jar를 연동하고 libs/installreferrer-release.jar (Google 레퍼러 API 라이브러리) 를 원하는 방식으로 이클립스 프로젝트에 연동합니다.
  4. AAR에 포함된 AndroidManifest.xml 로부터 BIND_GET_INSTALL_REFERRER_SERVICE 퍼미션을  AndroidManifest.xml 로 복사합니다.

1.2. iOS에 관한 설정

다음 라이브러리/프레임워크를 Unity XCode 프로젝트에 연결합니다.

  • Security.framework
  • SystemConfiguration.framework
  • iAD.framework
  • AdSupport.framework
  • WebKit.framework
  • libsqlite3.0.tbd
  • libz.tbd
  • StoreKit.framework
  • AdServices.framework (반드시 추가되어야 하나, 이는 iOS 14.3 이상의 디바이스에서만 제공되므로 선택사항입니다)

1.3. SDK 패키지 다운로드 및 임포트

  1. 시작하려면, SDK unitypackage 파일을 다운로드 합니다.
  2. Assets > Import Package > Custom package를 통해 unitypackage를 앱으로 임포트합니다.
  3. Unity 플랫폼에서:

    1. 오브젝트를 Main 씬으로 추가하고 SingularSDKObject를 호출합니다.
    2. SingularSDK를 드래그하여 스크립트에 드롭합니다.
    3. 인스펙션 페인(inspection pane)에서, Singular SDK Key와 SDK Secret를 붙여넣습니다. (반환을 위해서는, Singular 계정으로 로그인하여 Developer Tools > SDK Keys로 이동합니다).

2. 기본 SDK 연동 설정

2.1. SKAdNetwork 활용

Unity SDK 버전 4.0.16부터, SKAdNetwork가 기본으로 활성화됩니다. 이는 Managed Mode에서 활성화됩니다. (Singular 대시보드에서 선택한 컨버전 모델을 활용한 SKAN 컨버전 값을 업데이트합니다.)

최신 SDK를 사용하고 있다면, 추가 설정이나 SKAdNetwork 코드를 추가할 필요가 없습니다.

추가 정보

이전 SDK 버전에서 SKAdNetwork 활성화

이전 SDK 버전을 사용 중이라면, 다음 방식 중 하나를 택하여 SKAdNetwork를 활성화할 필요가 있습니다.

  • SingularSDKObject로 이동하여 SKANEnabledTrue로 설정합니다.
  • 앱 코드에서 SingularSDK.SkanRegisterAppForAdNetworkAttribution()를 호출합니다.
Manual Mode에서 SKAdNetwork 사용 (고급)

SKAN 컨버전 값을 고유한 로직을 통해 수동으로 관리하려면, 다음을 실행합니다.

  • SingularSDKObject 로 이동하여 manualSKANConversionManagement 를 True로 설정합니다.
  • 코드에서 다음 메서드들을 통해 설정하고 컨버전 코드를 가져옵니다.  
SingularSDK.SkanUpdateConversionValue 메서드 
설명

SKAdNetwork 컨버전 값을 업데이트합니다.

참고: SKAdNetwork 컨버전 값을 수동으로 업데이트하려면 이 메서드를 사용합니다. 이 메서드는 manualSKANConversionManagementTrue로 설정한 경우에만 동작합니다.

표시 public void SkanUpdateConversionValue(int value)
활용 예시
// 회원가입 이벤트가 발생
Singular.Event("SignUp");

// 컨버전 값을 7로 업데이트
SingularSDK.SkanUpdateConversionValue(7);
SingularSDK.SkanGetConversionValue 메서드 
설명 Singular SDK에 의해 추적된 현 컨버전 값을 GET 합니다.
표시 public int? SkanGetConversionValue()
활용 예시 
int? value = SingularSDK.SkanGetConversionValue();
SingularSDK.SetConversionValueUpdatedHandler 메서드 
설명 컨버전 값이 업데이트되었을 때 알림을 받도록 핸들러를 설정합니다.
표시 public void SetConversionValueUpdatedHandler(SingularConversionValueUpdatedHandler handler)
활용 예시 
public class Main : MonoBehaviour, SingularConversionValueUpdatedHandler {
  void Awake() {
    SingularSDK.SetConversionValueUpdatedHandler(this);
  }

  void OnConversionValueUpdated(int value) {
    // Use the conversion value
  }
}

2.2. ATT 동의 처리 (초기화 지연 설정)

ATT (App Tracking Transparency) 프롬프트 표시

iOS 버전 14.5 부로, 디바이스 IDFA를 포함하여, 추적에 필요한 정보들을 공유하는 데 있어 앱에 접근하기 전 반드시 유저에게 동의를 구해야 합니다. (앱 추적 투명성 프레임워크 사용) 

Singular에게 있어 IDFA 확보는 디바이스를 인식하고 인스톨 어트리뷰션을 수행하는데 매우 유용합니다. (IDFA 없이도 어트리뷰션을 수행하는 방법이 있지만 말입니다). 그러므로 유저로부터 IDFA 확보에 대한 동의를 얻는 것을 권장합니다. 

ATT 응답에 대기하도록 초기화를 지연

기본 설정으로, Singular SDK는 초기화가 될 때 유저 세션을 전송합니다. 한 세션이 신규 디바이스로부터 전송되면, 이는 곧바로 Singular의 어트리뷰션 과정을 발생시키며 - 이 작업은 Singular에 데이터가 제공된 순간을 기반으로 수행됩니다. 그러므로, Singular SDK가 첫 세션을 보내기 전에 동의를 구하여 IDFA를 가져오는 것은 매우 중요합니다.  

유저 세션 발생을 지연하기 위해서는, SingularSDKObjectwaitForTrackingAuthorizationWithTimeoutInterval 옵션을 설정합니다. 이는 최대 시간(초)를 설정하여 Singular SDK가 이벤트를 Singular 서버에 로깅하기 전 유저가 앱 추적 투명성 동의를 승낙/거절할 수 있도록 대기하게 합니다. 이 옵션에 대한 기본 설정은 0(기다리지 않음) 입니다.  

2.3. 딥 링크 처리 

딥 링크는 앱 내 특정 내용으로 인도하는 링크입니다. 유저가 앱이 인스톨 된 디바이스에서 딥 링크를 클릭하면, 앱이 오픈되어 특정 제품이나 경험을 보여줍니다.  

Singular 트래킹 링크는 딥 링크와 디퍼드 딥 링크를 포함할 수 있습니다. (자세한 내용은 딥 링크 FAQ와 Singular 링크 FAQ를 참고.)

하단의 가이드는 다음을 수행하는 법에 관해 설명합니다:

  1. 앱이 오픈되도록 트래킹 링크에 접근
  2. 딥 링크 데스티네이션 읽기
  3. 올바른 내용을 표시

참고:

  • 이 문서는 고객의 Singular 링크 - 2019년에 출시한 Singular의 신규 트래킹 링크 기술 - 을 사용을 가정합니다. 기존의 Singular 고객들은 이전에 출시한 Singular 트래킹 링크(레거시 링크)를 사용할 수 있습니다. 레거시 링크로 딥 링크 작동을 지원하려면, 레거시 링크로 딥 링킹 처리 문서를 참고합니다.
  • 앱의 딥 링크 데스티네이션은 Singular Apps 페이지에서 설정합니다. (어트리뷰션 추적을 위한 앱 설정을 참고).

딥 링크 필수 항목 설정

  1. iOS 와 Android 필수 항목: Singular 링크 필수항목의 iOS 또는 Android에 대한 가이드를 따릅니다.

  2. Unity에 대한 추가 설정: 앱의 AndroidManifest.xml 파일에서, 기본 설정 UnityPlayerActivity에서 활동명 프로퍼티를 변경합니다. (예시, <activity android:name= "net.singular.unitysdk.UnityPlayerActivity">) 를 SingularUnityActivity로 변경:

    <activity android:name="com.singular.unitybridge.SingularUnityActivity">

    고유한 커스텀 동작을 구현했다면, 해당 동작 내 onNewIntent에서 이 메서드를 호출합니다.  

    @Override
    protected void onNewIntent(Intent intent) {
        setIntent(intent);
    
        // Call this method from your custom activity in onNewIntent
        SingularUnityBridge.onNewIntent(intent);
    }

딥 링크 핸들러 추가

Singular SDK는 앱이 오픈되도록 트래킹 링크의 상세 내용을 읽는 핸들러 메커니즘을 제공합니다.

핸들러를 사용하려면 다음을 수행합니다.

  1. SingularLinkHandler 인터페이스를 구현.
  2. 임의의 시점에서 SetSingularLinkHandler 메서드를 호출하여 딥 링크에 대한 핸들러로써 해당 클래스를 등록합니다. 
  3. SetSingularLinkHandler를 호출할 때, Singular SDK는 트래킹 링크를 가져오고 OnSingularLinkResolved 메서드를 호출하는데, 이는 트래킹 링크의 상세 사항을 전달합니다. 링크 상세 사항을 읽고 처리하려면 이 메서드를 오버라이드합니다.

다음 샘플 코드는 세 가지 단계를 나타냅니다:

public class Main : SingularLinkHandler {
    // ...
    void Awake () {
      // Register the class as the Singular Link handler.
      // You can call this method at any point in the app's run. It will fetch the tracking link details and call OnSingularLnkResolved.
      SingularSDK.SetSingularLinkHandler(this);
    }
    
    public void OnSingularLinkResolved(SingularLinkParams linkParams) {
      // The deep link destination, as configured in the Manage Links page
      string deeplink = linkParams.Deeplink;
      
      // The passthrough parameters added to the link, if any.
      string passthrough = linkParams.Passthrough;
      
      // Whether the link configured as a deferred deep link.
      bool isLinkDeferred = linkParams.IsDeferred;
      
      // Add code here to process the deeplink
    }
    
    // ...

메서드 레퍼런스

SetSingularLinkHandler 메서드
SetSingularLinkHandler 메서드
설명 앱을 오픈하는 트래킹 링크의 세부 사항을 반환하는 핸들러를 등록
표시
public void SetSingularLinkHandler(SingularLinkHandler 
handler)
활용 예시
public class Main : MonoBehaviour, SingularLinkHandler {
    void Awake () {
        SingularSDK.SetSingularLinkHandler(this)
    }
}
OnSingularLinkResolved 메서드
OnSingularLinkResolved 메서드
설명 SetSingularLinkHandler에 대한 콜백 메서드. 트래킹 링크의 상세 내용을 읽고 처리. 
표시
public void OnSingularLinkResolved(SingularLinkParams
linkParams)

참고: SingularLinkParams 오브젝트는 다음 값들을 포함합니다:

    • Deeplink - 딥 링크 데스티네이션, Singular 플랫폼의 Manage Links 페이지에 설정한 딥 링크 데스티네이션.
  • Passthrough - 링크에 추가된 패스 스루 파라미터. (존재하는 경우)
  • IsDeferred - 해당 링크가 디퍼드 딥링크로써 설정되었는지의 여부.
활용 예시 
public void OnSingularLinkResolved(SingularLinkParams
linkParams){ // Read the tracking link details and log them Debug.Log("deeplink: " + linkParams.Deeplink); Debug.Log("passthrough: " + linkParams.Passthrough); Debug.Log("is_deferred: " + linkParams.IsDeferred); }

레거시 링크를 통해 딥 링크 다루기

기존 Singular 고객인 경우, 신규 Singular 링크 대신 레거시 트래킹 링크를 사용하고 있을 수 있습니다. (싱귤러의 이전 트래킹 링크 매커니즘). 레거시 링크는 Create LinkView Links 페이지에서 관리되며, 여기서 딥링킹과 디퍼드 딥링크 기능이 제공됩니다.   

레거시 링크를 사용하는 기업의 경우, 딥링크를 위해 상단에 언급된 SingularLinksHandler 대신 SingularDeferredDeepLinkHandler 라는 핸들러를 구현해야 합니다. 구현 방법은 매우 유사합니다. 

2.4. SDK 초기화

참고: Singular SDK를 구현할 때 지역의 GDPR, CCPA, COPPA와 같은 정책들을 포함하여 프라이버시 정책들을 준수합니다. 자세한 내용은 SDK 옵트 인과 옵트 아웃 프랙티스를 참고합니다. 

SDK 초기화 코드는 앱이 오픈될 때마다 매번 호출되어야 합니다. 이는 Singular 어트리뷰션 기능의 전제 조건이며 유저 리텐션을 계산하는데 사용되는 신규 세션을 Singular에 전송합니다.  

기본 설정으로는, 씬이 생성되었을 때, SingularSDK.cs 는 Awake 메서드를 통해 자동으로 SDK를 초기화합니다. 

수동 초기화

SDK를 앱이 실행되고 더 차후의 시점에 수동으로 초기화하고 싶다면 다음을 수행합니다.

  1. SingularSDK 오브젝트의 인스펙션 패인에서 Initialize on Awake 메서드를 비활성화합니다.
  2. SingularSDK.InitializeSingularSDK 정적 메서드를 통해 SDK를 초기화합니다.
SingularSDK.InitializeSingularSDK 메서드
설명 Awake에서 초기화되지 않았다면 Singular SDK를 초기화.
표시
public void InitializeSingularSDK()
활용 예시
// SDK Key and SDK Secret are set on the 
// game object associated with SingularSDK SingularSDK.InitializeSingularSDK();

쓰레드 보호에 관한 참고: Singular Unity SDK는 항상 동일한 쓰레드에서 호출되며, 이는 다른 Unity 메서드를 호출하는 방식과 동일합니다.

2.5. 선택 사항: 세션 타임아웃 설정

기본 설정으로, 포어 그라운드에 반환되기 전 60초 이상 앱이 백그라운드에서 작동할 경우, Singular SDK는 신규 세션을 등록합니다. 이 기본 타임 아웃 값은 SingularSDKObject의 Session Timeout Sec 프로퍼티를 변경하여 변경할 수 있습니다. 

2.6. 선택 사항: 유저 ID 설정

Singular SDK는 앱에서 유저 ID를 Singular로 전송할 수 있습니다. 유저 ID는 유저 명(user name), 이메일 주소, 임의로 생성된 문자열, 또는 어떤 식별자든 될 수 있습니다. Singular는 유저 레벨 데이터 추출의 유저 ID와 내부 BI 포스트 백을 사용합니다. (설정하는 경우)

유저 ID를 Singular에 전송하려면, SetCustomUserId 메서드를 호출합니다. 해당 ID 설정을 언셋하려면, (예를 들어, 유저가 계정을 로그한 경우), UnsetCustomUserId를 호출합니다.

참고:

  • 유저 ID는 UnsetCustomUserId를 호출하여 설정을 해지하거나 앱이 언인스톨될 때까지 남습니다. 앱을 닫거나 재시작하는 것으로는 유저 ID가 언셋되지 않습니다.
  • 앱이 오픈될 때 유저 ID가 이미 제공되도록 했고 Singular로부터도 첫 세션 부터 제공되게 하려면, Singular SDK 초기화 작업 전에 이를 설정하세요. 
SingularSDK.SetCustomUserId 메서드 
설명 유저 ID를 Singular에 전송
표시
public void SetCustomUserId(string customUserId)
사용 예시
SingularSDK.SetCustomUserId("custom_user_id");
SingularSDK.UnsetCustomUserId 메서드  
설명 마지막 CustomUserId 호출에서 Singular에 전달된 유저 ID를 언셋.
표시
public void UnsetCustomUserId()
활용 예시
SingularSDK.UnsetCustomUserId();

3. 이벤트 추적과 매출

3.1. 이벤트 추적

Singular는 캠페인에 대한 퍼포먼스를 분석하고 KPI를 측정하는데 도움이 되는 인 앱 이벤트들에 대한 데이터를 수집합니다. 예를 들어, 유저 로그인, 회원 가입, 튜토리얼 완료, 게임 앱의 레벨업에 대한 데이터를 수집하고 싶은 경우 도움이 됩니다. 

Singular는 여러 스텐더드 이벤트들을 지원합니다. 이 이벤트들은 보고와 최적화를 위해 매체에서 일반적으로 지원되는 공통적인 이벤트들입니다. 스텐더드 명 사용의 또 다른 장점은, 이벤트들을 수동으로 설정하지 않아도 Singular가 해당 이벤트들을 자동으로 인식하여 Events 리스트에 추가한다는 점입니다. Signular에서는 가능한 스텐더드 이벤트 사용을 권장합니다. 

고객의 UA/마케팅/비즈니스 팀은 마케팅 KPI들에 기반한 이벤트들의 목록을 Singular에 (관련 어트리뷰트들과 함께) 전달해야 합니다. 비즈니스 팀은 인 앱 이벤트 추적방법: Singular 어트리뷰션 고객을 위한 가이드를 대로 따라도 됩니다.

추적하는 각 이벤트와 함께, 여러 어트리뷰트들을 전달할 수 있습니다. 이벤트 당 권장 스텐더드 어트리뷰트를 참고합니다.

코드에서, 이벤트 또는 eventWithArgs 메서드를 사용하여 Singular에 스텐더드 이벤트들을 전송합니다.

참고: 스텐더드 이벤트의 경우, 이벤트의 Unity 명은 스텐더드 이벤트와 어트리뷰트의 Unity SDK 목록에 명시된 대로의 이름을 사용합니다. 예시, sngLogin.

커스텀 이벤트에 대해, 측정하고 싶은 이벤트가 Singular 스텐더드 이벤트와 맞는 이벤트가 없다면, 커스텀 명(최대 32자)을 사용합니다. 해당 명은 최적화를 목적으로 광고 매체가 Singular로부터 받는 이벤트의 호환성을 위해 영어 사용을 권장합니다.  

SingularSDK.Event 메서드
설명 추적을 위해 유저 이벤트들을 Singular에 전송
표시
public static void Event(string name)
public static void Event(string name, params object[] args)
public static void Event(Dictionary<string, object> args,
string name)

참고: 딕셔너리와 딕셔너리 값을 전송할 때 반드시 다음 유형 중 하나를 포함해야 합니다: string, int, long, float, double, null, ArrayList, Dictionary<String,object>

활용 예시   

// Send the standard event Login
SingularSDK.Event(sngLogin);
  
// An example custom event passing two key value pairs
SingularSDK.Event("Myevent", "Key1", "Value1", "Key2", 1234);
// An example JSONEvent passing a dictionary SingularSDK.Event(new Dictionary<string, object>() { {"Key1", "Value1"}, {"Key2", new Dictionary<string, object>() { {"SubKey1", "SubValue1"}, {"SubKey2", "SubValue2"} } }}, "JSONEvent");

3.2. 매출 추적

Singular는 퍼포먼스와 캠페인의 ROI 분석을 위해 앱을 통해 얻은 매출 데이터를 수집할 수 있습니다. Singular는 이 데이터들을 리포트, 로그 추출, 포스트 백에 제공합니다.

참고: 다른 통화로 보고되는 매출은 Singular 계정에 설정한 통화대로 자동 환전됩니다. 

Unity의 빌트-인 IAP (In-App Purchases) 오브젝트를 사용하여 매출 이벤트를 추적할 수 있습니다. 이를 통해, Singular는 더 풍부한 보고를 위한 구매 관련 정보들을 획득할 수 있습니다. Singular는 또한 구매 영수증을 획득할 수 있는데, 이는 Singular가 백엔드에서 구매를 검증하고 어트리뷰션 프러드를 제외하는 데 사용합니다.  

SingularSDK.InAppPurchase 메서드
설명 구매 이벤트 추적을 위해 IAP 제품을 Singular에 전송
표시
public static void InAppPurchase(Product product,
Dictionary<string, object> attributes, bool isRestored = false)
public static void InAppPurchase(string eventName,
Product product, Dictionary<string, object> attributes,
bool isRestored = false)
public static void InAppPurchase(IEnumerable<Product> products, Dictionary<string, object> attributes, bool isRestored = false)
public static void InAppPurchase(string eventName,
IEnumerable<Product> products, Dictionary<string, object>
attributes, bool isRestored = false)

참고:

  • product: product는 IAP: UnityEngine.Purchasing.Product로부터 수신한 프로덕트 오브젝트입니다. 
  • attributes: 본 파라미터는 Singular에 추가 정보를 전달하는데 사용하는 파라미터입니다. 전달할 어트리뷰트가 없다면, null을 전달합니다.
  • isRestored: 거래가 복구되었는지를 나타냅니다. 기본 설정: false.
활용 예시
// IAP with a single product and no extra attributes
SingularSDK.InAppPurchase(myProduct, null);
// IAP with a single product and attributes
var attr = new Dictionary<string, object>() {
["my_first_attribute"] = "value1",
["my_second_attribute"] = "value2"};
 
SingularSDK.InAppPurchase(myProduct, attr);

// IAP with with a single product, 
// no extra attributes and a custom event name

SingularSDK.InAppPurchase("MyCustomProduct",
myProduct, null);

// IAP with list of products, no extra attributes
SingularSDK.InAppPurchase(myProductList, null);

// IAP with with list of products, no extra attributes
// and a custom event name

SingularSDK.InAppPurchase("MyCustomProducts",
myProductList, null);
매출을 추적하는 다른 방법: 매출과 CustomRevenue 메서드

Unity IAP를 사용할 수 없는 경우, Singular SDK는 "수동으로" 구매에 관한 정보를 Singular에 전달하는 두 메서드를 제공합니다. 

  • Revenue를 통해 구매에 관한 통화, 거래량, 선택 사항의 상세 내용을 Singular에 전달할 수 있습니다.
  • CustomRevenue도 유사하며, 이벤트의 커스텀 명 또한 제공합니다. 

참고: InAppPurchase 대신 Revenue/CustomRevenue를 사용하는 경우, 구매 영수증을 검증할 수 없습니다.

SingularSDK.Revenue 메서드
설명 Singular에 매출 이벤트 전송
표시
public static void Revenue(string currency, double amount)

public static void Revenue(string currency,
double amount, string productSKU, string productName,
string productCategory, int productQuantity, double productPrice)
참고: 통화는 "USD", "EUR", "INR"와 같은 세 자릿수 ISO 4217 통화 코드로 전달합니다. 

활용

예시   

// Send a revenue event with no product details
SingularSDK.Revenue("USD", 9.99);

// Send a revenue event with product details
SingularSDK.Revenue("USD", 50.50, "abc123", "myProductName", 
"myProductCategory", 2, 25.50)
SingularSDK.CustomRevenue 메서드
설명 Singular에 커스텀 명과 매출 이벤트 전송 
표시
public static void CustomRevenue(string eventName, 
string currency, double amount) public static void CustomRevenue(string eventName,
string currency, double amount, string productSKU,
string productName, string productCategory, int productQuantity,
double productPrice)
참고: 통화는 "USD", "EUR", "INR"와 같은 세 자릿수 ISO 4217 통화 코드로 전달합니다. 
활용 예시     
// Send a revenue event with a custom name
SingularSDK.CustomRevenue("MyCustomRevenue", "USD", 9.99);

// Send a revenue event with a custom name + product details
SingularSDK.CustomRevenue("MyCustomRevenue", "USD", 50.50, 
"abc123", "myProductName", "myProductCategory", 2, 25.50)

4. 고급 옵션

4.1. 짧은 레퍼러 링크 생성

참고: 이 기능은 SDK 버전 4.0.16 이상에서 사용할 수 있습니다.

Short Links를 통해 파라미터가 채워진 긴 Singular 링크를 짧게 전환하는 데 사용합니다. 링크가 짧을수록 보안을 더 잘 유지할 수 있으며, 더 편리하게 공유할 수 있습니다.

일반적으로, 짧은 동적 링크를 생성하여 앱 유저들이 친구들과 공유하여 앱을 사용할 수 있게 합니다. 

짧은 링크를 생성하려면, 다음 작업이 필요합니다.

  • 앱 다운로드를 유도하는 Singular 링크 생성 (Singular 링크 FAQ 참고)
  • 링크에 동적으로 추가하고 싶은 모든 파라미터를 추가 (옵션 목록에 대한 내용은 트래킹 링크 파라미터를 참고)
  • 리퍼링 유저의 이름과 ID (신규 앱 인스톨을 공유한 유저를 추적하고 싶은 경우).  

createReferrerShortLink 메서드를 통해 하단의 예시처럼 짧은 링크를 생성합니다.

void callback(string shortLinkURL, string error){
    // Add your share logic here if shortLinkURL is not null
    // If there was an error, add logic to retry/abort/modify the params
// passed to the function, based on the cause of the error } SingularSDK.createReferrerShortLink( "https://sample.sng.link/B4tbm/v8fp?_dl=https%3A%2F%2Fabc.com", "John Doe", // Referrer Name "342", // Referrer ID new Dictionary<string, string>() { // a Dictionary object containing any parameters you want to add {"channel", "sms"} }, callback );

4.2. 광고 매출 어트리뷰션 서포트를 추가

참고: 3.0.0 버전 부로, Singular는 Singular SDK를 통해 광고 매출 어트리뷰션을 설정하는 옵션을 추가했습니다.

광고 매출 어트리뷰션은 앱에 Singular SDK를 업데이트하지 않고도 API 호출을 통해 이전의 방법으로도 설정할 수 있습니다. 하지만, SKAdNetwork 캠페인에 대한 광고 매출을 측정하려면, SDK를 통한 광고 매출 어트리뷰션 설정해야 합니다.  

Singular SDK에서 광고 매출 어트리뷰션 지원을 추가하려면, 다음 단계를 따릅니다:

  1. 미설정 시, Singular 고객 성공 매니저에게 연락하여 계정에 광고 매출 어트리뷰션 활성화를 요청합니다. 
  2. 가장 최신 Singular SDK 버전으로 업데이트합니다.
  3. 광고 매출 데이터 사용에 대한 중개 플랫폼에 기반한 Singular SDK 연동에 올바른 코드 스니핏을 추가합니다.
AdMob AppLovin MAX IronSource 이외 (일반)
// 참고: 이는 베타 기능입니다. Admob을 활성화하려면 문의합니다.

RewardedAd rewardedAd;
public void HandleRewardedAdLoaded(object sender, EventArgs args)
{
this.rewardedAd = args.rewardedAd;
}

AdValue impressionData;
private void HandleAdPaidEvent(object sender, AdValueEventArgs args)
{
this.impressionData = args.AdValue;

SingularAdData data = new SingularAdData("Admob", impressionData.CurrencyCode, impressionData.Value/1000000f);

data.WithNetworkName(this.rewardedAd.GetResponseInfo().GetMediationAdapterClassName());

Singular.AdRevenue(data);
}

참고: 통화는 "USD", "EUR", "INR"와 같은 세 자릿수 ISO 4217 통화 코드로 전달합니다.

4.3. 언인스톨 추적

참고: 언인스톨 추적은 엔터프라이즈 고객에게만 제공됩니다. 

Android 언인스톨 추적

Android 앱에 대해 언인스톨 추적을 활성화하려면, 우선 언인스톨 추적 설정에 설명된 대로 Singular 플랫폼 내 앱을 설정합니다. 그다음 하단의 가이드를 따릅니다.

참고: Google은 2018년 4월부로 GCM API 지원을 중단했습니다. 언인스톨 추적을 위해서는 FCM를 사용합니다.

Firebase Cloud Messaging (FCM)를 통한 언인스톨 추적 활성화:

1. FCM과 연동:

언인스톨을 추적하기 위해서, Firebase Cloud Messaging (FCM) 플랫폼의 서비스를 사용할 수 있습니다. 아직 FCM을 사용하지 않고 있다면, 어떻게 안드로이드 고객 앱에서 Firebase Cloud Messaging 사용하는지 Google의 가이드를 따라 작업합니다.

FCM 필수 항목 (소스)

FCM 고객 Google Play Store 앱이 인스톨된 Android 4.1 이상의 디바이스 또는 Google API와 함께 Android 4.1을 실행하는 에뮬레이터가 요구됩니다. 참고할 점으로, 반드시 Google Play Store를 통해 Android 앱을 배포하지 않아도 됩니다.

Android에서 지원되는 버전을 사용하지 않는 유저/디바이스들의 Singular 언인스톨 추적은 불가합니다. 

2. AndroidManifest.xml 파일 업데이트:

앱에서 필요한 인텐트 필터를 추가하려면 AndroidManifest.xml 파일을 업데이트합니다.   (MyFirebaseMessagingService를 Firebase Service를 구현한 클래스와 교체):

<service android:name=".java.MyFirebaseMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter> </service> <service android:name=".java.MyFirebaseMessagingService" android:exported="false"> intent-filter> action android:name="com.google.firebase.MESSAGING_EVENT" /> </intent-filter> </service>

3. FCM 디바이스 토큰을 등록 및 전송:

FCM 토큰을 가져온 후, 'RegisterTokenForUninstall' 메서드에 파라미터를 전달합니다 :

SingularSDK.RegisterTokenForUninstall(String fcmDeviceToken);

'RegisterTokenForUninstall' 메서드는 반드시 'SingularSDK.InitializeSingularSDK()' 메서드 전에 호출되어야 합니다.

iOS 언인스톨 추적

iOS 언인스톨 추적은 Apple push 알림 기술에 기반합니다. 보유한 앱이 push 알림을 지원하지 않는다면, Apple 가이드를 참고합니다. 앱이 push 알림을 이미 지원하는 경우, SDK가 초기화된 후, RegisterTokenForUninstall 메서드를 통해 디바이스 토큰이 APNS로부터 반환되게 합니다. 

SingularSDK.RegisterTokenForUninstall 메서드
설명 APNS로부터 반환된 디바이스 토큰을 전달합니다. APNS 토큰은 일반적으로 네이티브 형식의 이진법 데이터이지만, 문자열로 전달해야 합니다. 
표시
public static void RegisterTokenForUninstall
(string APNSToken)
활용 예시
// APNS 토큰을 hex-string으로 전달
  SingularSDK.RegisterTokenForUninstall("ba85ab31a7c7
f5c2f012587f29fb0e596d4b67e7b7b2838fa1a8582c1f7dbdee");

4.4. 글로벌 프로퍼티 추가

Singular SDK는 커스텀 추가 프로퍼티를 정의하게 하여 앱에서 매 세션과 매 이벤트가 앱에서 발생할 때마다 Singular 서버에 전송하게 합니다. 이 프로퍼티는 앱 모드나 상태와 같은 유저와 연관된 어떠한 정보든 의미할 수 있습니다. 이 프로퍼티를 설정하면, 이들은 리포트에 디멘션으로 제공되며 데이터를 나눌 때 사용할 수 있습니다. 

예를 들어, 게임 앱을 보유하고 있다면, "Level"이라는 프로퍼티를 정의할 수 있고 최초를 "0"으로 설정할 수 있습니다. 앱에서 전송되는 모든 세션과 이벤트는 "Level": "0"로 전송됩니다. 유저가 레벨 업을 하면 프로퍼티를 "1"로 리셋하는  형식입니다. 이후, 이를 세션, 이벤트 카운트, 매출 데이터와 같이 유저레벨에 따라 나누어 리포트에 가져올 수 있습니다.  

  • 최대 5건의 글로벌 프로퍼티를 설정할 수 있습니다.
  • 설정을 해제하거나 사용자가 앱을 언인스톨할 때까지 앱 실행 동안 (제공한 최신 값 포함) 유지됩니다.
  • 각 프로퍼티 명과 값은 최대 200자 입니다. 프로퍼티 명이나 값이 이보다 길면, 200자에서 끝이 잘립니다.  
  • 글로벌 프로퍼티는 유저 레벨 추출포스트 백에서 접근할 수 있습니다. 차후, 집계 보고 지원이 추가됩니다. 글로벌 프로퍼티 지원에 관한 업데이트에 관심이 있거나 궁금한 사항이 있다면 Singular 고객 성공 매니저에게 문의합니다.

초기화 전 글로벌 프로퍼티 설정

SingularSDK를 통해 글로벌 프로퍼티를 설정하기 위해 SDK를 초기화하기 전에 SetGlobalProperty 메서드를 사용할 수 있습니다. 글로벌 프로퍼티가 세션에 포함되게 하려면 'Initialize On awake' 플래그 작동을 중단하세요.

참고: 글로벌 프로퍼티와 신규 값은 앱이 작동하는 사이에도 잔존하므로, 설정하려는 프로퍼티가 이미 다른 값으로 설정되었을 수 있습니다. overrideExisting 파라미터를 사용하여 SDK가 신규 값과 기존 프로퍼티를 오버라이드 하는지 알 수 있습니다. 

초기화 후 글로벌 프로퍼티 설정

다음 메서드를 사용하여 앱이 실행되고 있는 도중 언제든 글로벌 프로퍼티를 설정, 언셋, 반환합니다.  

SingularSDK.SetGlobalProperty 메서드
설명

글로벌 프로퍼티를 주어진 값으로 설정

참고:

  • 한 프로퍼티를 아직 생성하지 않은 상태에서 이미 글로벌 프로퍼티가 5개 존재하는 경우, 해당 프로퍼티는 추가되지 않습니다. 
  • 특정 프로퍼티가 아직 설정되지 않은 상태에서, overrideExisting 파라미터는 기존 값을 오버라이드 할 것인지를 결정합니다.
  • 메서드가 true를 반환하면 프로퍼티가 성공적으로 설정된 것이며, false를 반환하면 설정이 성공적이지 않음을 의미합니다. 
표시 public static bool SetGlobalProperty(string key, string value, bool overrideExisting)
활용 예시  
bool result = SingularSDK.SetGlobalProperty("key", "value", false);
SingularSDK.GetGlobalProperties 메서드
설명 모든 글로벌 프로퍼티와 현재 값을 Map으로 반환
표시 public static Dictionary<string, string> GetGlobalProperties()
활용 예시 
Dictionary<string, string> props = SingularSDK.GetGlobalProperties();
SingularSDK.UnsetGlobalProperty 메서드
설명 글로벌 프로퍼티를 제거
표시 public static void UnsetGlobalProperty(string key)
활용 예시 
SingularSDK.UnsetGlobalProperty(“test_key”);
SingularSDK.ClearGlobalProperties 메서드
설명 모든 글로벌 프로퍼티를 제거
표시 public static void ClearGlobalProperties()
활용 예시 
SingularSDK.clearGlobalProperties();

4.5. 구형 Android 디바이스의 인스톨 레퍼러 수집

Android 에서, install referrer 는 Singular가 프러드 시도를 감지하고 분석하는데 도움이 될 뿐만 아니라 Singular에게 있어 어트리뷰션을 결정하는데 가장 중요한 툴입니다. 이는 Google Play Store가 제공한 식별자로, 앱을 인스톨 하기전 유저가 클릭한 광고를 나타냅니다.  

최신 Google Play Store 버전을 보유한 디바이스들에서, Singular SDK는 인스톨 레퍼러 값을 자동으로 수집합니다. (Singular는 최신 Google Play 레퍼러 API와 연동되어있기 때문입니다).

구형 디바이스들에서 인스톨 레퍼러를 수집하려면, Android SDK 가이드의 지시사항을 따릅니다.

5. 데이터 프라이버시 정책을 준수

5.1. LimitDataSharing

Singular는 프라이버시를 준수하는 기능을 제공하여 GDPR과 CCPA (California Consumer Privacy Act)와 같은 소비자 프라이버시 법을 준수하는 매체들과 원활히 협업하는데 도움을 드리고 있습니다. 파트너들은 유저가 개인 정보를 공유하는 것에 동의했는지 알림을 받고 싶어합니다.   

유저에게 유저 정보를 공유에 동의하는지 묻도록 구현했다면, LimitDataSharing 메서드를 사용하여 Singular에게도 유저의 선택에 대해 알립니다.

  • 유저가 정보 공유에 동의했는지(옵트 인)에 대해서는 SingularSDK.LimitDataSharing(false)를 사용합니다.
  • 유저가 정보 공유에 동의하지 않았는지에 대해서는 SingularSDK.LimitDataSharing(true)를 사용합니다.

Singular는 관련 정책들을 준수하기 위해 요청하는 파트너들에게 이 정보를 전달합니다. 

참고: 이 메서드의 사용은 선택사항이나, 유저가 옵트인을 한 경우에만 특별히 파트너가 Singular에 공유하는 어트리뷰션 정보가 있을 수 있습니다.  

SingularSDK.LimitDataSharing 메서드
표시 SingularSDK.LimitDataSharing(bool shouldLimitDataSharing)
설명 개인 정보 공유에 대한 유저 동의(옵트 인) 여부를 Singular에게 알림 
활용 예시 
// 유저가 데이터 공유에 옵트인 한 경우
SingularSDK.LimitDataSharing(false);

5.2. GDPR 준수를 위한 추가적인 메서드

Singular SDK는 GDPR 정책에 준수하는데 도움이 되기 위한 몇 가지 메서드를 제공하며, 이를 통해 Singular는 유저가 추적에 동의했는지 하지 않았는지 대해 알 수 있습니다. 

SingularSDK.TrackingOptIn 메서드
설명 유저가 추적에 동의했는지(옵트 인)에 대해 Singular에게 알림 
활용 예시
SingularSDK.TrackingOptIn();
SingularSDK.StopAllTracking 메서드
설명 앱에서 해당 유저에 대해 모든 추적 활동을 멈춤 
참고: 앱이 재시작 하거나 작동 중이여도, 이 메서드 호출 시  SDK를 효과적으로 비활성화. 다시 추적을 활성화하는 유일한 방법은 resumeAllTracking() 호출
활용 예시
SingularSDK.StopAllTracking();
SingularSDK.ResumeAllTracking 메서드
설명 앱에서 유저에 대한 추적을 지속
활용 예시
SingularSDK.ResumeAllTracking();
SingularSDK.IsAllTrackingStopped 메서드
설명 앱에서 유저에 대한 추적 상황을 체크. StopAllTracking()를 사용하였고 추적이 중지되었다면 true를 반환.

활용

예시      

SingularSDK.IsAllTrackingStopped();