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

ドキュメント

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

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

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

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


データ共有の制限

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

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

メソッドの署名

cordova.plugins.SingularCordovaSdk.limitDataSharing(
  shouldLimitDataSharing: boolean
): void

パラメータ

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

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

メソッドの完全なドキュメントについては、limitDataSharing リファレンスを参照してください。


使用例

ユーザーのプライバシー設定に基づいて、データ共有の制御を実装します。

JavaScript
document.addEventListener('deviceready', onDeviceReady, false);

function onDeviceReady() {
  // User has opted in to share their data
  var onUserOptedInToDataSharing = function() {
    cordova.plugins.SingularCordovaSdk.limitDataSharing(false);
    console.log('Data sharing enabled');
  };
  
  // User has opted out and declined to share their data
  var onUserOptedOutOfDataSharing = function() {
    cordova.plugins.SingularCordovaSdk.limitDataSharing(true);
    console.log('Data sharing limited');
  };
  
  // Set based on user preference
  var handlePrivacyConsent = function(userConsented) {
    // Pass inverse: false = opted in, true = opted out
    cordova.plugins.SingularCordovaSdk.limitDataSharing(!userConsented);
    
    console.log('Data sharing: ' + (userConsented ? 'Enabled' : 'Limited'));
  };
  
  // Example: Ask user for consent
  askUserForPrivacyConsent(function(consented) {
    handlePrivacyConsent(consented);
  });
}

function askUserForPrivacyConsent(callback) {
  // Show custom dialog to user
  if (confirm('Do you consent to share your data with third parties?')) {
    callback(true);
  } else {
    callback(false);
  }
}

仕組み

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


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

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

トラッキング同意管理

トラッキングオプトイン

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

メソッドの署名

cordova.plugins.SingularCordovaSdk.trackingOptIn(): void

いつ使用するか

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

メソッドの完全なドキュメントについては、trackingOptInリファレンスを参照してください。


実装例

ユーザーがアプリの同意ダイアログを通じてトラッキングの同意を受け入れた後に、trackingOptIn()

JavaScript
document.addEventListener('deviceready', initializeGDPR, false);

function initializeGDPR() {
  checkStoredConsent();
}

function checkStoredConsent() {
  // Check if user has previously provided consent
  var consent = localStorage.getItem('gdpr_consent');
  
  if (consent === null) {
    // No stored preference - show consent dialog
    showGDPRConsentDialog();
  } else if (consent === 'true') {
    // User previously consented - apply setting
    onUserAcceptedTracking();
  }
}

function showGDPRConsentDialog() {
  // Show custom dialog to user
  var message = 'We would like your permission to track app usage and improve your experience.';
  
  if (confirm(message)) {
    onUserAcceptedTracking();
  } else {
    onUserDeclinedTracking();
  }
}

function onUserAcceptedTracking() {
  // Record user consent with Singular
  cordova.plugins.SingularCordovaSdk.trackingOptIn();
  console.log('User opted in to tracking');
  
  // Save preference locally
  localStorage.setItem('gdpr_consent', 'true');
}

function onUserDeclinedTracking() {
  console.log('User declined tracking');
  localStorage.setItem('gdpr_consent', 'false');
}

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

StopAllTracking

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

メソッドの署名

cordova.plugins.SingularCordovaSdk.stopAllTracking(): void

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

動作

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

メソッドの詳細については、stopAllTrackingリファレンスを参照してください。


実装例

ユーザーが同意を拒否した場合、またはプライバシー設定でオプトアウトした場合にトラッキングを停止する。

JavaScript
// User declined all tracking
function onUserDeclinedTracking() {
  cordova.plugins.SingularCordovaSdk.stopAllTracking();
  console.log('All tracking stopped');
  
  // Store preference
  localStorage.setItem('tracking_enabled', 'false');
}

// Handle user opt-out from settings menu
function handlePrivacySettingsChange(trackingEnabled) {
  if (!trackingEnabled) {
    cordova.plugins.SingularCordovaSdk.stopAllTracking();
    console.log('Privacy settings: Tracking disabled');
    localStorage.setItem('tracking_enabled', 'false');
  }
}

