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. Inspectorペインで、SKANEnabledプロパティを見つけます。
  3. SKANEnabledTrue に設定します。
  4. シーンを保存し、プロジェクトを再構築します。

方法2:プログラムによる登録

イベントがトラッキングされる前に、アプリの初期化コードで登録メソッドを呼び出します。

C#
using UnityEngine;
using Singular;

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

推奨SKAdNetwork の自動有効化、最新の機能、バグ修正の恩恵を受けるには、Unity SDK の最新バージョンにアップグレードしてください。

マニュアルモードの設定

カスタム変換値ロジックを実装するには、Manual Modeを有効にし、提供されるSDKメソッドを使用して、アプリのライフサイクル全体を通して変換値を更新および監視します。

マニュアルモードでSKAdNetworkを使用する(上級者向け)
#

マニュアルモードを有効にする

  1. Unityのシーン階層でSingularSDKObjectを選択します。
  2. Inspector(インスペクタ)ペインで、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");
    }
}

ベストプラクティスコンバージョン値ハンドラを使用して、アプリ全体で現在のコンバージョン状態の同期ビューを維持します。これは、デバッグやカスタムロジックが正しく動作することを確認するために特に便利です。


App Tracking Transparency(ATT)のサポート

App Tracking Transparency (ATT)は、デバイスのIDFA (Identifier for Advertisers)にアクセスしてユーザーデータを共有する前に、ユーザーの同意を必要とするAppleのプライバシーフレームワークです。ATTを正しく実装することは、iOSのアトリビューションとユーザー獲得キャンペーンの精度を最大化するために非常に重要です。

ATTがアトリビューションに重要な理由

iOS 14.5以降、アプリはIDFAにアクセスする前に、ATTフレームワークを通じてユーザーの許可を要求する必要があります。IDFAがなくてもフィンガープリンティングや確率的な方法でアトリビューションは可能ですが、IDFAがあることでアトリビューションの精度が大幅に向上し、決定論的なマッチングが可能になります。

  • 決定論的アトリビューション:IDFAは、広告インプレッションとインストールを直接結びつける正確なデバイスレベルのアトリビューションを可能にします。
  • 広告ネットワークの最適化:広告ネットワークは、IDFAにアクセスすることで、キャンペーンをより最適化し、より正確なレポートを提供できます。
  • ユーザーレベルのインサイト:IDFAにアクセスすることで、より詳細なユーザー行動分析とコホート追跡が可能になります。

推奨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. Inspector(インスペクタ)ペインで、weatForTracingAuthorizionWithTimeoutIntervalプロパティを見つけます。
  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プロンプトを表示しましょう。 まずはユーザーにアプリを体験してもらいましょう。
  • カスタムメッセージング:Info.plistファイルのATTプロンプトメッセージを、NSUserTrackingUsageDescription キーでカスタマイズし、トラッキングの目的を明確に説明しましょう。
  • 徹底的にテストしてください:許可されたシナリオと拒否されたシナリオの両方をテストし、ユーザーの選択に関係なくアプリが正しく機能することを確認しましょう。
  • ユーザーの選択を尊重してください:トラッキングを拒否したユーザーに対して何度もプロンプトを表示したり、オプトインを迫るような攻撃的なメッセージを表示したりしないでください。

App StoreのレビューATTを適切に実装していないアプリや、フレームワークを回避しようとするアプリは、App Storeの審査で却下される可能性があります。Appleのガイドラインに従って実装し、ユーザーのプライバシーに関する選択を尊重するようにしてください。

その他のリソース