Unity SDK - SKAdNetwork 및 ATT 지원

문서

SKAdNetwork 지원

SKAdNetwork는 iOS 앱 인스톨 캠페인을 위한 Apple의 개인정보 보호 중심 어트리뷰션 프레임워크입니다. Unity SDK 버전 4.0.17부터 SKAdNetwork는 관리 모드에서 기본적으로 활성화되며, 대시보드에서 구성된 전환 모델에 따라 Singular가 전환 값을 자동으로 업데이트합니다.

추가 구성이 필요하지 않습니다: 최신 Unity SDK를 사용하는 경우 SKAdNetwork가 즉시 작동합니다. 기본 기능을 위해 코드를 변경하거나 추가 설정이 필요하지 않습니다.

SKAN 모드 이해

관리 모드(기본값)

관리 모드에서는 대시보드에서 구성한 전환 모델에 따라 Singular가 자동으로 전환 값 업데이트를 처리합니다. 최소한의 코드가 필요하고 최적의 전환 추적을 제공하므로 대부분의 앱에 권장되는 방식입니다.

  • 자동 업데이트: Singular는 사용자 이벤트 및 구성된 모델을 기반으로 모든 전환 값 업데이트를 관리합니다.
  • 대시보드 구성: 코드 변경 없이 Singular 대시보드에서 전환 모델을 디자인할 수 있습니다.
  • 최적화: Apple의 제약 조건 내에서 전환 가치 업데이트를 극대화하는 Singular의 전문 지식을 활용하세요.

수동 모드(고급)

수동 모드에서는 전환 값 업데이트를 완벽하게 제어할 수 있으며, SKAN 전환 값 업데이트 시기와 방법을 결정하기 위한 사용자 지정 로직을 구현할 수 있습니다. 관리 모드로는 충족할 수 없는 특정 요구 사항이 있는 경우에만 이 모드를 사용하세요.

고급 기능: 수동 모드를 사용하려면 전환 값 업데이트 기간 및 제한 사항 등 Apple의 SKAdNetwork 제약 조건을 신중하게 구현하고 이해해야 합니다. 대부분의 앱은 관리 모드를 사용해야 합니다.

레거시 SDK 버전

4.0.17 이전 버전의 Unity SDK를 사용하는 경우 다음 방법 중 하나를 사용하여 수동으로 SKAdNetwork 지원을 활성화해야 합니다.

이전 SDK 버전에서 SKAdNetwork 활성화하기
#

방법 1: Unity 인스펙터 구성

  1. Unity 계층 구조에서 SingularSDKObject를 선택합니다.
  2. 인스펙터 창에서 SKANEnabled프로퍼티를 찾습니다.
  3. SKANEnabled를 True로 설정합니다.
  4. 씬을 저장하고 프로젝트를 다시 빌드합니다.

방법 2: 프로그래밍 방식 등록

이벤트를 추적하기 전에 앱 초기화 코드에서 등록 메서드를 호출합니다.

C#
using UnityEngine;
using Singular;

public class AppInitializer : MonoBehaviour
{
    void Awake()
    {
        // Register for SKAdNetwork attribution
        SingularSDK.SkanRegisterAppForAdNetworkAttribution();
    }
}

권장 사항 최신 Unity SDK 버전으로 업그레이드하여 SKAdNetwork 자동 활성화와 최신 기능 및 버그 수정의 이점을 활용하세요.

수동 모드 구성

커스텀 전환 값 로직을 구현하려면 수동 모드를 활성화하고 제공된 SDK 방법을 사용하여 앱의 수명 주기 동안 전환 값을 업데이트하고 모니터링하세요.

수동 모드에서 SKAdNetwork 사용 (고급)
#

수동 모드 활성화

  1. Unity 계층 구조에서 SingularSDKObject를 선택합니다.
  2. 인스펙터 창에서 manualSKANConversionManagement 프로퍼티를 찾습니다.
  3. manualSKANConversionManagement를 True로 설정합니다.