再開

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

メソッドの署名

cordova.plugins.SingularCordovaSdk.resumeAllTracking(): void

ユースケース

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

メソッドの完全なドキュメントについては、resumeAllTrackingのリファレンスを参照してください。


実装例

ユーザーがオプトインに戻るか、プライバシー設定を更新したときにトラッキングを再開する。

JavaScript
// User opted back in to tracking
function onUserResumedTracking() {
  cordova.plugins.SingularCordovaSdk.resumeAllTracking();
  console.log('Tracking resumed');
  
  // Update stored preference
  localStorage.setItem('tracking_enabled', 'true');
}

// Handle consent update from settings
function handlePrivacySettingsChange(trackingEnabled) {
  if (trackingEnabled) {
    cordova.plugins.SingularCordovaSdk.resumeAllTracking();
    console.log('Privacy settings: Tracking enabled');
    localStorage.setItem('tracking_enabled', 'true');
  }
}

IsAllTrackingStopped

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

メソッドのシグネチャ

cordova.plugins.SingularCordovaSdk.isAllTrackingStopped(
  success: Function
): void

戻り値

  • true:現在stopAllTracking()
  • false:追跡は有効です(停止または再開されたことはありません)。

メソッドの完全なドキュメントについては、isAllTrackingStopped リファレンスを参照してください。


実装例

トラッキング状態をチェックし、UIの状態をSDKのトラッキング状態と同期させます。

JavaScript
document.addEventListener('deviceready', initializePrivacyUI, false);

function initializePrivacyUI() {
  updatePrivacyUI();
}

// Check current tracking status
function isTrackingEnabled(callback) {
  cordova.plugins.SingularCordovaSdk.isAllTrackingStopped(function(isStopped) {
    callback(!isStopped);
  });
}

// Display privacy status in settings
function getPrivacyStatusText(callback) {
  cordova.plugins.SingularCordovaSdk.isAllTrackingStopped(function(isStopped) {
    var text = isStopped ? 'Tracking: Disabled' : 'Tracking: Enabled';
    callback(text);
  });
}

// Sync UI with tracking state
function updatePrivacyUI() {
  cordova.plugins.SingularCordovaSdk.isAllTrackingStopped(function(isStopped) {
    var statusElement = document.getElementById('tracking-status');
    var toggleElement = document.getElementById('tracking-toggle');
    
    if (statusElement) {
      statusElement.textContent = isStopped ? 'Tracking: Disabled' : 'Tracking: Enabled';
    }
    
    if (toggleElement) {
      toggleElement.checked = !isStopped;
    }
    
    console.log('Current tracking state: ' + (isStopped ? 'Stopped' : 'Active'));
  });
}

// Handle toggle change from UI
function onTrackingToggleChanged(enabled) {
  if (enabled) {
    cordova.plugins.SingularCordovaSdk.resumeAllTracking();
  } else {
    cordova.plugins.SingularCordovaSdk.stopAllTracking();
  }
  
  updatePrivacyUI();
}

子供のプライバシー保護

COPPA(児童オンラインプライバシー保護法)に準拠し、ユーザーが13歳未満の場合にSingularに通知することで、子供のプライバシーを保護します。

トラッキングアンダー13

子供のプライバシー保護を有効にする

ユーザーが13歳未満であることをSingularに通知し、COPPAやその他の児童プライバシー規制に準拠します。

方法の署名

cordova.plugins.SingularCordovaSdk.trackingUnder13(): void

コンプライアンス要件

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

メソッドの完全なドキュメントについては、trackingUnder13のリファレンスを参照してください。


実装例

年齢確認によってユーザが13歳未満であると判断した直後に、trackingUnder13()

JavaScript
document.addEventListener('deviceready', initializeCOPPA, false);

