データプライバシー法の遵守
GDPR、CCPA、その他の消費者プライバシー規制に対するユーザーの同意の選択肢をSingularに通知することで、プライバシーに準拠したデータ収集を実施する。
ユーザーが第三者との情報共有に同意または拒否する場合は、Singularのプライバシー保護方法を使用してユーザーの選択を伝えます。これにより、カリフォルニア州消費者プライバシー法(CCPA)などの規制への準拠が保証され、パートナーはユーザーのプライバシー設定を尊重することができます。
詳細はこちら:Singularがプライバシーの同意をどのように処理するかについての詳細は、ユーザーのプライバシーとデータ共有の制限をご覧ください。
データ共有の制限
サードパーティデータ共有の管理
limitDataSharing メソッドを使用して、ユーザーが個人データをサードパーティパートナーと共有することに同意したかどうかをSingularに通知します。
メソッドの署名
+ (void)limitDataSharing:(BOOL)shouldLimitDataSharing;
パラメータ
- NO (false):ユーザーがオプトインし、データ共有に同意している。
- YES(真):ユーザーはオプトアウトしており、データの共有に同意していない。
重要:オプションですが、このメソッドはアトリビューションデータの共有に影響します。一部のパートナーは、ユーザーがオプトインしたことが明示的に通知された場合にのみ、完全なアトリビューション情報を共有します。
使用例
// 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
func handlePrivacyConsent(userConsented: Bool) {
// Pass inverse: false = opted in, true = opted out
Singular.limitDataSharing(!userConsented)
print("Data sharing: \(userConsented ? "Enabled" : "Limited")")
}
// User has opted in to share their data
[Singular limitDataSharing:NO];
// User has opted out and declined to share their data
[Singular limitDataSharing:YES];
// Example: Set based on user preference
- (void)handlePrivacyConsent:(BOOL)userConsented {
// Pass inverse: NO = opted in, YES = opted out
[Singular limitDataSharing:!userConsented];
NSLog(@"Data sharing: %@", userConsented ? @"Enabled" : @"Limited");
}
使用方法
Singularはこの設定をユーザープライバシーポストバックで使用し、規制遵守のために必要なパートナーに渡します。
GDPRコンプライアンスの方法
GDPR(一般データ保護規則)やその他のプライバシー規制に準拠するために、ユーザーのトラッキング同意を管理し、SDKの機能を制御します。
トラッキング同意管理
トラッキング同意
GDPRオプトインイベントをSingularサーバーに送信することで、トラッキングに対する明示的なユーザーの同意を記録します。
メソッドの署名:
+ (void)trackingOptIn;
いつ使用するか
- GDPRコンプライアンス:GDPR規制地域でユーザーがトラッキングに明示的に同意した場合に呼び出します。
- 同意の記録:ユーザーがSingularのシステムでGDPRに同意したことを記録します。
- デフォルトの動作:この呼び出しがない場合、SDKはトラッキングを継続しますが、特に同意を記録しません。
// User accepted tracking consent
Singular.trackingOptIn()
// Example: Call after consent dialog
func onUserAcceptedTracking() {
Singular.trackingOptIn()
print("User opted in to tracking")
}
// User accepted tracking consent
[Singular trackingOptIn];
// Example: Call after consent dialog
- (void)onUserAcceptedTracking {
[Singular trackingOptIn];
NSLog(@"User opted in to tracking");
}
トラッキングコントロールメソッド
stopAllTracking
このデバイス上の現在のユーザーに対するすべてのSDKトラッキング活動を完全に無効にします。
メソッドのシグネチャ
+ (void)stopAllTracking;
重大な警告:このメソッドは、resumeAllTracking が呼び出されるまで、SDKを永久に無効にします。無効化された状態はアプリの再起動後も持続し、プログラムでのみ元に戻すことができます。
動作
- 即時効果:すべてのトラッキング、イベントレポート、データ収集を即座に停止します。
- 永続的な状態:アプリを終了し、再度起動しても無効のままです。
-
自動リセットなし:再度有効にするには、
resumeAllTrackingを明示的に呼び出す必要があります。
// User declined all tracking
Singular.stopAllTracking()
// Example: Handle user opt-out
func onUserDeclinedTracking() {
Singular.stopAllTracking()
print("All tracking stopped")
// Optionally store preference
saveUserTrackingPreference(false)
}
// User declined all tracking
[Singular stopAllTracking];
// Example: Handle user opt-out
- (void)onUserDeclinedTracking {
[Singular stopAllTracking];
NSLog(@"All tracking stopped");
// Optionally store preference
[self saveUserTrackingPreference:NO];
}
レジュームオールトラッキング
stopAllTracking で停止したトラッキングを再度有効にする。
メソッドの署名:
+ (void)resumeAllTracking;
使用例:
- 同意の変更:ユーザーがプライバシー設定を変更し、トラッキングを再開する。
- プライバシー設定:ユーザーがアプリの設定メニューから同意を更新
- 地域コンプライアンス:ユーザーが非規制地域に移動した場合、トラッキングを再度有効にする
// User opted back in to tracking
Singular.resumeAllTracking()
// Example: Handle consent update
func onUserResumedTracking() {
Singular.resumeAllTracking()
print("Tracking resumed")
// Optionally update stored preference
saveUserTrackingPreference(true)
}
// User opted back in to tracking
[Singular resumeAllTracking];
// Example: Handle consent update
- (void)onUserResumedTracking {
[Singular resumeAllTracking];
NSLog(@"Tracking resumed");
// Optionally update stored preference
[self saveUserTrackingPreference:YES];
}
isAllTrackingStopped
現在のユーザーに対してトラッキングが無効化されているかどうかを確認します。
メソッドのシグネチャ
+ (BOOL)isAllTrackingStopped;
戻り値
-
YES (true):
stopAllTracking。 - NO (false):追跡が有効(停止または再開されていない
// Check current tracking status
let isTrackingStopped = Singular.isAllTrackingStopped()
// Example: Display privacy status in settings
func getPrivacyStatusText() -> String {
return Singular.isAllTrackingStopped() ? "Tracking: Disabled" : "Tracking: Enabled"
}
// Example: Sync UI with tracking state
func updatePrivacyToggle() {
let isStopped = Singular.isAllTrackingStopped()
privacyToggle.isOn = !isStopped
print("Current tracking state: \(isStopped ? "Stopped" : "Active")")
}
// Check current tracking status
BOOL isTrackingStopped = [Singular isAllTrackingStopped];
// Example: Display privacy status in settings
- (NSString *)getPrivacyStatusText {
return [Singular isAllTrackingStopped] ? @"Tracking: Disabled" : @"Tracking: Enabled";
}
// Example: Sync UI with tracking state
- (void)updatePrivacyToggle {
BOOL isStopped = [Singular isAllTrackingStopped];
self.privacyToggle.on = !isStopped;
NSLog(@"Current tracking state: %@", isStopped ? @"Stopped" : @"Active");
}
子供のプライバシー保護
トラッキングアンダー13
COPPA(児童オンラインプライバシー保護法)およびその他の児童プライバシー規制に準拠するため、ユーザーが13歳未満であることをSingularに通知します。
メソッド署名:
+ (void)trackingUnder13;
コンプライアンス要件:
- COPPA準拠:米国で13歳未満の子供からデータを収集するアプリに必要です。
- 年齢制限コンテンツ:登録時または年齢確認時に、ユーザーが13歳未満であることを確認した場合に使用。
- 制限付きトラッキング:子どものプライバシー保護法に準拠するため、データ収集を制限します。
// User identified as under 13
Singular.trackingUnder13()
// Example: Call after age verification
func onAgeVerified(userAge: Int) {
if userAge < 13 {
Singular.trackingUnder13()
print("COPPA mode enabled for user under 13")
}
}
// User identified as under 13
[Singular trackingUnder13];
// Example: Call after age verification
- (void)onAgeVerified:(int)userAge {
if (userAge < 13) {
[Singular trackingUnder13];
NSLog(@"COPPA mode enabled for user under 13");
}
}
重要:ユーザーが13歳未満であると判断した後、できるだけ早い段階でこのメソッドを呼び出します。理想的には、アプリの初期化中または年齢認証の直後です。こうすることで、その後のすべてのトラッキングが、子どものプライバシーに関する規制を尊重するようになります。
limitAdvertisingIdentifiers(広告識別子制限
混合オーディエンスアプリのSDK初期化中に、広告識別子(iOSのIDFA)の収集と使用を制限します。
設定プロパティです:
@property (assign) BOOL limitAdvertisingIdentifiers;
ユースケース:
- 混合オーディエンスアプリ:アプリの起動前に年齢が決定される、大人と子供の両方に対応するアプリ。
- 既知のCOPPAユーザー:初期化時にユーザーが13歳未満であることが分かっている場合
- プライバシー第一のアプローチ:最初のSDKセッションから広告識別子の制限を適用する。
設定方法
プライバシー要件を事前に把握しているアプリには、SDKの初期化時に広告識別子の制限を設定します。
// Limit advertising identifiers at initialization
let config = SingularConfig(apiKey: "SDK_KEY", andSecret: "SDK_SECRET")
config?.limitAdvertisingIdentifiers = true
Singular.start(config)
// Limit advertising identifiers at initialization
SingularConfig *config = [[SingularConfig alloc]
initWithApiKey:@"SDK_KEY"
andSecret:@"SDK_SECRET"];
config.limitAdvertisingIdentifiers = YES;
[Singular start:config];
ベストプラクティス包括的なCOPPA遵守のために、初期化中にlimitAdvertisingIdentifiers 、ユーザーの年齢が確認されたときにtrackingUnder13() 。 これにより、最初のセッションから完全に保護されます。
実装のベストプラクティス
完全なプライバシー管理の例
ユーザーの好みを尊重し、規制に準拠した包括的なプライバシー管理を実装する。
import Foundation
class PrivacyManager {
private let userDefaults = UserDefaults.standard
private let consentKey = "user_consent"
private let dataSharingKey = "data_sharing"
// Initialize privacy settings on app start
func initializePrivacy() {
let hasUserConsent = getUserConsent()
let allowDataSharing = getDataSharingPreference()
// Apply stored preferences
if hasUserConsent {
Singular.trackingOptIn()
Singular.resumeAllTracking()
} else {
Singular.stopAllTracking()
}
// Set data sharing preference
Singular.limitDataSharing(!allowDataSharing)
print("Privacy initialized: consent=\(hasUserConsent), sharing=\(allowDataSharing)")
}
// User accepts tracking via consent dialog
func userAcceptedTracking() {
saveUserConsent(true)
Singular.trackingOptIn()
Singular.resumeAllTracking()
print("User accepted tracking")
}
// User declines tracking
func userDeclinedTracking() {
saveUserConsent(false)
Singular.stopAllTracking()
print("User declined tracking")
}
// User updates data sharing preference
func setDataSharingEnabled(_ enabled: Bool) {
saveDataSharingPreference(enabled)
// Note: limitDataSharing uses inverse logic
Singular.limitDataSharing(!enabled)
print("Data sharing: \(enabled ? "Enabled" : "Limited")")
}
// Get current tracking status
func isTrackingEnabled() -> Bool {
return !Singular.isAllTrackingStopped()
}
// Private helper methods
private func getUserConsent() -> Bool {
return userDefaults.bool(forKey: consentKey)
}
private func saveUserConsent(_ consent: Bool) {
userDefaults.set(consent, forKey: consentKey)
}
private func getDataSharingPreference() -> Bool {
return userDefaults.bool(forKey: dataSharingKey)
}
private func saveDataSharingPreference(_ enabled: Bool) {
userDefaults.set(enabled, forKey: dataSharingKey)
}
}
#import <Foundation/Foundation.h>
#import <Singular/Singular.h>
@interface PrivacyManager : NSObject
- (void)initializePrivacy;
- (void)userAcceptedTracking;
- (void)userDeclinedTracking;
- (void)setDataSharingEnabled:(BOOL)enabled;
- (BOOL)isTrackingEnabled;
@end
@implementation PrivacyManager
static NSString *const kConsentKey = @"user_consent";
static NSString *const kDataSharingKey = @"data_sharing";
// Initialize privacy settings on app start
- (void)initializePrivacy {
BOOL hasUserConsent = [self getUserConsent];
BOOL allowDataSharing = [self getDataSharingPreference];
// Apply stored preferences
if (hasUserConsent) {
[Singular trackingOptIn];
[Singular resumeAllTracking];
} else {
[Singular stopAllTracking];
}
// Set data sharing preference
[Singular limitDataSharing:!allowDataSharing];
NSLog(@"Privacy initialized: consent=%d, sharing=%d", hasUserConsent, allowDataSharing);
}
// User accepts tracking via consent dialog
- (void)userAcceptedTracking {
[self saveUserConsent:YES];
[Singular trackingOptIn];
[Singular resumeAllTracking];
NSLog(@"User accepted tracking");
}
// User declines tracking
- (void)userDeclinedTracking {
[self saveUserConsent:NO];
[Singular stopAllTracking];
NSLog(@"User declined tracking");
}
// User updates data sharing preference
- (void)setDataSharingEnabled:(BOOL)enabled {
[self saveDataSharingPreference:enabled];
// Note: limitDataSharing uses inverse logic
[Singular limitDataSharing:!enabled];
NSLog(@"Data sharing: %@", enabled ? @"Enabled" : @"Limited");
}
// Get current tracking status
- (BOOL)isTrackingEnabled {
return ![Singular isAllTrackingStopped];
}
// Private helper methods
- (BOOL)getUserConsent {
return [[NSUserDefaults standardUserDefaults] boolForKey:kConsentKey];
}
- (void)saveUserConsent:(BOOL)consent {
[[NSUserDefaults standardUserDefaults] setBool:consent forKey:kConsentKey];
}
- (BOOL)getDataSharingPreference {
return [[NSUserDefaults standardUserDefaults] boolForKey:kDataSharingKey];
}
- (void)saveDataSharingPreference:(BOOL)enabled {
[[NSUserDefaults standardUserDefaults] setBool:enabled forKey:kDataSharingKey];
}
@end
ベストプラクティス
- 永続的な保存:ユーザー設定をUserDefaultsまたは安全なストレージに保存する。
- 早期の初期化:可能であれば、SDKの初期化前にプライバシー設定を適用する。
-
UIの同期:
isAllTrackingStoppedを使用して、設定 UI を実際の SDK の状態と同期させます。 - 明確なコミュニケーション:アプリの設定で明確でアクセスしやすいプライバシーコントロールを提供する。
- コンプライアンスの文書化:法規制監査のために、プライバシーの実装に関する明確な記録を維持する。