Treasure Data用のiOSおよびtvOS SDKです。このSDKを使用すると、アプリケーションのイベントをTreasure Dataに簡単にインポートできます。このSDKは以下をサポートしています:
- iOS 12.0以上
- tvOS 12.0以上
- iOS開発の基礎知識(Xcode、CocoaPods)
- iOS 12.0以降
- Treasure Dataの基礎知識
- Treasure Data iOS SDKリリースへのアクセス
- GDPRへの準拠の確保
このSDKはApple tvOSバージョン12.0以上をサポートしています。APIとその動作は、iOSアプリケーションで使用される場合とほぼ同じですが、以下の点が異なります:
- tvOSでは、キャッシュストレージはいつでも削除される可能性のあるキャッシュディレクトリに保存されます。データの損失を防ぐため、イベントのアップロードAPIをできるだけ頻繁に呼び出すことをお勧めします。
バージョン1.0.1には、以前のバージョンとの後方互換性がない大きな変更があります。バージョン0.9.0以前からアップグレードする場合、以下の手順を実行しないとコードが正しく動作しません:
- APIエンドポイントがIngestionエンドポイントに変更されました。デフォルト値は[ https://us01.records.in.treasuredata.com ]です。
initializeApiEndpointAPIは使用できなくなりました。代わりにinitializeWithApiKey:apiEndpoint:を使用してください。uuidは予約されたカラム名になりました。イベントのuuidキーに値を追加しようとしても、データベースにそのカラムは表示されません。td_ipフィールドを追加することによるクライアントIDの自動トラッキングはサポートされなくなりました。代わりに、新しいenableAutoTrackingIPおよびdisableAutoTrackingIPAPIを使用してください。
詳細については、このTreasure Data Swiftサンプルプロジェクトを参照してください。
ライブラリをインストールする方法はいくつかあります:
SDKをセットアップするにはCocoaPodsが必要です。まだインストールしていない場合は、最初にインストールしてください。
gem install cocoapods次に、Podfileに以下の行を追加します。
pod 'TreasureData-iOS-SDK', '= 1.0.1'SwiftでSDKを使用する場合は、Podfileに以下の行を追加します。
use_frameworks!最後に、'pod install'を実行します。
pod install.xcodeprojファイルではなく.xcworkspaceファイルを開いてプロジェクトを再度開くことを忘れないでください。
XcodeからFile > Swift Packages > Add Package Dependencyを選択し、https://github.com/treasure-data/td-ios-sdk.gitを入力してインストールできます。
または、Package.swiftファイルのdependencies配列に以下の行を追加します:
.package(url: "https://github.com/treasure-data/td-ios-sdk.git", .upToNextMajor(from: "1.0.1"))バージョン0.9.0以降、Treasure Dataはスタンドアロンフレームワークをサポートしていません。
収集すべき個人情報がある場合は、会社のデータプライバシー責任者および法務顧問とデータ収集ポリシーを確認する必要があります。個人のトラッキングを有効にする場合は、個々のユーザーのトラッキングへのオプトインを追跡するために、同意管理システムを統合することをお勧めします。
SDKは、多くの煩雑なif-else文に頼ることなく、デバイス全体のトラッキングを簡単にオプトアウトするための便利なメソッドを提供しています:
// 独自のイベントをオプトアウト
[[TreasureData sharedInstance] disableCustomEvent];
// TD生成イベントをオプトアウト
[[TreasureData sharedInstance] disableAppLifecycleEvent];
[[TreasureData sharedInstance] disableInAppPurchaseEvent];これらはenableCustomEventまたはenableAppLifecycleEventを呼び出すことで再度オプトインできます。これらの設定は永続的に保存されるため、アプリの起動をまたいで保持されます。一般的に、これらのメソッドは、SDKを初期化するたびではなく、ユーザーの選択を反映するときに呼び出す必要があります。デフォルトでは、カスタムイベントは有効で、アプリライフサイクルイベントは無効です。
resetUniqIdを使用して、後続のイベントでデバイスの識別をリセットします。td_uuidは別の値にランダム化され、{"td_ios_event": "forget_device_id", "td_uuid": <old_uuid>}を含む追加イベントがdefaultTableにキャプチャされます。
テストでは、収集している情報を確認して、意図した個人情報のみが含まれ、それ以上のものが含まれていないことを確認してください。
iOS SDKがインストールされた後、以下の手順により、書き込み専用APIキーでTreasureDataオブジェクトを初期化し、ローカルバッファにイベントを追加し、イベントのバッファをアップロードできます。
#import <TreasureData-iOS-SDK/TreasureData.h>- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[TreasureData initializeWithApiKey:@"your_api_key"];
}YOUR_API_KEY は、実際の apikey 文字列に置き換える必要があります。API キーは、TD Console のプロファイルから取得できます。Write-only API key の使用が推奨されます。
ローカルバッファにイベントを追加するには、TreasureDataのaddEventまたはaddEventWithCallback APIを呼び出します。
- (IBAction)clickButton:(id)sender {
[[TreasureData sharedInstance] addEventWithCallback:@{
@"name": @"boo bar",
@"age": @42,
@"comment": @"hello world"
}
database:@"testdb"
table:@"demotbl"
onSuccess:^(){
NSLog(@"addEvent: success");
}
onError:^(NSString* errorCode, NSString* message) {
NSLog(@"addEvent: error. errorCode=%@, message=%@", errorCode, message);
}];
// または、単純に...
// [[TreasureData sharedInstance] addEvent:@{
// @"name": @"boo bar",
// @"age": @42,
// @"comment": @"hello world"
// }
// database:@"testdb"
// table:@"demotbl"];イベントをインポートするデータベースとテーブルを指定します。データベースとテーブルの合計長は129文字未満である必要があります。各テーブルは最大10000イベントをキャッシュします。
さらに、イベント内のキーの長さは256文字を超えてはならず、イベント内の値の長さは10000文字を超えてはなりません。
バッファされたイベントをTreasure Dataにアップロードするには、TreasureDataのuploadEventsまたはuploadEventsWithCallback APIを呼び出します。
- (void)applicationDidEnterBackground:(UIApplication *)application {
__block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
// バッファされたイベントをアップロードするために、いつでもこのAPIを呼び出すことができます。
[[TreasureData sharedInstance] uploadEventsWithCallback:^() {
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
onError:^(NSString *code, NSString *msg) {
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
];
// または、単純に...
// [[TreasureData sharedInstance] uploadEvents];バッファされたイベントをいつ、どのくらいの頻度でアップロードするかは、アプリケーションの特性によって異なります。Treasure Dataは、バッファされたイベントをアップロードする適切なタイミングとして、以下のウィンドウを推奨しています:
- 現在の画面が閉じているとき、またはバックグラウンドに移動しているとき
- アプリケーションを閉じるとき
送信されたイベントは、Treasure Dataストレージにインポートされる前に数分間バッファされます。
tvOSでは、キャッシュストレージはいつでも削除される可能性のあるキャッシュディレクトリに保存されます。データの損失を防ぐため、イベントのアップロードAPIをできるだけ頻繁に呼び出すことを強くお勧めします。
このSDKは、以下の機能の組み合わせと同じ方法でイベントをインポートします:
- SDKは、イベントがサーバー側に保存されたことの確認を受け取るまで、バッファされたイベントを保持します(少なくとも1回)
- サーバー側は、デフォルトで過去1時間以内のすべてのイベントの一意のキーを記憶し、重複したインポートを防ぎます(最大1回)。重複排除ウィンドウはデフォルトで1時間なので、重複したイベントを避けるために、バッファされたイベントをそれより長く保持しないでください。
テーブル、データベース、または任意のテーブルやデータベースに追加されたイベントに対して、キーの値を自動的に設定したい場合は、デフォルト値を設定します。同じキーに複数のデフォルト値が設定されている場合、新しく追加されたイベントには、以下の順序でデフォルト値が適用され、上書きされます:
- すべてのテーブルとデータベースを対象とするデフォルト値が最初に適用されます。
- データベース内のすべてのテーブルを対象とするデフォルト値が次に適用されます。
- イベントが追加されるテーブルを対象とするデフォルト値が次に適用されます。
- イベントが追加されるテーブルとデータベースを対象とするデフォルト値が次に適用されます。
- 最後に、イベントにそのキーの値がある場合、その値がすべてのデフォルト値を上書きします。
デフォルト値を設定するには:
[[TreasureData sharedInstance] setDefaultValue:@"Value" forKey:@"key" database:nil table:nil]; // すべてのデータベースとテーブルを対象
[[TreasureData sharedInstance] setDefaultValue:@"Value" forKey:@"key" database:"database_name" table:nil]; // データベース"database_name"のすべてのテーブルを対象
[[TreasureData sharedInstance] setDefaultValue:@"Value" forKey:@"key" database:nil table:"table_name"]; // "table_name"を持つすべてのテーブルを対象
[[TreasureData sharedInstance] setDefaultValue:@"Value" forKey:@"key" database:"database_name" table:"table_name"]; // データベース"database_name"のテーブル"table_name"を対象デフォルト値を取得するには:
NSString *defaultValue = [[TreasureData sharedInstance] defaultValueForKey:@"key" database:"database_name" table:"table_name"]; // データベース"database_name"とテーブル"table_name"を対象とするキーのデフォルト値を取得デフォルト値を削除するには:
[[TreasureData sharedInstance] removeDefaultValueForKey:@"key" database:"database_name" table:"table_name"]; // データベース"database_name"とテーブル"table_name"を対象とするデフォルト値のみを削除startSessionメソッドを呼び出すと、SDKはendSessionが呼び出されるまで保持されるセッションIDを生成します。セッションIDは、カラム名"td_session_id"として出力されます。また、startSessionおよびendSessionメソッドは、{"td_session_event":"start"または"end"}を含むイベントを追加します。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[TreasureData initializeWithApiKey:@"YOUR_API_KEY"];
[[TreasureData sharedInstance] setDefaultDatabase:@"testdb"];
[[TreasureData sharedInstance] startSession:@"demotbl"];
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[[TreasureData sharedInstance] endSession:@"demotbl"];
__block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^{
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}];
[[TreasureData sharedInstance] uploadEventsWithCallback:^() {
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
onError:^(NSString *code, NSString *msg) {
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
// 出力 =>>
// [{"td_session_id":"cad88260-67b4-0242-1329-2650772a66b1",
// "td_session_event":"start", "time":1418880000},
//
// {"td_session_id":"cad88260-67b4-0242-1329-2650772a66b1",
// "td_session_event":"end", "time":1418880123}
// ]
];以下のケースを処理したい場合は、グローバルセッショントラッキングのために、クラスメソッドstartSessionとendSessionのペアを使用してください。
- ユーザーがアプリケーションを開き、
startSessionを使用してセッショントラッキングを開始します。たとえば、これはセッション#0と呼ばれるかもしれません - ユーザーがホーム画面に移動し、
endSessionを使用してセッションを終了します - ユーザーがデフォルトの10秒以内にアプリケーションを再度開き、セッショントラッキングを再開します。ただし、この新しいセッションをセッション#0と同じセッションとして扱いたい場合
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[TreasureData startSession];
}
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[TreasureData endSession];
}この場合、getSessionIdクラスメソッドを使用して現在のセッションIDを取得できます
- (void)applicationDidBecomeActive:(UIApplication *)application
{
[TreasureData startSession];
NSLog(@"Session ID=%@", [TreasureData getSessionId]);
}isFirstRunメソッドを使用して初回実行かどうかを検出し、clearFirstRunでフラグをクリアできます。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
:
if ([[TreasureData sharedInstance] isFirstRun]) {
[[TreasureData sharedInstance] addEventWithCallback:@{ @"event": @"installed" }
database:@"testdb"
table:@"demotbl"
onSuccess:^(){
[[TreasureData sharedInstance] uploadEventsWithCallback:^() {
[[TreasureData sharedInstance] clearFirstRun];
}
onError:^(NSString* errorCode, NSString* message) {
NSLog(@"uploadEvents: error. errorCode=%@, message=%@", errorCode, message);
}
];
}
onError:^(NSString* errorCode, NSString* message) {
NSLog(@"addEvent: error. errorCode=%@, message=%@", errorCode, message);
}];
}addEventWithCallbackやuploadEventWithCallbackなどのコールバック付き関数を使用する場合、これらのメソッドはerrorCode引数を使用してonErrorブロックを呼び出します。この引数は、エラーの原因や種類を判断するのに役立ちます。以下はエラーコードの一覧です。
| エラーコード | 説明 |
|---|---|
init_error | 初期化に失敗しました。 |
invalid_param | APIに渡されたパラメータが無効でした。 |
invalid_event | イベントが無効でした。 |
data_conversion | データのJSON変換に失敗しました。 |
storage_error | ストレージでのデータの読み書きに失敗しました。 |
network_error | ネットワークの問題によりサーバーとの通信に失敗しました。 |
server_response | サーバーがエラーレスポンスを返しました。 |
デフォルトのAPIエンドポイント[ https://us01.records.in.treasuredata.com ]は変更できます。例:
[TreasureData initializeWithApiKey:@"your_api_key" apiEndpoint: @"https://specifying-another-endpoint.com"];TreasureData.initializeEncryptionKeyで暗号化キーを設定した場合、TreasureData#addEventまたはTreasureData.addEventWithCallbackが呼び出されると、SDKはイベントデータを暗号化して保存します。
[TreasureData initializeEncryptionKey:@"hello world"];
[[TreasureData sharedInstance] addEventWithCallback: ....];デフォルトデータベースを指定すると、以降の呼び出しでデータベース名の代わりに「@」記号を使用できます。
[[TreasureData sharedInstance] setDefaultDatabase:@"testdb"];
[[TreasureData sharedInstance] addEventWithCallback:@{ @"event": @"clicked" } table:@"demotbl"]TreasureData#enableAutoAppendUniqId()を呼び出すと、各イベントにデバイスのUUIDが自動的に追加されます。この値は、アプリケーションがアンインストールされるまで変更されません。
[[TreasureData sharedInstance] enableAutoAppendUniqId];この値はtd_uuidという名前のカラムとして出力されます。
以下のAPIを使用して、現在のUUID(td_uuid)を取得できます。resetUniqIdが呼び出されると、このUUIDは変更されることに注意してください。
NSString *td_uuid = [[TreasureData sharedInstance] getUUID];以下のAPIを使用して、UUID(td_uuid)をリセットすることもできます。
[[TreasureData sharedInstance] resetUniqId];enableAutoAppendRecordUUIDを呼び出すと、各イベントレコードにUUIDが自動的に追加されます。各イベントは異なるUUIDを持ちます。
[[TreasureData sharedInstance] enableAutoAppendRecordUUID];
// カラム名をカスタマイズする場合は、APIに渡します
[[TreasureData sharedInstance] enableAutoAppendRecordUUID:@"my_record_uuid"];デフォルトでは、record_uuidというカラム名で値が出力されます。
enableAutoAppendAdvertisingIdentifierを呼び出すと、各イベントレコードに広告IDが自動的に追加されます。
この機能を動作させるには、「Link Binary With Libraries」ビルドフェーズでAd Supportフレームワークをリンクする必要があります。また、ユーザーがiOSデバイスで「広告トラッキングの制限」機能をオンにしていない必要があります。オンになっている場合、Treasure Dataは広告ID(Ad Supportフレームワークから返される値)としてゼロで埋められた文字列を送信します。
iOS 14以降では、AppTrackingTransparencyフレームワークを使用して、広告識別子の使用についてユーザーの明示的な許可を求める必要があります。この要件の実装方法については、AppleのAppTrackingTransparencyに関する公式ドキュメントを参照してください。この機能をオンにする場合、App Storeにアプリをレビュー用に提出する際に、広告識別子を取得する正当な理由を宣言する必要があることに注意してください。
[[TreasureData sharedInstance] enableAutoAppendAdvertisingIdentifier];
// カラム名をカスタマイズする場合は、APIに渡します
[[TreasureData sharedInstance] enableAutoAppendAdvertisingIdentifier:@"custom_ad_id_column"];デフォルトでは、td_maidというカラム名で値が出力されます。
TreasureData#enableAutoAppendModelInformationを呼び出すと、各イベントにデバイスモデル情報が自動的に追加されます。
[[TreasureData sharedInstance] enableAutoAppendModelInformation];以下のカラム名と値が出力されます。
td_device: UIDevice.modeltd_model: UIDevice.modeltd_os_ver: UIDevice.model.systemVersiontd_os_type: "iOS"
enableAutoAppendAppInformationを呼び出すと、各イベントにアプリケーションバージョン情報が自動的に追加されます。
[[TreasureData sharedInstance] enableAutoAppendAppInformation];以下のカラム名と値が出力されます。
td_app_ver: Core FoundationキーCFBundleShortVersionStringtd_app_ver_num: Core FoundationキーCFBundleVersion
TreasureData#enableAutoAppendLocaleInformationを呼び出すと、各イベントにロケール設定情報が自動的に追加されます。
[[TreasureData sharedInstance] enableAutoAppendLocaleInformation];以下のカラム名と値が出力されます。
td_locale_country:[[NSLocale currentLocale] objectForKey: NSLocaleCountryCode]td_locale_lang:[[NSLocale currentLocale] objectForKey: NSLocaleLanguageCode]
enableAutoTrackingIPを呼び出すと、各イベントにtd_ipカラムでデバイスIPが自動的に追加されます。トラッキングされるIPアドレスは、イベントを追加したときではなく、Treasure Dataにイベントをアップロードしたときのものであることに注意してください。
[[TreasureData sharedInstance] enableAutoTrackingIP];IPの自動トラッキングを無効にするには:
[[TreasureData sharedInstance] disableAutoTrackingIP];[TreasureData enableLogging];[TreasureData disableLogging];アプリライフサイクルイベントのトラッキングはオプションであり、デフォルトでは有効になっていません。enableAppLifecycleEvent()を使用して、アプリライフサイクルイベントを自動的にトラッキングできます。
[[TreasureData sharedInstance] enableAppLifecycleEvent];トラッキングされるアプリライフサイクルイベントには3つのタイプがあります。
TD_IOS_APP_OPENTD_IOS_APP_INSTALLTD_IOS_APP_UPDATE(td_ios_eventカラムに書き込まれます)
以下は、トラッキングされたインストールイベントの例です。
"td_ios_event" = "TD_IOS_APP_INSTALL";
"td_app_ver" = "1.1";
"td_app_ver_num" = 2;アプリ内購入イベントのトラッキングはオプションであり、デフォルトでは有効になっていません。
Treasure Data SDKは、独自のトランザクションオブザーバーを記述することなく、IAP SKPaymentTransactionStatePurchasedイベントを自動的にトラッキングできます。
[[TreasureData sharedInstance] enableInAppPurchaseEvent];InAppPurchaseEvent、AppLifecycleEvent、customEventの間には微妙な違いがあります。後者の2つは永続的な設定であり、そのステータスはアプリの起動をまたいで保存されます。inAppPurchaseEventは通常のオブジェクトオプションのように動作し、保存されません。新しいTreasureDataインスタンス(initializeWithApiKey()を使用したsharedInstanceのみ)を初期化した後に有効にする必要があります。以下はIAPイベントの例です。
- "td_ios_event" : "TD_IOS_IN_APP_PURCHASE",
- "td_iap_transaction_identifier" : "1000000514091400",
- "td_iap_transaction_date" : "2019-03-28T08:44:12+07:00",
- "td_iap_quantity" : 1,
- "td_iap_product_identifier" : "com.yourcompany.yourapp.yourproduct",
- "td_iap_product_price" : 0.99,
- "td_iap_product_localized_title" : "Your Product Title",
- "td_iap_product_localized_description" : "Your Product Description",
- "td_iap_product_currency_code" : "USD", // これはiOS 10以降でのみ利用可能ですTreasure Dataは、製品に関する完全な情報を取得するために別のSKProductsRequestを実行します。リクエストが失敗した場合、td_iap_product_プレフィックスを持つフィールドはnullになります。currency_codeはiOS 10以降でのみ利用可能です。
この機能はデフォルトではアカウントで有効になっていません。詳細については、カスタマーサポートまたはカスタマーサクセス担当者にお問い合わせください。
TreasureDataのsharedInstanceのcdpEndpointプロパティを設定する必要があります。
以下は、Profiles APIを使用してプロファイルを検索する方法の例です。
// TreasureDataを初期化する際にcdpEndpointを設定します
[[TreasureData sharedInstance] setCdpEnpoint: @"[your cdp endpoint goes here]"]
// fetchUserSegmentsを呼び出して、ユーザーセグメントをNSArrayとして取得します
NSArray *audienceTokens = @[@"Your Profile API (Audience) Token here"];
NSDictionary *keys = @{@"your_key": @"your_value"};
NSDictionary<TDRequestOptionsKey, id> *options = @{
TDRequestOptionsTimeoutIntervalKey: [NSNumber numberWithInteger: 10],
TDRequestOptionsCachePolicyKey: [NSNumber numberWithUnsignedInteger: NSURLRequestReloadIgnoringCacheData]
};
[[TreasureData sharedInstance] fetchUserSegments:audienceTokens
keys:keys
options:options
completionHandler:^(NSArray * _Nullable jsonResponse, NSError * _Nullable error) {
NSLog(@"fetchUserSegments jsonResponse: %@", jsonResponse);
NSLog(@"fetchUserSegments error: %@", error);
}];サポートされているiOS/tvOSバージョンのリストについては、GitHubリポジトリを参照してください。
追加情報については、iOS SDK Github Repoを参照してください。