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

ドキュメント

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

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

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

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


データ共有の制限

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

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

メソッドの署名

Singular.limitDataSharing(boolean shouldLimitDataSharing)

パラメータ

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

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

使用例

KotlinJava
// User has opted in to share their data
Singular.limitDataSharing(false)

// User has opted out and declined to share their data
Singular.limitDataSharing(true)

// Example: Set based on user preference
fun handlePrivacyConsent(userConsented: Boolean) {
    // Pass inverse: false = opted in, true = opted out
    Singular.limitDataSharing(!userConsented)
    
    Log.d("Privacy", "Data sharing: ${if (userConsented) "Enabled" else "Limited"}")
}

使用方法

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


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

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

トラッキング同意管理

トラッキング同意

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

メソッドの署名

Singular.trackingOptIn()

いつ使用するか

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

// Example: Call after consent dialog
fun onUserAcceptedTracking() {
    Singular.trackingOptIn()
    Log.d("GDPR", "User opted in to tracking")
}

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

stopAllTracking

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

メソッドのシグネチャ

Singular.stopAllTracking()

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

動作

  • 即時効果:すべてのトラッキング、イベントレポート、データ収集を即座に停止します。
  • 永続的な状態:アプリを終了し、再度起動しても無効のままです。
  • 自動リセットなし:再度有効にするには、resumeAllTracking() を明示的に呼び出す必要があります。
KotlinJava
// User declined all tracking
Singular.stopAllTracking()

// Example: Handle user opt-out
fun onUserDeclinedTracking() {
    Singular.stopAllTracking()
    Log.d("Privacy", "All tracking stopped")
    
    // Optionally store preference
    saveUserTrackingPreference(false)
}

レジュームオールトラッキング

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

メソッドの署名

Singular.resumeAllTracking()

使用例

  • 同意の変更:ユーザーがプライバシー設定を変更し、トラッキングを再開する。
  • プライバシー設定:ユーザーがアプリの設定メニューから同意を更新
  • 地域コンプライアンス:ユーザーが非規制地域に移動した場合、トラッキングを再度有効にする
KotlinJava
// User opted back in to tracking
Singular.resumeAllTracking()

// Example: Handle consent update
fun onUserResumedTracking() {
    Singular.resumeAllTracking()
    Log.d("Privacy", "Tracking resumed")
    
    // Optionally update stored preference
    saveUserTrackingPreference(true)
}

isAllTrackingStopped

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

メソッドのシグネチャ

boolean Singular.isAllTrackingStopped()

