データプライバシー法の遵守
GDPR、CCPA、その他の消費者プライバシー規制に対するユーザーの同意の選択肢をSingularに通知することで、プライバシーに準拠したデータ収集を実施する。
ユーザーが第三者との情報共有に同意または拒否する場合は、Singularのプライバシー保護方法を使用してユーザーの選択を伝えます。これにより、カリフォルニア州消費者プライバシー法(CCPA)などの規制への準拠が保証され、パートナーはユーザーのプライバシー設定を尊重することができます。
詳細はこちら:Singularがプライバシーの同意をどのように処理するかについての詳細は、ユーザーのプライバシーとデータ共有の制限をご覧ください。
データ共有の制限
サードパーティデータ共有の管理
LimitDataSharing メソッドを使用して、ユーザーが個人データをサードパーティパートナーと共有することに同意したかどうかをSingularに通知します。
メソッドの署名
static void LimitDataSharing(bool shouldLimitDataSharing)
パラメータ
- false:ユーザーがオプトインし、データ共有に同意している。
- true:ユーザーはオプトアウトしており、データの共有に同意していない。
重要:オプションですが、このメソッドはアトリビューションデータの共有に影響します。一部のパートナーは、ユーザーがオプトインしたことを明示的に通知した場合にのみ、完全なアトリビューション情報を共有します。
使用例
// User has opted in to share their data
void AYourGameMode::OnUserOptedInToDataSharing()
{
USingularSDKBPLibrary::LimitDataSharing(false);
UE_LOG(LogTemp, Log, TEXT("Data sharing enabled"));
}
// User has opted out and declined to share their data
void AYourGameMode::OnUserOptedOutOfDataSharing()
{
USingularSDKBPLibrary::LimitDataSharing(true);
UE_LOG(LogTemp, Log, TEXT("Data sharing limited"));
}
// Example: Set based on user preference
void AYourGameMode::HandlePrivacyConsent(bool bUserConsented)
{
// Pass inverse: false = opted in, true = opted out
USingularSDKBPLibrary::LimitDataSharing(!bUserConsented);
UE_LOG(LogTemp, Log, TEXT("Data sharing: %s"),
bUserConsented ? TEXT("Enabled") : TEXT("Limited"));
}
使用方法
Singularはこの設定をユーザープライバシーポストバックで使用し、規制遵守のために必要なパートナーに渡します。
GDPRコンプライアンスの方法
GDPR(一般データ保護規則)やその他のプライバシー規制に準拠するために、ユーザーのトラッキング同意を管理し、SDKの機能を制御します。
トラッキング同意管理
トラッキングオプトイン
GDPRオプトインイベントをSingularサーバーに送信することで、トラッキングに対する明示的なユーザーの同意を記録します。
メソッドの署名:
static void TrackingOptIn()
いつ使用するか:
- GDPRコンプライアンス:GDPR規制地域でユーザーがトラッキングに明示的に同意した場合に呼び出します。
- 同意の記録:ユーザーがSingularのシステムでGDPRに同意したことを記録します。
- デフォルトの動作:この呼び出しがない場合、SDKはトラッキングを継続しますが、特に同意を記録しません。
// User accepted tracking consent
void AGDPRManager::OnUserAcceptedTracking()
{
USingularSDKBPLibrary::TrackingOptIn();
UE_LOG(LogTemp, Log, TEXT("User opted in to tracking"));
}
// Example: Call after consent dialog
void AGDPRManager::ShowGDPRConsentDialog()
{
// Your consent dialog UI logic here
// ...
// If user accepts:
OnUserAcceptedTracking();
}
トラッキングコントロールメソッド
StopAllTracking(全トラッキング停止
このデバイス上の現在のユーザーに対するすべてのSDKトラッキング活動を完全に無効にします。
メソッドの署名:
static void StopAllTracking()
重大な警告:このメソッドは、ResumeAllTracking() が呼び出されるまで、SDKを永久に無効にします。無効化された状態はアプリの再起動後も持続し、プログラムでのみ元に戻すことができます。
動作
- 即時効果:すべてのトラッキング、イベントレポート、データ収集を即座に停止します。
- 永続的な状態:アプリを終了し、再度起動しても無効のままです。
-
自動リセットなし:再有効化するには、明示的に
ResumeAllTracking()。
// User declined all tracking
void ATrackingController::OnUserDeclinedTracking()
{
USingularSDKBPLibrary::StopAllTracking();
UE_LOG(LogTemp, Log, TEXT("All tracking stopped"));
// Optionally store preference
SaveBoolToConfig(TEXT("tracking_enabled"), false);
}
// Example: Handle user opt-out from settings menu
void ATrackingController::HandlePrivacySettingsChange(bool bTrackingEnabled)
{
if (!bTrackingEnabled)
{
USingularSDKBPLibrary::StopAllTracking();
UE_LOG(LogTemp, Log, TEXT("Privacy settings: Tracking disabled"));
}
}
すべてのトラッキングを再開
StopAllTracking() で停止したトラッキングを再度有効にします。
メソッドの署名:
static void ResumeAllTracking()
使用例:
- 同意の変更:ユーザーがプライバシー設定を変更し、トラッキングを再開する。
- プライバシー設定:ユーザーがアプリの設定メニューから同意を更新
- 地域コンプライアンス:ユーザーが非規制地域に移動した場合、トラッキングを再度有効にする
// User opted back in to tracking
void ATrackingController::OnUserResumedTracking()
{
USingularSDKBPLibrary::ResumeAllTracking();
UE_LOG(LogTemp, Log, TEXT("Tracking resumed"));
// Optionally update stored preference
SaveBoolToConfig(TEXT("tracking_enabled"), true);
}
// Example: Handle consent update from settings
void ATrackingController::HandlePrivacySettingsChange(bool bTrackingEnabled)
{
if (bTrackingEnabled)
{
USingularSDKBPLibrary::ResumeAllTracking();
UE_LOG(LogTemp, Log, TEXT("Privacy settings: Tracking enabled"));
}
}
IsAllTrackingStopped
現在のユーザーに対してトラッキングが無効化されているかどうかを確認します。
メソッドの署名
static bool IsAllTrackingStopped()
戻り値
-
true:トラッキングは現在
StopAllTracking()。 - false:追跡が有効(停止または再開されていない
// Check current tracking status on startup
void APrivacySettingsUI::BeginPlay()
{
Super::BeginPlay();
UpdatePrivacyUI();
}
// Check current tracking status
bool APrivacySettingsUI::IsTrackingEnabled()
{
return !USingularSDKBPLibrary::IsAllTrackingStopped();
}
// Example: Display privacy status in settings
FString APrivacySettingsUI::GetPrivacyStatusText()
{
if (USingularSDKBPLibrary::IsAllTrackingStopped())
{
return TEXT("Tracking: Disabled");
}
else
{
return TEXT("Tracking: Enabled");
}
}
// Example: Sync UI with tracking state
void APrivacySettingsUI::UpdatePrivacyUI()
{
bool bIsStopped = USingularSDKBPLibrary::IsAllTrackingStopped();
if (TrackingToggle != nullptr)
{
TrackingToggle->SetIsChecked(!bIsStopped);
}
if (StatusText != nullptr)
{
FString StatusString = bIsStopped ? TEXT("Stopped") : TEXT("Active");
StatusText->SetText(FText::FromString(
FString::Printf(TEXT("Current tracking state: %s"), *StatusString)
));
}
UE_LOG(LogTemp, Log, TEXT("Current tracking state: %s"),
bIsStopped ? TEXT("Stopped") : TEXT("Active"));
}
// Handle toggle change from UI
void APrivacySettingsUI::OnTrackingToggleChanged(bool bEnabled)
{
if (bEnabled)
{
USingularSDKBPLibrary::ResumeAllTracking();
}
else
{
USingularSDKBPLibrary::StopAllTracking();
}
UpdatePrivacyUI();
}
子供のプライバシー保護
TrackingUnder13
COPPA(児童オンラインプライバシー保護法)およびその他の児童プライバシー規制に準拠するため、ユーザーが13歳未満であることをSingularに通知します。
メソッドの署名:
static void TrackingUnder13()
コンプライアンス要件:
- COPPA準拠:米国で13歳未満の子供からデータを収集するアプリに必要です。
- 年齢制限コンテンツ:登録時または年齢確認時に、ユーザーが13歳未満であることを確認した場合に使用。
- 制限付きトラッキング:子どものプライバシー保護法に準拠するため、データ収集を制限します。
// User identified as under 13
void ACOPPAManager::OnUserUnder13()
{
USingularSDKBPLibrary::TrackingUnder13();
UE_LOG(LogTemp, Log, TEXT("COPPA mode enabled for user under 13"));
}
// Example: Call after age verification
void ACOPPAManager::OnAgeVerified(int UserAge)
{
if (UserAge < 13)
{
USingularSDKBPLibrary::TrackingUnder13();
UE_LOG(LogTemp, Log, TEXT("COPPA restrictions applied"));
// Also limit data sharing for children
USingularSDKBPLibrary::LimitDataSharing(true);
}
}
// Example: Age gate implementation
void AAgeGateWidget::OnAgeSubmitted(int UserAge)
{
if (UserAge < 13)
{
// Apply COPPA protections
USingularSDKBPLibrary::TrackingUnder13();
USingularSDKBPLibrary::LimitDataSharing(true);
UE_LOG(LogTemp, Warning, TEXT("Child user detected - privacy protections enabled"));
// Show age-appropriate content
ShowChildSafeContent();
}
else
{
// Standard tracking for users 13+
UE_LOG(LogTemp, Log, TEXT("Adult user - standard tracking enabled"));
InitializeStandardTracking();
}
}
重要:ユーザーが13歳未満であると判断した後、できるだけ早い段階でこのメソッドを呼び出します。理想的には、アプリの初期化中または年齢認証の直後です。こうすることで、その後のすべてのトラッキングが、子どものプライバシーに関する規制を尊重するようになります。
実装のベストプラクティス
完全なプライバシー管理の例
ユーザーの好みを尊重し、規制に準拠した包括的なプライバシー管理を実装する。
// ComprehensivePrivacyManager.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "ComprehensivePrivacyManager.generated.h"
UCLASS()
class YOURGAME_API AComprehensivePrivacyManager : public AActor
{
GENERATED_BODY()
public:
AComprehensivePrivacyManager();
protected:
virtual void BeginPlay() override;
public:
// Initialize privacy settings on app startup
UFUNCTION(BlueprintCallable, Category = "Privacy")
void InitializePrivacySettings();
// User accepts tracking via consent dialog
UFUNCTION(BlueprintCallable, Category = "Privacy")
void OnUserAcceptedTracking();
// User declines tracking
UFUNCTION(BlueprintCallable, Category = "Privacy")
void OnUserDeclinedTracking();
// User updates data sharing preference
UFUNCTION(BlueprintCallable, Category = "Privacy")
void SetDataSharingEnabled(bool bEnabled);
// Check if tracking is currently enabled
UFUNCTION(BlueprintCallable, Category = "Privacy")
bool IsTrackingEnabled();
// Get current privacy status as readable text
UFUNCTION(BlueprintCallable, Category = "Privacy")
FString GetPrivacyStatus();
private:
// Helper methods for config storage
bool GetUserConsent();
void SaveUserConsent(bool bConsent);
bool GetDataSharingPreference();
void SaveDataSharingPreference(bool bEnabled);
// Config keys
static const FString PREF_USER_CONSENT;
static const FString PREF_DATA_SHARING;
};
// ComprehensivePrivacyManager.cpp
#include "ComprehensivePrivacyManager.h"
#include "SingularSDKBPLibrary.h"
#include "Kismet/GameplayStatics.h"
const FString AComprehensivePrivacyManager::PREF_USER_CONSENT = TEXT("privacy_user_consent");
const FString AComprehensivePrivacyManager::PREF_DATA_SHARING = TEXT("privacy_data_sharing");
AComprehensivePrivacyManager::AComprehensivePrivacyManager()
{
PrimaryActorTick.bCanEverTick = false;
}
void AComprehensivePrivacyManager::BeginPlay()
{
Super::BeginPlay();
// Initialize privacy settings on app start
InitializePrivacySettings();
}
void AComprehensivePrivacyManager::InitializePrivacySettings()
{
bool bHasUserConsent = GetUserConsent();
bool bAllowDataSharing = GetDataSharingPreference();
// Apply stored tracking preference
if (bHasUserConsent)
{
USingularSDKBPLibrary::TrackingOptIn();
USingularSDKBPLibrary::ResumeAllTracking();
UE_LOG(LogTemp, Log, TEXT("Privacy initialized: Tracking enabled with consent"));
}
else
{
USingularSDKBPLibrary::StopAllTracking();
UE_LOG(LogTemp, Log, TEXT("Privacy initialized: Tracking disabled"));
}
// Set data sharing preference (inverse logic)
USingularSDKBPLibrary::LimitDataSharing(!bAllowDataSharing);
UE_LOG(LogTemp, Log, TEXT("Privacy initialized: consent=%s, sharing=%s"),
bHasUserConsent ? TEXT("true") : TEXT("false"),
bAllowDataSharing ? TEXT("true") : TEXT("false"));
}
void AComprehensivePrivacyManager::OnUserAcceptedTracking()
{
SaveUserConsent(true);
USingularSDKBPLibrary::TrackingOptIn();
USingularSDKBPLibrary::ResumeAllTracking();
UE_LOG(LogTemp, Log, TEXT("User accepted tracking"));
}
void AComprehensivePrivacyManager::OnUserDeclinedTracking()
{
SaveUserConsent(false);
USingularSDKBPLibrary::StopAllTracking();
UE_LOG(LogTemp, Log, TEXT("User declined tracking"));
}
void AComprehensivePrivacyManager::SetDataSharingEnabled(bool bEnabled)
{
SaveDataSharingPreference(bEnabled);
// Note: LimitDataSharing uses inverse logic
// false = data sharing enabled, true = data sharing limited
USingularSDKBPLibrary::LimitDataSharing(!bEnabled);
UE_LOG(LogTemp, Log, TEXT("Data sharing: %s"),
bEnabled ? TEXT("Enabled") : TEXT("Limited"));
}
bool AComprehensivePrivacyManager::IsTrackingEnabled()
{
return !USingularSDKBPLibrary::IsAllTrackingStopped();
}
FString AComprehensivePrivacyManager::GetPrivacyStatus()
{
bool bIsEnabled = !USingularSDKBPLibrary::IsAllTrackingStopped();
bool bDataSharingEnabled = GetDataSharingPreference();
return FString::Printf(TEXT("Tracking: %s\nData Sharing: %s"),
bIsEnabled ? TEXT("Enabled") : TEXT("Disabled"),
bDataSharingEnabled ? TEXT("Enabled") : TEXT("Limited"));
}
// Private helper methods for config storage
bool AComprehensivePrivacyManager::GetUserConsent()
{
// Implement your config storage retrieval here
// Example using GameInstance or SaveGame system
return false; // Default to no consent
}
void AComprehensivePrivacyManager::SaveUserConsent(bool bConsent)
{
// Implement your config storage here
// Example using GameInstance or SaveGame system
}
bool AComprehensivePrivacyManager::GetDataSharingPreference()
{
// Implement your config storage retrieval here
return false; // Default to limited sharing
}
void AComprehensivePrivacyManager::SaveDataSharingPreference(bool bEnabled)
{
// Implement your config storage here
}
ベストプラクティス
- 永続ストレージ:Unreal Engine の SaveGame システムまたはカスタム設定ファイルを使用してユーザー設定を保存します。
- 初期の初期化:プライバシー設定は、可能な限り SDK の初期化前に BeginPlay() 中に適用する。
-
UI 同期:
IsAllTrackingStopped()を使用して、設定 UI を実際の SDK の状態と同期させます。 - 明確なコミュニケーション:アプリの設定で、明確でアクセスしやすいプライバシーコントロールを提供する。
-
逆ロジック:
LimitDataSharing(false)はデータ共有が有効であることを意味し、trueは制限されていることを意味する。 - コンプライアンスの文書化:ユーザーがいつ、どのように同意を提供し、または取り消したかの記録を保持する。
方法の参照概要
| 方法 | 説明 | 使用時期 |
|---|---|---|
LimitDataSharing(bool)
|
ユーザーの同意に基づく第三者データ共有の制御 | CCPAコンプライアンス、ユーザーのプライバシー設定 |
TrackingOptIn()
|
明示的なGDPRトラッキング同意の記録 | EU地域でのGDPRコンプライアンス |
StopAllTracking()
|
SDKトラッキングを完全に無効にする | ユーザーがすべてのトラッキング同意を拒否 |
ResumeAllTracking()
|
トラッキング停止後、再度トラッキングを有効にする | ユーザーがオプトインの同意を変更 |
IsAllTrackingStopped()
|
現在のトラッキング状況の確認 | UIを同期し、操作前に状態を確認 |
TrackingUnder13()
|
子供のためのCOPPA保護を有効にする | ユーザーが13歳未満であることを確認 |