Unity SDK - データプライバシー

ドキュメント

データプライバシー法の遵守

GDPR、CCPA、その他の消費者プライバシー規制に対するユーザーの同意の選択肢をSingularに通知することで、プライバシーに準拠したデータ収集を実施する。

ユーザーが第三者との情報共有に同意または拒否する場合は、Singularのプライバシー保護方法を使用してユーザーの選択を伝えます。これにより、カリフォルニア州消費者プライバシー法(CCPA)などの規制への準拠が保証され、パートナーはユーザーのプライバシー設定を尊重することができます。

詳細はこちら:Singularがプライバシーの同意をどのように処理するかについての詳細は、ユーザーのプライバシーとデータ共有の制限をご覧ください。


データ共有の制限

サードパーティデータ共有の管理

LimitDataSharing メソッドを使用して、ユーザーが個人データをサードパーティパートナーと共有することに同意したかどうかをSingularに通知します。

メソッドの署名

SingularSDK.LimitDataSharing(bool shouldLimitDataSharing)

パラメータ

  • false:ユーザーがオプトインし、データ共有に同意している。
  • true:ユーザーはオプトアウトしており、データの共有に同意していない。

重要:オプションですが、このメソッドはアトリビューションデータの共有に影響します。一部のパートナーは、ユーザーがオプトインしたことを明示的に通知した場合にのみ、完全なアトリビューション情報を共有します。

使用例

C#
using UnityEngine;
using Singular;

public class PrivacyManager : MonoBehaviour
{
    // User has opted in to share their data
    public void OnUserOptedInToDataSharing()
    {
        SingularSDK.LimitDataSharing(false);
        Debug.Log("Data sharing enabled");
    }

    // User has opted out and declined to share their data
    public void OnUserOptedOutOfDataSharing()
    {
        SingularSDK.LimitDataSharing(true);
        Debug.Log("Data sharing limited");
    }

    // Example: Set based on user preference
    public void HandlePrivacyConsent(bool userConsented)
    {
        // Pass inverse: false = opted in, true = opted out
        SingularSDK.LimitDataSharing(!userConsented);

        Debug.Log($"Data sharing: {(userConsented ? "Enabled" : "Limited")}");
    }
}

使用方法

Singularはこの設定をユーザープライバシーポストバックで使用し、規制遵守のために必要なパートナーに渡します。


GDPRコンプライアンスの方法

GDPR(一般データ保護規則)やその他のプライバシー規制に準拠するために、ユーザーのトラッキング同意を管理し、SDKの機能を制御します。

トラッキング同意管理

トラッキングオプトイン

GDPRオプトインイベントをSingularサーバーに送信することで、トラッキングに対する明示的なユーザーの同意を記録します。

メソッドの署名

SingularSDK.TrackingOptIn()

いつ使用するか

  • GDPRコンプライアンス:GDPR規制地域でユーザーがトラッキングに明示的に同意した場合に呼び出します。
  • 同意の記録:ユーザーがSingularのシステムでGDPRに同意したことを記録します。
  • デフォルトの動作:この呼び出しがない場合、SDKはトラッキングを継続しますが、特に同意を記録しません。
C#
using UnityEngine;
using Singular;

public class GDPRManager : MonoBehaviour
{
    // User accepted tracking consent
    public void OnUserAcceptedTracking()
    {
        SingularSDK.TrackingOptIn();
        Debug.Log("User opted in to tracking");
    }

    // Example: Call after consent dialog
    public void ShowGDPRConsentDialog()
    {
        // Your consent dialog UI logic here
        // ...

        // If user accepts:
        OnUserAcceptedTracking();
    }
}

トラッキングコントロールメソッド