function initializeCOPPA() {
  // Check if user's age was previously verified
  var ageCategory = localStorage.getItem('user_age_category');
  
  if (ageCategory === 'under_13') {
    applyChildPrivacyProtections();
  }
}

// User identified as under 13
function onUserUnder13() {
  cordova.plugins.SingularCordovaSdk.trackingUnder13();
  console.log('COPPA mode enabled for user under 13');
  
  // Store age category for app restart
  localStorage.setItem('user_age_category', 'under_13');
}

// Call after age verification
function onAgeVerified(userAge) {
  if (userAge < 13) {
    cordova.plugins.SingularCordovaSdk.trackingUnder13();
    console.log('COPPA restrictions applied');
    
    // Also limit advertising identifiers
    cordova.plugins.SingularCordovaSdk.setLimitAdvertisingIdentifiers(true);
    
    localStorage.setItem('user_age_category', 'under_13');
    
    alert('Special privacy protections have been applied to your account.');
  } else {
    localStorage.setItem('user_age_category', 'adult');
    console.log('Adult account - standard tracking');
  }
}

// Example: Age verification form
function handleAgeSubmit() {
  var ageInput = document.getElementById('age-input');
  var userAge = parseInt(ageInput.value, 10);
  
  if (isNaN(userAge) || userAge < 1 || userAge > 120) {
    alert('Please enter a valid age.');
    return;
  }
  
  onAgeVerified(userAge);
}

// Apply all child privacy protections
function applyChildPrivacyProtections() {
  cordova.plugins.SingularCordovaSdk.trackingUnder13();
  cordova.plugins.SingularCordovaSdk.setLimitAdvertisingIdentifiers(true);
  console.log('Child privacy protections applied');
}

ベストプラクティス:ユーザーの年齢を決定した後、できるだけ早い段階でtrackingUnder13()setLimitAdvertisingIdentifiers(true) 、包括的な子供のプライバシー保護のために組み合わせてください。


完全なプライバシーの実装

GDPR、CCPA、COPPAのコンプライアンスをカバーする包括的なプライバシー管理を、永続的ストレージとUI同期で実装します。

完全な実装例

プライバシーマネージャーモジュール

すべてのプライバシー設定の初期化と永続化を処理する、再利用可能なプライバシー管理モジュールを作成します。