戻り値

  • true:現在stopAllTracking()
  • false:追跡が有効(停止または再開されていない
KotlinJava
// Check current tracking status
val isTrackingStopped = Singular.isAllTrackingStopped()

// Example: Display privacy status in settings
fun getPrivacyStatusText(): String {
    return if (Singular.isAllTrackingStopped()) {
        "Tracking: Disabled"
    } else {
        "Tracking: Enabled"
    }
}

// Example: Sync UI with tracking state
fun updatePrivacyToggle() {
    val isStopped = Singular.isAllTrackingStopped()
    privacyToggle.isChecked = !isStopped
    Log.d("Privacy", "Current tracking state: ${if (isStopped) "Stopped" else "Active"}")
}

子供のプライバシー保護

トラッキングアンダー13

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

メソッド署名

Singular.trackingUnder13()

コンプライアンス要件

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

// Example: Call after age verification
fun onAgeVerified(userAge: Int) {
    if (userAge < 13) {
        Singular.trackingUnder13()
        Log.d("Privacy", "COPPA mode enabled for user under 13")
    }
}

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


setLimit広告識別子

混合視聴者向けアプリのSDK初期化後に、広告識別子(AndroidではGAID)の収集と使用を制限します。

メソッドの署名

Singular.setLimitAdvertisingIdentifiers()

ユースケース

  • 混合オーディエンスアプリ:アプリの起動後に年齢が決定される、大人と子供の両方に対応するアプリ
  • ダイナミックプライバシーコントロール:ユーザーのアクションやアクセスするコンテンツに応じてトラッキングを調整
  • ランタイムの制限:最初のSDKセットアップ後に広告識別子の制限を適用
KotlinJava
// Limit advertising identifiers after initialization
Singular.setLimitAdvertisingIdentifiers()

// Example: Mixed audience app with age gate
fun onKidsModeSwitched(isKidsMode: Boolean) {
    if (isKidsMode) {
        Singular.setLimitAdvertisingIdentifiers()
        Log.d("Privacy", "Advertising identifiers limited for kids mode")
    }
}

// Example: Content-based restrictions
fun onViewingChildrensContent() {
    Singular.setLimitAdvertisingIdentifiers()
    Log.d("Privacy", "Ad identifiers restricted for children's content")
}

コンフィギュレーションの代替:SDKの開始前にプライバシー要件がわかっている場合は、SingularConfig.withLimitAdvertisingIdentifiers() を使用してSDK初期化中に広告識別子を制限することもできます。

設定方法

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

KotlinJava
// Limit advertising identifiers at initialization
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
    .withLimitAdvertisingIdentifiers()

Singular.init(applicationContext, config)

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

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

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

KotlinJava
class PrivacyManager(private val context: Context) {
    
    private val prefs = context.getSharedPreferences("privacy_prefs", Context.MODE_PRIVATE)
    
    // Initialize privacy settings on app start
    fun initializePrivacy() {
        val hasUserConsent = getUserConsent()
        val allowDataSharing = getDataSharingPreference()
        val userAge = getUserAge()
        
        // Apply stored preferences
        if (hasUserConsent) {
            Singular.trackingOptIn()
            Singular.resumeAllTracking()
        } else {
            Singular.stopAllTracking()
        }
        
        // Set data sharing preference
        Singular.limitDataSharing(!allowDataSharing)
        
        // Handle children's privacy
        if (userAge > 0 && userAge < 13) {
            Singular.trackingUnder13()
            Singular.setLimitAdvertisingIdentifiers()
        }
        
        Log.d("Privacy", "Initialized: consent=$hasUserConsent, sharing=$allowDataSharing, age=$userAge")
    }
    
    // User accepts tracking via consent dialog
    fun userAcceptedTracking() {
        saveUserConsent(true)
        Singular.trackingOptIn()
        Singular.resumeAllTracking()
        Log.d("Privacy", "User accepted tracking")
    }
    
    // User declines tracking
    fun userDeclinedTracking() {
        saveUserConsent(false)
        Singular.stopAllTracking()
        Log.d("Privacy", "User declined tracking")
    }
    
    // User updates data sharing preference
    fun setDataSharingEnabled(enabled: Boolean) {
        saveDataSharingPreference(enabled)
        // Note: limitDataSharing uses inverse logic
        Singular.limitDataSharing(!enabled)
        Log.d("Privacy", "Data sharing: ${if (enabled) "Enabled" else "Limited"}")
    }
    
    // Handle age verification result
    fun onAgeVerified(age: Int) {
        saveUserAge(age)
        if (age < 13) {
            Singular.trackingUnder13()
            Singular.setLimitAdvertisingIdentifiers()
            Log.d("Privacy", "COPPA restrictions applied for user under 13")
        }
    }
    
    // Get current tracking status
    fun isTrackingEnabled(): Boolean {
        return !Singular.isAllTrackingStopped()
    }
    
    // Private helper methods
    private fun getUserConsent(): Boolean {
        return prefs.getBoolean("user_consent", false)
    }
    
    private fun saveUserConsent(consent: Boolean) {
        prefs.edit().putBoolean("user_consent", consent).apply()
    }
    
    private fun getDataSharingPreference(): Boolean {
        return prefs.getBoolean("data_sharing", false)
    }
    
    private fun saveDataSharingPreference(enabled: Boolean) {
        prefs.edit().putBoolean("data_sharing", enabled).apply()
    }
    
    private fun getUserAge(): Int {
        return prefs.getInt("user_age", 0)
    }
    
    private fun saveUserAge(age: Int) {
        prefs.edit().putInt("user_age", age).apply()
    }
}

ベストプラクティス

  • 永続ストレージ:ユーザー設定をSharedPreferencesまたは安全なストレージに保存する。
  • 早期の初期化:可能であれば、SDKの初期化前にプライバシー設定を適用する。
  • UIの同期: isAllTrackingStopped()を使用して、設定 UI を実際の SDK 状態と同期させます。
  • 明確なコミュニケーション:アプリの設定で明確でアクセスしやすいプライバシーコントロールを提供する。
  • 年齢認証:子供をターゲットにしたアプリには、強固な年齢認証を実装する。
  • 複合的なコントロール:13歳未満のユーザーには、trackingUnder13()setLimitAdvertisingIdentifiers()の両方を適用する。