StopAllTracking(全トラッキング停止

このデバイス上の現在のユーザーに対するすべてのSDKトラッキング活動を完全に無効にします。

メソッドの署名

SingularSDK.StopAllTracking()

重大な警告:このメソッドは、ResumeAllTracking() が呼び出されるまで、SDKを永久に無効にします。無効化された状態はアプリの再起動後も持続し、プログラムでのみ元に戻すことができます。

動作

  • 即時効果:すべてのトラッキング、イベントレポート、データ収集を即座に停止します。
  • 永続的な状態:アプリを終了し、再度起動しても無効のままです。
  • 自動リセットなし:再有効化するには、明示的にResumeAllTracking()
C#
using UnityEngine;
using Singular;

public class TrackingController : MonoBehaviour
{
    // User declined all tracking
    public void OnUserDeclinedTracking()
    {
        SingularSDK.StopAllTracking();
        Debug.Log("All tracking stopped");

        // Optionally store preference
        PlayerPrefs.SetInt("tracking_enabled", 0);
        PlayerPrefs.Save();
    }

    // Example: Handle user opt-out from settings menu
    public void HandlePrivacySettingsChange(bool trackingEnabled)
    {
        if (!trackingEnabled)
        {
            SingularSDK.StopAllTracking();
            Debug.Log("Privacy settings: Tracking disabled");
        }
    }
}

すべてのトラッキングを再開

StopAllTracking() で停止したトラッキングを再度有効にします。

メソッドの署名

SingularSDK.ResumeAllTracking()

使用例

  • 同意の変更:ユーザーがプライバシー設定を変更し、トラッキングを再開する。
  • プライバシー設定:ユーザーがアプリの設定メニューから同意を更新
  • 地域コンプライアンス:ユーザーが非規制地域に移動した場合、トラッキングを再度有効にする
C#
using UnityEngine;
using Singular;

public class TrackingController : MonoBehaviour
{
    // User opted back in to tracking
    public void OnUserResumedTracking()
    {
        SingularSDK.ResumeAllTracking();
        Debug.Log("Tracking resumed");

        // Optionally update stored preference
        PlayerPrefs.SetInt("tracking_enabled", 1);
        PlayerPrefs.Save();
    }

    // Example: Handle consent update from settings
    public void HandlePrivacySettingsChange(bool trackingEnabled)
    {
        if (trackingEnabled)
        {
            SingularSDK.ResumeAllTracking();
            Debug.Log("Privacy settings: Tracking enabled");
        }
    }
}

IsAllTrackingStopped

現在のユーザーに対してトラッキングが無効化されているかどうかを確認します。

メソッドの署名

bool SingularSDK.IsAllTrackingStopped()

戻り値

  • true:トラッキングは現在StopAllTracking()
  • false:追跡が有効(停止または再開されていない
C#
using UnityEngine;
using UnityEngine.UI;
using Singular;

public class PrivacySettingsUI : MonoBehaviour
{
    public Toggle trackingToggle;
    public Text statusText;

    void Start()
    {
        // Check current tracking status on startup
        UpdatePrivacyUI();
    }

    // Check current tracking status
    public bool IsTrackingEnabled()
    {
        return !SingularSDK.IsAllTrackingStopped();
    }

    // Example: Display privacy status in settings
    public string GetPrivacyStatusText()
    {
        if (SingularSDK.IsAllTrackingStopped())
        {
            return "Tracking: Disabled";
        }
        else
        {
            return "Tracking: Enabled";
        }
    }

    // Example: Sync UI with tracking state
    public void UpdatePrivacyUI()
    {
        bool isStopped = SingularSDK.IsAllTrackingStopped();

        if (trackingToggle != null)
        {
            trackingToggle.isOn = !isStopped;
        }

        if (statusText != null)
        {
            statusText.text = GetPrivacyStatusText();
        }

        Debug.Log($"Current tracking state: {(isStopped ? "Stopped" : "Active")}");
    }

    // Handle toggle change from UI
    public void OnTrackingToggleChanged(bool enabled)
    {
        if (enabled)
        {
            SingularSDK.ResumeAllTracking();
        }
        else
        {
            SingularSDK.StopAllTracking();
        }

        UpdatePrivacyUI();
    }
}

子供のプライバシー保護

TrackingUnder13

COPPA(児童オンラインプライバシー保護法)およびその他の児童プライバシー規制に準拠するため、ユーザーが13歳未満であることをSingularに通知します。

メソッドの署名

SingularSDK.TrackingUnder13()

コンプライアンス要件

  • COPPA準拠:米国で13歳未満の子供からデータを収集するアプリに必要です。
  • 年齢制限コンテンツ:登録時または年齢確認時に、ユーザーが13歳未満であることを確認した場合に使用。
  • 制限付きトラッキング:子どものプライバシー保護法に準拠するため、データ収集を制限します。
C#
using UnityEngine;
using Singular;

public class COPPAManager : MonoBehaviour
{
    // User identified as under 13
    public void OnUserUnder13()
    {
        SingularSDK.TrackingUnder13();
        Debug.Log("COPPA mode enabled for user under 13");
    }
    
    // Example: Call after age verification
    public void OnAgeVerified(int userAge)
    {
        if (userAge < 13)
        {
            SingularSDK.TrackingUnder13();
            Debug.Log("COPPA restrictions applied");
            
            // Also limit advertising identifiers
            SingularSDK.SetLimitAdvertisingIdentifiers(true);
        }
    }
}

重要:ユーザーが13歳未満であると判断した後、できるだけ早い段階でこのメソッドを呼び出します。理想的には、アプリの初期化中または年齢認証の直後です。こうすることで、その後のすべてのトラッキングが、子どものプライバシーに関する規制を尊重するようになります。


SetLimitAdvertisingIdentifiers(広告識別子の制限

混合オーディエンスアプリのSDK初期化後に、広告識別子(AndroidではGAID、iOSではIDFA)の収集と使用を制限します。

メソッドのシグネチャ

SingularSDK.SetLimitAdvertisingIdentifiers(bool isEnabled)

パラメータ

  • true:限定広告識別子モードを有効にする(収集を制限する
  • false:false:限定広告識別子モードを無効にする(通常の収集

使用例

  • 混合オーディエンスアプリ:アプリの起動後に年齢が決定される、大人と子供の両方に対応するアプリ
  • ダイナミックプライバシーコントロール:ユーザーのアクションやアクセスされたコンテンツに基づいてトラッキングを調整します。
  • ランタイムの制限:最初のSDKセットアップ後に広告識別子の制限を適用
C#
using UnityEngine;
using Singular;

public class AdvertisingIdentifierManager : MonoBehaviour
{
    // Limit advertising identifiers after initialization
    public void EnableLimitedMode()
    {
        SingularSDK.SetLimitAdvertisingIdentifiers(true);
        Debug.Log("Advertising identifiers limited");
    }
    
    // Example: Mixed audience app with age gate
    public void OnKidsModeSwitched(bool isKidsMode)
    {
        if (isKidsMode)
        {
            SingularSDK.SetLimitAdvertisingIdentifiers(true);
            Debug.Log("Advertising identifiers limited for kids mode");
        }
        else
        {
            SingularSDK.SetLimitAdvertisingIdentifiers(false);
            Debug.Log("Advertising identifiers unrestricted for adult mode");
        }
    }
    
    // Example: Content-based restrictions
    public void OnViewingChildrensContent()
    {
        SingularSDK.SetLimitAdvertisingIdentifiers(true);
        Debug.Log("Ad identifiers restricted for children's content");
    }
    
    // Example: Combined with TrackingUnder13
    public void OnAgeVerified(int age)
    {
        if (age < 13)
        {
            SingularSDK.TrackingUnder13();
            SingularSDK.SetLimitAdvertisingIdentifiers(true);
            Debug.Log("Full COPPA restrictions applied");
        }
    }
}

コンフィギュレーションの代替:SDKの開始前にプライバシー要件がわかっている場合は、Singular SDKのコンフィギュレーションでlimitAdvertisingIdentifiers プロパティを設定することで、SDKの初期化中に広告識別子を制限することもできます。

設定プロパティ

プライバシー要件を事前に知っているアプリのために、SDK初期化中に広告識別子の制限を設定します。

C#
using UnityEngine;
using Singular;

public class SDKInitializer : MonoBehaviour
{
    void Start()
    {
        // Get reference to SingularSDK component
        var singularSDK = GetComponent<SingularSDK>();
        
        // Limit advertising identifiers at initialization
        singularSDK.limitAdvertisingIdentifiers = true;
        
        // Initialize SDK
        if (!singularSDK.InitializeOnAwake)
        {
            SingularSDK.InitializeSingularSDK();
        }
    }
}

実装のベストプラクティス

完全なプライバシー管理の例

ユーザーの好みを尊重し、規制に準拠した包括的なプライバシー管理を実装します。

C#
using UnityEngine;
using Singular;

public class ComprehensivePrivacyManager : MonoBehaviour
{
    private const string PREF_USER_CONSENT = "privacy_user_consent";
    private const string PREF_DATA_SHARING = "privacy_data_sharing";

    void Start()
    {
        // Initialize privacy settings on app start
        InitializePrivacySettings();
    }

    /// <summary>
    /// Initialize privacy settings on app startup based on stored preferences
    /// </summary>
    public void InitializePrivacySettings()
    {
        bool hasUserConsent = GetUserConsent();
        bool allowDataSharing = GetDataSharingPreference();

        // Apply stored tracking preference
        if (hasUserConsent)
        {
            SingularSDK.TrackingOptIn();
            SingularSDK.ResumeAllTracking();
            Debug.Log("Privacy initialized: Tracking enabled with consent");
        }
        else
        {
            SingularSDK.StopAllTracking();
            Debug.Log("Privacy initialized: Tracking disabled");
        }

        // Set data sharing preference (inverse logic)
        SingularSDK.LimitDataSharing(!allowDataSharing);

        Debug.Log($"Privacy initialized: consent={hasUserConsent}, sharing={allowDataSharing}");
    }

    /// <summary>
    /// User accepts tracking via consent dialog
    /// </summary>
    public void OnUserAcceptedTracking()
    {
        SaveUserConsent(true);

        SingularSDK.TrackingOptIn();
        SingularSDK.ResumeAllTracking();

        Debug.Log("User accepted tracking");
    }

    /// <summary>
    /// User declines tracking
    /// </summary>
    public void OnUserDeclinedTracking()
    {
        SaveUserConsent(false);

        SingularSDK.StopAllTracking();

        Debug.Log("User declined tracking");
    }

    /// <summary>
    /// User updates data sharing preference
    /// </summary>
    /// <param name="enabled">True to enable data sharing, false to limit it</param>
    public void SetDataSharingEnabled(bool enabled)
    {
        SaveDataSharingPreference(enabled);

        // Note: LimitDataSharing uses inverse logic
        // false = data sharing enabled, true = data sharing limited
        SingularSDK.LimitDataSharing(!enabled);

        Debug.Log($"Data sharing: {(enabled ? "Enabled" : "Limited")}");
    }

    /// <summary>
    /// Check if tracking is currently enabled
    /// </summary>
    /// <returns>True if tracking is active, false if stopped</returns>
    public bool IsTrackingEnabled()
    {
        return !SingularSDK.IsAllTrackingStopped();
    }

    /// <summary>
    /// Get current privacy status as readable text
    /// </summary>
    /// <returns>Human-readable tracking status</returns>
    public string GetPrivacyStatus()
    {
        bool isEnabled = !SingularSDK.IsAllTrackingStopped();
        bool dataSharingEnabled = GetDataSharingPreference();

        return $"Tracking: {(isEnabled ? "Enabled" : "Disabled")}\n" +
               $"Data Sharing: {(dataSharingEnabled ? "Enabled" : "Limited")}";
    }

    // Private helper methods for PlayerPrefs storage

    private bool GetUserConsent()
    {
        return PlayerPrefs.GetInt(PREF_USER_CONSENT, 0) == 1;
    }

    private void SaveUserConsent(bool consent)
    {
        PlayerPrefs.SetInt(PREF_USER_CONSENT, consent ? 1 : 0);
        PlayerPrefs.Save();
    }

    private bool GetDataSharingPreference()
    {
        return PlayerPrefs.GetInt(PREF_DATA_SHARING, 0) == 1;
    }

    private void SaveDataSharingPreference(bool enabled)
    {
        PlayerPrefs.SetInt(PREF_DATA_SHARING, enabled ? 1 : 0);
        PlayerPrefs.Save();
    }
}

ベストプラクティス

  • 永続ストレージ:PlayerPrefsまたは安全なストレージソリューションを使用してユーザー設定を保存します。
  • 早期の初期化:可能であれば、SDKの初期化前にプライバシー設定を適用する。
  • UIの同期: IsAllTrackingStopped()を使用して、設定 UI を実際の SDK の状態と同期させます。
  • 明確なコミュニケーション:アプリの設定で明確でアクセスしやすいプライバシーコントロールを提供する。
  • 逆ロジック: LimitDataSharing(false) はデータ共有が有効であることを意味し、true制限されていることを意味する。
  • コンプライアンスの文書化:ユーザーがいつ、どのように同意を提供し、または取り消したかの記録を保持する。