JavaScript
// Privacy Manager Module
var PrivacyManager = {
  // Storage keys
  PREF_USER_CONSENT: 'privacy_user_consent',
  PREF_DATA_SHARING: 'privacy_data_sharing',
  PREF_AGE_CATEGORY: 'user_age_category',
  
  /**
   * Initialize privacy settings on app startup
   */
  initialize: function() {
    var hasUserConsent = this.getUserConsent();
    var allowDataSharing = this.getDataSharingPreference();
    var ageCategory = this.getAgeCategory();
    
    // Apply age-based restrictions first
    if (ageCategory === 'under_13') {
      cordova.plugins.SingularCordovaSdk.trackingUnder13();
      cordova.plugins.SingularCordovaSdk.setLimitAdvertisingIdentifiers(true);
      console.log('COPPA restrictions applied on startup');
    }
    
    // Apply stored tracking preference
    if (hasUserConsent) {
      cordova.plugins.SingularCordovaSdk.trackingOptIn();
      cordova.plugins.SingularCordovaSdk.resumeAllTracking();
      console.log('Privacy initialized: Tracking enabled with consent');
    } else {
      cordova.plugins.SingularCordovaSdk.stopAllTracking();
      console.log('Privacy initialized: Tracking disabled');
    }
    
    // Set data sharing preference (inverse logic)
    cordova.plugins.SingularCordovaSdk.limitDataSharing(!allowDataSharing);
    
    console.log('Privacy initialized: consent=' + hasUserConsent + ', sharing=' + allowDataSharing);
  },
  
  /**
   * User accepts tracking via consent dialog
   */
  onUserAcceptedTracking: function() {
    this.saveUserConsent(true);
    
    cordova.plugins.SingularCordovaSdk.trackingOptIn();
    cordova.plugins.SingularCordovaSdk.resumeAllTracking();
    
    console.log('User accepted tracking');
  },
  
  /**
   * User declines tracking
   */
  onUserDeclinedTracking: function() {
    this.saveUserConsent(false);
    
    cordova.plugins.SingularCordovaSdk.stopAllTracking();
    
    console.log('User declined tracking');
  },
  
  /**
   * User updates data sharing preference
   */
  setDataSharingEnabled: function(enabled) {
    this.saveDataSharingPreference(enabled);
    
    // Note: LimitDataSharing uses inverse logic
    // false = data sharing enabled, true = data sharing limited
    cordova.plugins.SingularCordovaSdk.limitDataSharing(!enabled);
    
    console.log('Data sharing: ' + (enabled ? 'Enabled' : 'Limited'));
  },
  
  /**
   * Check if tracking is currently enabled
   */
  isTrackingEnabled: function(callback) {
    cordova.plugins.SingularCordovaSdk.isAllTrackingStopped(function(isStopped) {
      callback(!isStopped);
    });
  },
  
  /**
   * Get current privacy status as readable text
   */
  getPrivacyStatus: function(callback) {
    var self = this;
    
    this.isTrackingEnabled(function(isEnabled) {
      var dataSharingEnabled = self.getDataSharingPreference();
      var ageCategory = self.getAgeCategory();
      
      var status = 'Tracking: ' + (isEnabled ? 'Enabled' : 'Disabled') + '\n';
      status += 'Data Sharing: ' + (dataSharingEnabled ? 'Enabled' : 'Limited');
      
      if (ageCategory === 'under_13') {
        status += '\nCOPPA: Restrictions Applied';
      }
      
      callback(status);
    });
  },
  
  /**
   * Set user's age and apply appropriate protections
   */
  setUserAge: function(age) {
    if (age < 13) {
      cordova.plugins.SingularCordovaSdk.trackingUnder13();
      cordova.plugins.SingularCordovaSdk.setLimitAdvertisingIdentifiers(true);
      localStorage.setItem(this.PREF_AGE_CATEGORY, 'under_13');
      console.log('Age set to under 13 - COPPA protections applied');
    } else {
      localStorage.setItem(this.PREF_AGE_CATEGORY, 'adult');
      console.log('Age set to adult - standard tracking');
    }
  },
  
  // Private helper methods
  getUserConsent: function() {
    var value = localStorage.getItem(this.PREF_USER_CONSENT);
    return value === 'true';
  },
  
  saveUserConsent: function(consent) {
    localStorage.setItem(this.PREF_USER_CONSENT, consent.toString());
  },
  
  getDataSharingPreference: function() {
    var value = localStorage.getItem(this.PREF_DATA_SHARING);
    return value === 'true';
  },
  
  saveDataSharingPreference: function(enabled) {
    localStorage.setItem(this.PREF_DATA_SHARING, enabled.toString());
  },
  
  getAgeCategory: function() {
    return localStorage.getItem(this.PREF_AGE_CATEGORY);
  }
};

// Initialize on device ready
document.addEventListener('deviceready', function() {
  PrivacyManager.initialize();
}, false);

主な実装ガイドライン

ベストプラクティス

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

検証チェックリスト

プライバシーの実装がコンプライアンス要件を満たしていることを確認する:

  1. 同意の収集:同意の収集:トラッキングを開始する前に、ユーザーに明示的な同意を求める
  2. 同意の記録:ユーザーがGDPRの同意を提供したときにtrackingOptIn()
  3. データ共有コントロール: limitDataSharing() 、ユーザーの好みをパートナーに伝える。
  4. オプトアウトメカニズム:プライバシー設定からstopAllTracking()
  5. 年齢確認:子供のための年齢ゲートとコールtrackingUnder13()
  6. 永続的な設定:プライバシー設定は保存され、アプリ再起動時に再適用されます。
  7. UIの透明性:プライバシー設定画面に現在のトラッキング状況を明確に表示