전환 값 업데이트

이 방법을 사용하면 사용자 지정 로직에 따라 SKAdNetwork 전환 값을 수동으로 업데이트할 수 있습니다. 전환 값은 0에서 63 사이의 정수여야 합니다.

중요: 이 방법은 manualSKANConversionManagement 이 True로 설정된 경우에만 작동합니다. 관리 모드가 활성화된 경우 수동 업데이트는 무시됩니다.

서명

C#
public static bool SkanUpdateConversionValue(int value)

사용 예

C#
using UnityEngine;
using Singular;

public class ConversionTracker : MonoBehaviour
{
    void OnUserSignUp()
    {
        // Track the sign-up event
        SingularSDK.Event("SignUp");

        // Update SKAN conversion value to 7
        bool success = SingularSDK.SkanUpdateConversionValue(7);

        if (success)
        {
            Debug.Log("Conversion value updated successfully");
        }
        else
        {
            Debug.LogWarning("Failed to update conversion value");
        }
    }

    void OnPurchaseComplete(float purchaseAmount)
    {
        // Track revenue event
        SingularSDK.Revenue("USD", purchaseAmount);

        // Update conversion value based on purchase tier
        int conversionValue = CalculateConversionValue(purchaseAmount);
        SingularSDK.SkanUpdateConversionValue(conversionValue);
    }

    int CalculateConversionValue(float amount)
    {
        // Your custom logic to determine conversion value
        if (amount >= 100) return 63;      // High value
        if (amount >= 50) return 40;       // Medium value
        if (amount >= 10) return 20;       // Low value
        return 10;                          // Minimal value
    }
}

현재 전환 값 가져오기

Singular SDK에서 추적한 현재 전환 값을 가져옵니다. 현재 상태를 기반으로 조건부 로직을 구현할 때 유용합니다.

서명

C#
public static int? SkanGetConversionValue()

사용 예시

C#
using UnityEngine;
using Singular;

public class ConversionMonitor : MonoBehaviour
{
    void CheckConversionValue()
    {
        int? currentValue = SingularSDK.SkanGetConversionValue();

        if (currentValue.HasValue)
        {
            Debug.Log($"Current conversion value: {currentValue.Value}");

            // Only update if current value is below threshold
            if (currentValue.Value < 30)
            {
                SingularSDK.SkanUpdateConversionValue(30);
            }
        }
        else
        {
            Debug.LogWarning("Conversion value not available");
        }
    }
}

전환 값 업데이트 모니터링

전환 값이 변경될 때마다 실시간 알림을 받도록 핸들러를 설정하세요. 이를 통해 전환 값 업데이트 및 로그 분석에 대응하거나 다른 앱 동작을 트리거할 수 있습니다.

서명

C#
public static void SetConversionValueUpdatedHandler(SingularConversionValueUpdatedHandler handler)

사용 예시

C#
using UnityEngine;
using Singular;

public class ConversionValueMonitor : MonoBehaviour, SingularConversionValueUpdatedHandler
{
    void Awake()
    {
        // Register this class as the conversion value update handler
        SingularSDK.SetConversionValueUpdatedHandler(this);
    }

    // This method is called whenever the conversion value is updated
    public void OnConversionValueUpdated(int newValue)
    {
        Debug.Log($"Conversion value updated to: {newValue}");

        // Log the update to your analytics
        LogConversionValueUpdate(newValue);

        // Trigger any app-specific behavior
        if (newValue >= 50)
        {
            UnlockPremiumFeature();
        }
    }

    void LogConversionValueUpdate(int value)
    {
        // Your analytics logging logic
        Debug.Log($"Analytics: SKAN CV = {value}");
    }

    void UnlockPremiumFeature()
    {
        // Your custom logic
        Debug.Log("Premium feature unlocked based on high conversion value");
    }
}

모범 사례: 전환 값 핸들러를 사용하여 앱 전체에서 현재 전환 상태에 대한 동기화된 보기를 유지합니다. 이는 사용자 지정 로직을 디버깅하고 올바르게 작동하는지 확인하는 데 특히 유용합니다.


