ドキュメント
Singular SDKによるプライバシーコンプライアンス
GDPR、CCPA、COPPA、その他のプライバシー規制に対応したSingular SDKのオプトイン、オプトアウトメソッドを使用した、プライバシーに準拠したトラッキングソリューションの実装に関する包括的なガイドです。
法的免責事項:このページのガイドラインは法的アドバイスを意味するものではありません。お客様の管轄地域や事業運営に適用されるプライバシー法の遵守については、お客様の法務チームにご相談ください。
Singularは包括的なプライバシーコンプライアンスツールを提供し、進化するプライバシー規制へのコンプライアンスを維持しながらプラットフォームの機能を活用できるようにします。
|
対象者 |
開発者、法務/コンプライアンスチーム、プロダクトマネージャー |
|
適用される規制 |
GDPR、CCPA、COPPA、および法域固有のプライバシー法 |
プライバシー規制の概要
対応するコンプライアンスフレームワーク
Singularプラットフォームは、設定可能な同意管理およびトラッキングコントロールの仕組みにより、主要なプライバシー規制へのコンプライアンスをサポートします。
| 規制 |
適用範囲 |
主な要件 |
推奨方法 |
|
GDPR |
欧州連合のデータ保護とプライバシー |
データ収集前のユーザー同意 |
オプトインまたはオプトアウト |
|
カリフォルニア州法 |
カリフォルニア州の消費者のプライバシー権 |
データ販売のオプトアウト権 |
オプトアウト |
|
COPPA |
子供のオンラインプライバシー保護(13歳未満) |
児童からのデータ収集前の保護者の同意、またはエイジゲートの実施 |
オプトイン+エイジゲート |
|
地域法 |
管轄地域固有のプライバシー規制 |
法域によって異なる |
法律顧問に相談 |
進化する規制:個人情報保護法は、新たな制定や解釈によって絶えず進化しています。Singularプラットフォームは、許可されている場合は完全な追跡機能を維持しながら、変化するコンプライアンス要件に適応する柔軟なツールを提供します。
コンプライアンス方法
Singularは主に2つのコンプライアンス方法をサポートしています:オプトイン(同意優先)とオプトアウト(ユーザーコントロールによるトラッキング優先)で、それぞれ異なる規制要件やユーザーの同意モデルに対応します。
方法の選択
適切なコンプライアンス方法の選択
適用される規制、ユーザーの属性、法律顧問のガイダンスに基づいてコンプライアンス方法を選択します。
| 方法 |
必要な場合 |
実施概要 |
|
オプトイン |
- EUにおけるGDPRコンプライアンス
- 子供向けアプリのCOPPA対応
- 明示的な同意が必要な法域
|
ユーザーが同意するまでSDKの初期化を遅らせる。明示的な許可なしにデータを送信しない。 |
|
オプトアウト |
- カリフォルニア州のCCPA準拠
- オプトアウトオプションでトラッキングを許可する管轄区域
- 同意オプションのある成人向けアプリ
|
SDKを通常通り初期化するが、ユーザーがいつでもトラッキングを停止できる仕組みを提供する。 |
|
ハイブリッド |
- 複数の司法管轄区にまたがるアプリ
- 視聴者層が混在
- 様々な規制要件
|
明示的な同意が必要なユーザーにはオプトインを導入し、継続的なコントロールにはオプトアウトの仕組みを提供する。 |
ベストプラクティス:多くの組織では、最初の同意にOpt-Inを使用し、その後アプリの設定でOpt-Outオプションを使用するハイブリッドアプローチを導入することで、最大限の柔軟性とコンプライアンスカバレッジを実現しています。
オプトイン方式
ユーザーが明示的にデータ収集と追跡の許可を与えるまで、SDKの初期化を遅らせる同意優先のアプローチ。
オプトインの実装
実装戦略
オプトイン方式では、SDKの初期化やSingularプラットフォームへのデータ送信の前に、同意インターフェースを提示する必要があります。
重要な要件ユーザーが明示的に同意するまで、Singular SDKを初期化したり、データを収集したりしないでください。SDKの初期化は、同意ステータスに基づいた条件付きでなければなりません。
実装ワークフロー
オプトインフロー図
ステップバイステップの実装
| 1 |
同意ステータスの確認
アプリの起動時に、SDK操作の前に保存されている同意設定を確認します。
実装の考慮事項:
-
永続的なストレージ(SharedPreferences、UserDefaultsなど)に同意プリファレンスを保存する。
-
AppDelegateまたはMainActivityの初期化の前に同意ステータスをチェックする。
- デフォルトを同意なしにする(許可を仮定しない)
// Check consent status from storage
func hasUserConsent() -> Bool {
return UserDefaults.standard.bool(forKey: "singular_tracking_consent")
}
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Only initialize if consent granted
if hasUserConsent() {
initializeSingular()
} else {
// Show consent dialog
presentConsentDialog()
}
return true
}
// Check consent status from storage
fun hasUserConsent(): Boolean {
val prefs = getSharedPreferences("privacy_prefs", Context.MODE_PRIVATE)
return prefs.getBoolean("singular_tracking_consent", false)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Only initialize if consent granted
if (hasUserConsent()) {
initializeSingular()
} else {
// Show consent dialog
showConsentDialog()
}
}
import AsyncStorage from '@react-native-async-storage/async-storage';
import { Singular } from 'singular-react-native';
// Check consent status from storage
async function hasUserConsent() {
const consent = await AsyncStorage.getItem('singular_tracking_consent');
return consent === 'true';
}
async function initializeApp() {
const consentGranted = await hasUserConsent();
if (consentGranted) {
// Initialize Singular SDK
initializeSingular();
} else {
// Show consent dialog
showConsentDialog();
}
}
|
| 2 |
同意インターフェースを提示する
同意のプリファレンスが保存されていない場合、または同意が付与されていない場合、データ収集プラクティスを説明する明確な同意インターフェースを提示する。
同意インターフェースの要件
-
明確な言語:どのようなデータがなぜ収集されるかを平易な言葉で説明すること。
-
明示的な行動:ユーザーは積極的な行動を取らなければならない(事前チェックボックスではない
-
きめ細かなオプション:規制により必要とされる場合、異なるデータタイプについて個別に同意する。
-
簡単な拒否:同意の拒否は、同意の付与と同じくらい簡単でなければなりません。
-
プライバシーポリシーのリンク:詳細なプライバシーポリシーへのリンク
GDPRの要件GDPRの下では、同意は自由に与えられ、具体的で、十分な情報を提供され、曖昧であってはなりません。事前にチェックされたボックスや暗黙の同意は要件を満たしていません。
|
| 3 |
同意付与の処理
ユーザーが同意した場合、プリファレンスを保存し、通常の設定でSingular SDKを初期化します。
func userGrantedConsent() {
// Store consent preference
UserDefaults.standard.set(true, forKey: "singular_tracking_consent")
UserDefaults.standard.synchronize()
// Initialize Singular SDK
initializeSingular()
}
func initializeSingular() {
let config = SingularConfig(apiKey: "SDK_KEY", andSecret: "SDK_SECRET")
// Configure as needed
config.launchOptions = launchOptions
// Initialize SDK
Singular.start(config)
}
fun userGrantedConsent() {
// Store consent preference
val prefs = getSharedPreferences("privacy_prefs", Context.MODE_PRIVATE)
prefs.edit().putBoolean("singular_tracking_consent", true).apply()
// Initialize Singular SDK
initializeSingular()
}
fun initializeSingular() {
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
// Configure as needed
// config.withLoggingEnabled()
// Initialize SDK
Singular.init(this, config)
}
async function userGrantedConsent() {
// Store consent preference
await AsyncStorage.setItem('singular_tracking_consent', 'true');
// Initialize Singular SDK
initializeSingular();
}
function initializeSingular() {
const config = {
apiKey: 'SDK_KEY',
secret: 'SDK_SECRET',
};
Singular.init(config);
}
|
| 4 |
同意辞退の処理
ユーザーが同意を拒否した場合、プリファレンスを保存し、SDKを初期化しません。アプリはトラッキングなしで機能し続けます。
func userDeclinedConsent() {
// Store declined preference
UserDefaults.standard.set(false, forKey: "singular_tracking_consent")
UserDefaults.standard.synchronize()
// Do NOT initialize Singular SDK
// App continues without tracking
// Optional: Log declined consent for internal analytics
print("User declined tracking consent")
}
fun userDeclinedConsent() {
// Store declined preference
val prefs = getSharedPreferences("privacy_prefs", Context.MODE_PRIVATE)
prefs.edit().putBoolean("singular_tracking_consent", false).apply()
// Do NOT initialize Singular SDK
// App continues without tracking
// Optional: Log declined consent for internal analytics
Log.d("Privacy", "User declined tracking consent")
}
async function userDeclinedConsent() {
// Store declined preference
await AsyncStorage.setItem('singular_tracking_consent', 'false');
// Do NOT initialize Singular SDK
// App continues without tracking
// Optional: Log declined consent for internal analytics
console.log('User declined tracking consent');
}
|
| 5 |
同意の取り消し
Opt-Inメソッドで同意を与えた後でも、ユーザーは後で同意を取り消すことができます。アプリの設定でオプトアウトメカニズムを実装する。
規制要件:ほとんどのプライバシー規制は、同意を付与するのと同じくらい簡単に同意を撤回できることを求めています。継続的な同意管理のために、設定でオプトアウト方法を実装します。
取り消しの実装の詳細については、オプトアウト方法のセクションを参照してください。
|
COPPAコンプライアンス
子供のプライバシー保護
子供や混合ユーザーをターゲットにしたアプリは、COPPAや同様の子供のプライバシー規制の下で特別な配慮が必要です。
エイジゲートの実装
年齢確認要件
児童と成人が混在するアプリは、児童からのデータ収集の前に年齢ゲートを実施する必要があります。
エイジゲートの流れ
-
年齢のプロンプト:トラッキングの前に、アプリの起動時にユーザーの年齢または生年月日を要求する。
-
対象者を決定する:ユーザーが子供(米国では13歳未満)か大人かを特定する。
-
子供のユーザー:子供の場合、SDKを初期化する前に検証可能な保護者の同意を得る(保護者の同意が必要なオプトインとして扱う
-
成人ユーザー:成人の場合、管轄区域に基づき、通常のオプトインまたはオプトアウトのフローに進みます。
保護者の同意方法
COPPAは、確認可能な保護者の同意について、いくつかの方法を認めています:
- 保護者によるクレジットカード情報の提供
- ファックス、電子メール、郵送による署名入り同意書
- 保護者がフリーダイヤルに電話する
- 保護者がスタッフとビデオ会議をする
-
保護者が政府発行の身分証明書を提出し、データベースと照合する。
- 知識ベースの課題に答える
アプリの適切な保護者の同意方法については、法律顧問にご相談ください。
子供だけをターゲットにしたアプリ
子供向けアプリに特化したSDK
Singularは、子供だけをターゲットにしたアプリ(混合オーディエンスではない)向けに、デバイス識別子を取得しないことでCOPPA要件に準拠した子供向けアプリ専用SDKを提供しています。
キッズアプリSDK Kids Apps SDKのFAQをご確認いただき、COPPAに準拠した方法でSingularを子供専用アプリに利用するためのガイダンスについては、お客様のアカウントチームにお問い合わせください。
主な違い
Kids Apps SDKは標準のSDKとは異なります:
- デバイス識別子の収集なし(IDFA、GAIDなど)
- 限定的なアトリビューション機能(集計のみ)
- クロスデバイストラッキングなし
-
App StoreおよびPlayストアの子供向けアプリポリシーに準拠
オプトアウト方式
トラッキングを優先するアプローチで、SDKは通常通り初期化されますが、アプリの設定やプリファレンスを通じて、トラッキングをいつでも停止できるようユーザーコントロールを提供します。
オプトアウトの実装
実装戦略
Opt-Out方式では、アプリ起動時にSDKを初期化する一方で、ユーザーが必要に応じてトラッキングを無効にするメカニズムを提供します。
実装ワークフロー
オプトアウトフロー図
ステップバイステップの実装
| 1 |
アプリ起動時にSDKを初期化
アプリ起動時にSingular SDKを通常通り初期化し、デフォルトでトラッキングを有効にします。
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Check if user previously opted out
let hasOptedOut = UserDefaults.standard.bool(forKey: "singular_opted_out")
// Initialize Singular SDK
let config = SingularConfig(apiKey: "SDK_KEY", andSecret: "SDK_SECRET")
config.launchOptions = launchOptions
Singular.start(config)
// If previously opted out, stop tracking immediately
if hasOptedOut {
Singular.stopAllTracking()
}
return true
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// Check if user previously opted out
val prefs = getSharedPreferences("privacy_prefs", Context.MODE_PRIVATE)
val hasOptedOut = prefs.getBoolean("singular_opted_out", false)
// Initialize Singular SDK
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
Singular.init(this, config)
// If previously opted out, stop tracking immediately
if (hasOptedOut) {
Singular.stopAllTracking()
}
}
import AsyncStorage from '@react-native-async-storage/async-storage';
import { Singular } from 'singular-react-native';
async function initializeApp() {
// Check if user previously opted out
const hasOptedOut = await AsyncStorage.getItem('singular_opted_out');
// Initialize Singular SDK
const config = {
apiKey: 'SDK_KEY',
secret: 'SDK_SECRET',
};
Singular.init(config);
// If previously opted out, stop tracking immediately
if (hasOptedOut === 'true') {
Singular.stopAllTracking();
}
}
|
| 2 |
オプトアウトメカニズムの提供
ユーザーがトラッキングをオプトアウトするための、明確でアクセスしやすい仕組みをアプリの設定やプライバシー設定に作成します。
オプトアウトインターフェースの要件
-
簡単にアクセスできること:直感的にアクセスできる場所に設置する(設定 → プライバシーまたは同様の設定
-
明確な説明:オプトアウトの意味とアプリ機能への影響を説明する。
-
シンプルなトグル:追跡を無効にするためのワンステップのトグルまたはボタン
-
即時効果:アプリを再起動することなく、オプトアウトが即座に有効になります。
-
リバーシブル:ユーザーは簡単にオプトインできます。
CCPAの要件:カリフォルニア州消費者プライバシー法(California Consumer Privacy Act)では、「Do Not Sell My Personal Information(私の個人情報を販売しないでください)」のリンクを目立つように表示することが義務付けられています。 オプトアウトの仕組みは明確に表示され、簡単にアクセスできる必要があります。
|
| 3 |
オプトアウトの処理
ユーザーがオプトアウトしたら、Singular.stopAllTracking()を呼び出し、Singularへのすべてのデータ送信を直ちに停止する。
func userOptedOut() {
// Stop all tracking immediately
Singular.stopAllTracking()
// Store opt-out preference
UserDefaults.standard.set(true, forKey: "singular_opted_out")
UserDefaults.standard.synchronize()
// Optional: Show confirmation to user
showAlert(title: "Tracking Disabled",
message: "Your data will no longer be tracked.")
}
fun userOptedOut() {
// Stop all tracking immediately
Singular.stopAllTracking()
// Store opt-out preference
val prefs = getSharedPreferences("privacy_prefs", Context.MODE_PRIVATE)
prefs.edit().putBoolean("singular_opted_out", true).apply()
// Optional: Show confirmation to user
Toast.makeText(this, "Tracking disabled", Toast.LENGTH_SHORT).show()
}
async function userOptedOut() {
// Stop all tracking immediately
Singular.stopAllTracking();
// Store opt-out preference
await AsyncStorage.setItem('singular_opted_out', 'true');
// Optional: Show confirmation to user
Alert.alert('Tracking Disabled', 'Your data will no longer be tracked.');
}
stopAllTracking()の動作
stopAllTracking() :
- すべてのイベントトラッキングが直ちに停止
- セッショントラッキングが停止
- Singularサーバーにデータが送信されない
- アトリビューション・トラッキングは無効
- 設定は元に戻るまでアプリのセッションをまたいで持続
|
| 4 |
オプトインアクションの処理
ユーザーがオプトインを再開すると決めたら、Singular.resumeAllTracking()を呼び出し、通常のトラッキング操作を再開します。
func userOptedIn() {
// Resume all tracking
Singular.resumeAllTracking()
// Update opt-out preference
UserDefaults.standard.set(false, forKey: "singular_opted_out")
UserDefaults.standard.synchronize()
// Optional: Show confirmation to user
showAlert(title: "Tracking Enabled",
message: "Your app activity will now be tracked.")
}
fun userOptedIn() {
// Resume all tracking
Singular.resumeAllTracking()
// Update opt-out preference
val prefs = getSharedPreferences("privacy_prefs", Context.MODE_PRIVATE)
prefs.edit().putBoolean("singular_opted_out", false).apply()
// Optional: Show confirmation to user
Toast.makeText(this, "Tracking enabled", Toast.LENGTH_SHORT).show()
}
async function userOptedIn() {
// Resume all tracking
Singular.resumeAllTracking();
// Update opt-out preference
await AsyncStorage.setItem('singular_opted_out', 'false');
// Optional: Show confirmation to user
Alert.alert('Tracking Enabled', 'Your app activity will now be tracked.');
}
resumeAllTracking() の動作
resumeAllTracking() :
- イベントトラッキングは直ちに再開されます。
- セッショントラッキング再開
- Singularサーバーへのデータ送信が有効
- アトリビューション・トラッキングの再開
- 再開を示す新しいセッションの作成
|
実装のベストプラクティス
オプトアウトに関する考慮事項
設定の配置
推奨される場所
直感的にアクセスしやすい場所にオプトアウト・コントロールを配置する:
-
プライバシー設定:プライバシーまたはデータ設定専用セクション
-
一般設定:メイン設定メニューに明確なプライバシー設定サブセクション
-
アカウント設定:ユーザーアカウント設定エリア
-
ファースト・ラン・エクスペリエンス:オンボーディング時にオプトアウトの可否を明記
明確なコミュニケーション
透明性の要件
オプトアウトの意味と機能への影響を明確に伝える:
-
データ収集の説明:どのようなデータがどのような目的で収集されるかを説明する
-
オプトアウトの効果:ユーザーがオプトアウトした場合に何が起こるかを説明する
-
機能への影響:オプトアウトがアプリの機能に影響を与えるかどうかを開示する
-
可逆性:ユーザーがいつでもオプトインできることを確認する
プリファレンスの永続性
ストレージに関する考慮事項
アプリのセッションをまたいで、オプトアウト設定を確実に保存する:
-
永続ストレージ:SharedPreferences(Android)またはUserDefaults(iOS)を使用します。
-
起動時のチェック:アプリを起動するたびにオプトアウトのステータスを確認
-
プリファレンスの尊重:SDKが再初期化されてもオプトアウトを尊重する。
-
ストレージのバックアップ:デバイス間の一貫性を保つため、サーバーへのバックアップを検討する。
その他の考慮事項
包括的なプライバシーコンプライアンスは、基本的なオプトイン/オプトアウトの実装だけでなく、複数の側面に注意を払う必要があります。
データの保持と削除
ユーザーデータ管理
プライバシーに関する規制では、ユーザーがデータの削除やエクスポートを要求するための仕組みが求められることがよくあります。
データ主体の権利:GDPR、CCPA、その他のプライバシー規制に基づくユーザーデータ削除要求またはデータエクスポート要件については、Singularサポートにお問い合わせください。
プライバシーポリシー
必要な開示
データの収集、使用、共有の慣行を開示する、包括的でアクセス可能なプライバシーポリシーを維持する。
プライバシーポリシーの要件
-
収集されるデータ:デバイス識別子、イベント、ユーザー情報など、収集されるすべてのデータタイプを列挙すること。
-
使用目的:データの使用方法(分析、アトリビューション、広告など)を説明すること。
-
第三者との共有:Singularおよびその他の第三者とのデータ共有の開示
-
ユーザーの権利データへのアクセス、削除、オプトアウトに関するユーザーの権利の説明
-
連絡先情報:プライバシーに関する質問および依頼の連絡方法を提供する
多地域コンプライアンス
グローバルなプライバシー要件
複数の管轄区域でサービスを提供するアプリは、さまざまなプライバシー規制に同時に準拠する必要があります。
| アプローチ |
説明 |
|
ジオロケーションベース |
ユーザーの所在地を検出し、管轄区域に基づいて適切なプライバシー管理を適用(EUではオプトイン、カリフォルニア州ではオプトアウトなど |
|
最高基準 |
最も厳格な要件(通常はGDPRのオプトイン)をグローバルに適用し、即時追跡のコストでコンプライアンスを簡素化 |
|
ユーザー選択 |
オンボーディング時にユーザーが管轄を指定できるようにし、適切なプライバシー管理を適用する。 |
法律顧問が必要:複数法域のコンプライアンスは複雑であり、法的専門知識が必要。プライバシーに関する弁護士に相談し、貴社のビジネスに適したアプローチを決定してください。
プライバシー実装のテスト
検証チェックリスト
プライバシー実装の検証:
-
同意が付与される前にSDKが初期化されない(Opt-Inメソッド)
- stopAllTracking()は直ちにデータ送信を停止します。
- resumeAllTracking()は正常にトラッキングを再開します。
- オプトアウトの設定はアプリのセッションをまたいで持続する
- 同意のインターフェイスは、データのプラクティスを明確に説明します。
- オプトアウトの仕組みは設定から簡単にアクセス可能
- プライバシーポリシーにアクセスしやすく、包括的
- 混合視聴者向けアプリに年齢ゲートを実装(COPPA)
- テストコンソールでは、オプトアウト時にイベントは表示されない
- オプトインすると、テストコンソールはイベントを再開します。
追加リソース
プライバシーコンプライアンス、SDKの実装、規制ガイダンスに関する完全なドキュメント。
Singularドキュメント
プライバシー規制に関するリソース
免責事項
法的助言ではありません:本ガイドに記載されている情報は、一般的に受け入れられている技術的な実施方法を示すものであり、法的なアドバイスを意味するものではありません。個人情報保護法の完全な解釈と特定のビジネスへの適用方法については、自社の個人情報保護チームまたは法務チームにご相談ください。
プライバシー規制は管轄区域によって異なり、進化し続けています。適用される法律を確実に遵守するために、法律顧問との継続的な協議を維持してください。