앱 추적 투명성(ATT) 지원

ATT(앱 추적 투명성)는 디바이스의 IDFA(광고주 식별자)에 액세스하고 사용자 데이터를 공유하기 전에 사용자 동의를 요구하는 Apple의 개인정보 보호 프레임워크입니다. iOS 어트리뷰션과 사용자 획득 캠페인의 정확도를 극대화하기 위해서는 ATT를 올바르게 구현하는 것이 중요합니다.

어트리뷰션에 ATT가 중요한 이유

iOS 14.5부터 앱은 IDFA에 액세스하기 전에 ATT 프레임워크를 통해 사용자 권한을 요청해야 합니다. IDFA 없이도 핑거프린팅과 확률적 방법을 사용하여 어트리뷰션이 가능하지만, IDFA를 사용하면 어트리뷰션 정확도가 크게 향상되고 결정론적 매칭을 제공할 수 있습니다.

  • 결정론적 어트리뷰션: IDFA는 광고 노출을 인스톨로 직접 연결하는 정밀한 디바이스 수준의 어트리뷰션을 가능하게 합니다.
  • 애드 네트워크 최적화: 애드 네트워크는 IDFA 액세스를 통해 캠페인을 더 잘 최적화하고 더 정확한 리포팅을 제공할 수 있습니다.
  • 사용자 수준 인사이트: IDFA에 액세스하면 보다 세분화된 사용자 행동 분석 및 코호트 추적이 가능합니다.

권장 사항: Singular는 ATT 프롬프트를 구현하고 사용자 동의를 요청할 것을 강력히 권장합니다. 사용자에게 혜택(맞춤화된 광고, 더 나은 앱 경험)을 설명하여 옵트인 비율을 극대화하세요.

SDK 초기화 타이밍

ATT 프롬프트와 관련된 SDK 초기화 타이밍은 매우 중요합니다. 사용자가 ATT 프롬프트에 응답하기 전에 SDK가 초기화되어 첫 세션을 전송하면, IDFA가 캡처되지 않아 어트리뷰션 정확도가 떨어집니다.

초기화를 지연하는 이유는 무엇인가요?

기본적으로 Singular SDK는 초기화 즉시 세션을 전송합니다. 이 세션이 새 기기에서 발생하면 해당 시점에 사용 가능한 데이터만을 사용하여 Singular의 어트리뷰션 프로세스를 트리거합니다. 사용자가 아직 ATT 프롬프트에 응답하지 않은 경우, IDFA를 사용할 수 없으며 어트리뷰션은 덜 정확한 방법을 기반으로 합니다.

중요: Singular SDK가 첫 번째 세션을 전송하기 전에 항상 ATT 동의를 요청하고 IDFA를 검색하세요. 그렇게 하지 않으면 해당 디바이스의 어트리뷰션 데이터에 대한 IDFA가 영구적으로 손실됩니다.

SDK 대기 시간 설정

waitForTrackingAuthorizationWithTimeoutInterval 속성을 설정하여 초기화하기 전에 사용자의 ATT 응답을 기다리도록 SDK를 구성합니다. 이 지연 시간은 사용자가 ATT 프롬프트에 응답할 시간을 제공하면서 프롬프트가 표시되지 않는 경우 무기한 지연을 방지합니다.

구성 단계

  1. Unity 계층 구조에서 SingularSDKObject를 선택합니다.
  2. 인스펙터 창에서 waitForTrackingAuthorizationWithTimeoutInterval프로퍼티를 찾습니다.
  3. ATT 구현에 따라 값을 설정합니다:
    • ATT 프롬프트 표시: 300(5분)으로 설정
    • ATT 프롬프트 표시 안 함: 0으로그대로 두기(대기하지 않음)

권장 값: 앱에 ATT 프롬프트가 표시되는 경우 시간 제한을 300초(5분)로 설정합니다. 이렇게 하면 프롬프트가 지연되거나 표시되지 않을 경우 사용자 환경이 저하되지 않고 사용자가 프롬프트를 보고 응답할 수 있는 충분한 시간을 확보할 수 있습니다.

구현 예

다음은 적절한 SDK 초기화 타이밍으로 Unity 앱에서 ATT를 구현하는 방법입니다.

C#
using UnityEngine;
using Singular;

#if UNITY_IOS
using Unity.Advertisement.IosSupport;
#endif

public class ATTManager : MonoBehaviour
{
    void Start()
    {
#if UNITY_IOS
        // Check ATT status on iOS
        RequestTrackingAuthorization();
#else
        // Initialize SDK immediately on non-iOS platforms
        InitializeSingularSDK();
#endif
    }

#if UNITY_IOS
    void RequestTrackingAuthorization()
    {
        // Check current authorization status
        var status = ATTrackingStatusBinding.GetAuthorizationTrackingStatus();

        if (status == ATTrackingStatusBinding.AuthorizationTrackingStatus.NOT_DETERMINED)
        {
            // Request authorization if not yet determined
            ATTrackingStatusBinding.RequestAuthorizationTracking(OnATTResponse);
        }
        else
        {
            // Status already determined, initialize SDK
            InitializeSingularSDK();
        }
    }

    void OnATTResponse(int status)
    {
        // Log the user's response
        switch (status)
        {
            case (int)ATTrackingStatusBinding.AuthorizationTrackingStatus.AUTHORIZED:
                Debug.Log("User authorized tracking - IDFA will be available");
                break;
            case (int)ATTrackingStatusBinding.AuthorizationTrackingStatus.DENIED:
                Debug.Log("User denied tracking - IDFA not available");
                break;
            case (int)ATTrackingStatusBinding.AuthorizationTrackingStatus.RESTRICTED:
                Debug.Log("Tracking restricted by device settings");
                break;
            default:
                Debug.Log("ATT status unknown");
                break;
        }

        // Initialize SDK after receiving response
        InitializeSingularSDK();
    }
#endif

    void InitializeSingularSDK()
    {
        // SDK is initialized with waitForTrackingAuthorizationWithTimeoutInterval
        // configured in the Inspector, so it will wait for ATT if needed
        // If Initialize On Awake is disabled, manually initialize here
        // SingularSDK.InitializeSingularSDK();

        Debug.Log("Singular SDK initialized");
    }
}

ATT 모범 사례

  • 사전 프롬프트 메시지: 사용자에게 추적 권한이 필요한 이유와 이를 통해 얻을 수 있는 이점(더 나은 광고, 향상된 경험)을 설명하는 사전 ATT 화면을 표시하세요. 이를 통해 옵트인 비율을 크게 높일 수 있습니다.
  • 타이밍이 중요합니다: 앱을 처음 실행할 때 바로 표시하지 말고 앱 흐름의 자연스러운 순간에 ATT 프롬프트를 표시하세요. 사용자가 앱을 먼저 경험하게 하세요.
  • 사용자 지정 메시지: NSUserTrackingUsageDescription 키를 사용하여 Info.plist 파일에서 ATT 프롬프트 메시지를 사용자 지정하여 추적 목적을 명확하게 설명하세요.
  • 철저하게 테스트하세요: 승인 및 거부 시나리오를 모두 테스트하여 사용자의 선택에 관계없이 앱이 올바르게 작동하는지 확인하세요.
  • 사용자의 선택권을 존중하세요: 추적을 거부한 사용자에게 반복적으로 메시지를 표시하거나 옵트인하도록 압력을 가하는 공격적인 메시지를 표시하지 마세요.

앱 스토어 검토: ATT를 제대로 구현하지 않거나 프레임워크를 우회하려고 시도하는 앱은 App Store 검토 과정에서 거부될 수 있습니다. 구현이 Apple의 가이드라인을 따르고 사용자의 개인정보 보호 선택권을 존중하는지 확인하세요.

추가 리소스