ダッシュボードには以下の2つの情報を登録する必要があります。
URIスキーム
sha256_cert_fingerprints
使用するURIスキームを上の画像のように、Android URI Scheme
の領域に://
を追加し、次のように入力してください。
Attention
AirbridgeのURIスキームは小文字の数字および一部の記号(
-
,+
,.
) のみサポートしています。
sha256_cert_fingerprints
を取得する方法は以下の通りです。
Google Playストアにアプリを登録する時に使った キーストア
ファイルを準備してください。
2. 以下の命令を ターミナル
で実行してください。
keytool -list -v -keystore my-release-key.keystore
3. 下記のように Certificate fingerprints
領域の SHA256
値をコピーし、上の画像のように Android sha256_cert_fingerprints
の領域に入力してください。
Certificate fingerprints:
MD5: 4C:65:04:52:F0:3F:F8:65:08:D3:71:86:FC:EF:C3:49
SHA1: C8:BF:B7:B8:94:EA:5D:9D:38:59:FE:99:63:ED:47:B2:D9:5A:4E:CC
SHA256: B5:EF:4D:F9:DC:95:E6:9B:F3:9A:5E:E9:D6:E0:D8:F6:7B:AB:79:C8:78:67:34:D9:A7:01:AB:6A:86:01:0E:99
Android sha256_cert_fingerprintsはコンマ(’,’)で区分して複数の値を登録することができます。
以下のプロセスに沿って インテントフィルタ
を設定してください。
AndroidManifest.xml
ファイルを開いてください。
ディープリンクを処理する アクティビティ
に インテントフィルタ
を以下のように追加してください。
<activity ...>
...
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="YOUR_APP_NAME.abr.ge" />
<data android:scheme="https" android:host="YOUR_APP_NAME.abr.ge" />
</intent-filter>
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="YOUR_APP_NAME.airbridge.io" />
<data android:scheme="https" android:host="YOUR_APP_NAME.airbridge.io" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="YOUR_APP_URI_SCHEME" />
</intent-filter>
...
</activity>
YOUR_APP_NAME.deeplink.page
: Airbridge アプリリンク バージョン2
YOUR_APP_NAME.airbridge.io
: Airbridge アプリリンク バージョン1
YOUR_APP_URI_SCHEME
: URIスキーム方式のディープリンク
Airbridgeダッシュボードでトラッキングリンクを生成する場合、deeplink.page
または abr.ge
の形のトラッキングリンクを使用できますが、広告主の方ではトラッキングリンクのブランディングおよびクリック率(CTR)の向上のため、以下のような設定をすることで、go.my_company.com/abcd
のようなカスタマイズされたURLをトラッキングリンクとして利用することができます。
1. 使用するカスタムドメインをこちらのガイドに沿って設定してください。
2. res/values/airbridge.xml
ファイルを生成し、設定したカスタムドメインのURLを以下のように追加してください。
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<string-array name="co_ab180_airbridge_custom_domains">
<item>YOUR_CUSTOM_DOMAIN</item>
</string-array>
</resources>
3. 上の方で設定した インテントフィルタ
のように、ディープリンクを処理する アクティビティ
の インテントフィルタ
を以下のように追加してください。
<activity ...>
...
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="http" android:host="YOUR_CUSTOM_DOMAIN" />
<data android:scheme="https" android:host="YOUR_CUSTOM_DOMAIN" />
</intent-filter>
...
</activity>
Attention
ここで追加された
YOUR_CUSTOM_DOMAIN
はAirbridgeダッシュボードに記載された情報と一致しなければいけません。
上記の アクティビティ
で追加した インテントフィルタ
のディープリンクを処理するためには、以下のような作業が必要になります。
@Override
protected void onResume() {
super.onResume();
Airbridge.getDeeplink(getIntent(), new AirbridgeCallback<Uri>() {
@Override
public void onSuccess(Uri uri) {
// Process deeplink data
}
@Override
public void onFailure(Throwable throwable) {
// Error
}
@Override
public void onComplete() {
// After process deeplink data
}
});
}
// The code below is required for proper deeplink processing
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
override fun onResume() {
super.onResume()
Airbridge.getDeeplink(intent, object : AirbridgeCallback<Uri> {
override fun onSuccess(uri: Uri) {
// Process deeplink data
}
override fun onFailure(throwable: Throwable) {
// Error
}
override fun onComplete() {
// After process deeplink data
}
})
}
// The code below is required for proper deeplink processing
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
setIntent(intent)
}
Airbridge SDKでディファードディープリンクが発生する一般的なケースでは、AndroidManiest.xml
に設定された インテントフィルタ
によって自動的にその アクティビティ
が呼び出されます。上記のディープリンクコールバック設定と同じ方法を使って、一括で処理することができます。
ディファードディープリンクから得られた情報で特殊な作業を処理したい時や、ディファードディープリンクによって アクティビティ
が自動的に呼び出される動作を中止したい場合は、以下のように設定することができます。
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setOnDeferredDeeplinkReceiveListener(new OnDeferredDeeplinkReceiveListener() {
@Override
public boolean shouldLaunchReceivedDeferredDeeplink(Uri uri) {
// If you want to open the target activity, please return true otherwise false
// Default returning value = true
return true;
}
})
.build();
Airbridge.init(this, config);
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setOnDeferredDeeplinkReceiveListener(object : OnDeferredDeeplinkReceiveListener {
override fun shouldLaunchReceivedDeferredDeeplink(uri: Uri): Boolean {
// If you want to open the target activity, please return true otherwise false
// Default returning value = true
return true
}
})
.build()
Airbridge.init(this, config)
Airbridge SDKのディープリンク設定が完了した後、以下のようなリンクからアプリのページに正しく遷移するかを確認できます。
YOUR_APP_URI_SCHEME://
ディープリンクの設定および確認が完了すれば、Airbridgeダッシュボード
> Raw Data
> App Real-time Log
タブで以下のように確認できます。
Airbridgeではウェブ(Web)とアプリ(App)間で断片化されたユーザーの貢献度を計測するために、以下のようなユーザーの識別子情報を収集します。
User Email : Eメール
User Phone : 電話番号
User ID : ユーザー固有のID(ユーザーを特定できるID値で、ウェブとアプリで1:1の関係になるもの)
User Alias : ユーザーを表すことができるその他のID (e.g. ロイヤルティプログラム用のID、関連会社の統合IDなど)
入力したユーザーのEメールと電話番号は自動でハッシュ(SHA256)され、サーバーに渡されます。
Airbridge SDKでは以下の方法でユーザーの識別子情報を設定できます。
// Automatically hashed on client side using SHA256
// Can turn off hashing feature with special flag
Airbridge.getCurrentUser().setEmail("testID@ab180.co");
Airbridge.getCurrentUser().setPhone("821012341234");
// Does not hash
Airbridge.getCurrentUser().setId("testID");
Airbridge.getCurrentUser().setAlias("key", "value");
// Clear user data
Airbridge.expireUser()
// Automatically hashed on client side using SHA256
// Can turn off hashing feature with special flag
Airbridge.getCurrentUser().email = "testID@ab180.co"
Airbridge.getCurrentUser().phone = "821012341234"
// Does not hash
Airbridge.getCurrentUser().id = "testID"
Airbridge.getCurrentUser().setAlias("key", "value")
// Clear user data
Airbridge.expireUser()
User Aliasの数は 最大10個
までです。
User Aliasのkeyは Stringタイプ
で、長さは最大128文字です。
User Aliasのkeyは ^[a-z_][a-z0-9_]*$の正規表現
と一致する必要があります。
User Aliasのvalueは Stringタイプ
で、Stringは 最大128文字
です。
ユーザーの識別子情報を一度設定すれば、全てのイベントで識別子情報が一緒に送られます。
MTA(Multi-Touch Attribution)分析の正確性向上、内部データ分析、サードパーティ(3rd Party)ソリューションとの連携などの目的で、ユーザーの追加属性データを設定できます。
Airbridge.getCurrentUser().setAttribute("key", "value");
Airbridge.getCurrentUser().setAttribute("key", "value")
User Attributeの数は 最大100個
までです。
User Attributeのkeyは Stringタイプ
で、長さは 最大128文字
です。
User Attributeのkeyは ^[a-z_][a-z0-9_]*$の正規表現
と一致する必要があります。
User Attributeのvalueは Integer、Float、Long、Booleanタイプ
と Stringタイプ
で、Stringは 最大1024文字
です。
Airbridge SDKで設定したユーザー情報は、Airbridgeダッシュボード
> Raw Data
> App Real-time Log
タブで以下のように確認できます。
SDKにデバイス識別子情報を設定すると、設定後から収集される全てのイベントにデバイス識別情報を追加することができます。デバイス識別子を一度設定すれば、削除しない限り、アプリを終了しても設定は維持されます。
Airbridge.setDeviceAlias("ADD_YOUR_KEY", "AND_YOUR_VALUE")
Airbridge.removeDeviceAlias("DELETE_THIS_KEY")
Airbridge.clearDeviceAlias()
Airbridge.setDeviceAlias("ADD_YOUR_KEY", "AND_YOUR_VALUE");
Airbridge.removeDeviceAlias("DELETE_THIS_KEY");
Airbridge.clearDeviceAlias();
メソッド | 説明 |
---|---|
| 送信したキーと値のペアをデバイス識別子に追加します。 |
| 送信したキーに該当するデバイス識別子を削除します。該当する識別子がない場合、動作はありません。 |
| 全てのデバイス識別子を削除します。 |
Airbridge SDKで呼び出される全てのイベントは、以下のように6つの属性値と一緒に送ることができます。
Event Category : イベント名 Required (String)
Event Action : イベントの属性値 1 (String)
Event Label : イベントの属性値 2 (String)
Event Value : イベントの属性値 3 (Double)
Event Custom Attributes : イベントのカスタムデータ (Map<String, Object>)
Event Semantic Attributes : イベントのセマンティックデータ (Map<String, Object>)
Airbridge SDKでは以下のような方法でイベントを送信することができます。
Number eventValue = 10;
Map<String, Object> eventAttributes = new HashMap<String, Object>();
SemanticAttributes semanticAttributes = new SemanticAttributes();
semanticAttributes.put(SemanticAttributes.KEY_CURRENCY, "USD");
Airbridge.trackEvent(StandardEventCategory.HOME_VIEW, "event_action", "event_label", eventValue, eventAttributes, semanticAttributes);
val eventValue = 10
val eventAttributes = mutableMapOf<String, String>()
val semanticAttributes = mutableMapOf<String, String>()
semanticAttributes[SemanticAttributes.KEY_CURRENCY] = "USD"
Airbridge.trackEvent(StandardEventCategory.HOME_VIEW, "event_action", "event_label", eventValue, eventAttributes, semanticAttributes)
デフォルトのカテゴリータイプではカバーできない要望がある場合、以下のような方法で直接カスタマイズイベントを送信することもできます。
Number eventValue = 10;
Map<String, String> eventAttributes = new HashMap<String, String>();
Map<String, String> semanticAttributes = new HashMap<String, String>();
semanticAttributes.put(SemanticAttributes.KEY_CURRENCY, "USD");
Airbridge.trackEvent("event_category", "event_action", "event_label", eventValue, eventAttributes, semanticAttributes);
val eventValue = 10
val eventAttributes = mutableMapOf<String, String>()
val semanticAttributes = mutableMapOf<String, String>()
semanticAttributes[SemanticAttributes.KEY_CURRENCY] = "USD"
Airbridge.trackEvent("event_category", "event_action", "event_label", eventValue, eventAttributes, semanticAttributes)
また、以下のような方法で、各アプリに合ったイベントをあらかじめ定義されたクラスの形で使用することができます。
class MyAppEvent extends Event {
public MyAppEvent() {
super("my_custom_category");
}
}
...
Airbridge.trackEvent(new MyAppEvent());
...
class MyAppEvent : Event("my_custom_category")
...
Airbridge.trackEvent(MyAppEvent())
...
Airbridge.getCurrentUser().setEmail("me@sample.com");
Airbridge.getCurrentUser().setPhone("821012341234");
Airbridge.getCurrentUser().setId("12345");
Airbridge.getCurrentUser().setAlias("alias1", "value");
Airbridge.getCurrentUser().setAttributes("attr1", 1234);
Airbridge.trackEvent(StandardEventCategory.SIGN_UP);
Airbridge.getCurrentUser().email = "testID@ab180.co"
Airbridge.getCurrentUser().phone = "821012341234"
Airbridge.getCurrentUser().id = "testID"
Airbridge.getCurrentUser().setAlias("alias1", "value")
Airbridge.getCurrentUser().setAttribute("attr1", 1234)
Airbridge.trackEvent(StandardEventCategory.SIGN_UP)
Airbridge.getCurrentUser().setEmail("me@sample.com");
Airbridge.getCurrentUser().setPhone("821012341234");
Airbridge.getCurrentUser().setId("12345");
Airbridge.getCurrentUser().setAlias("alias1", "value");
Airbridge.getCurrentUser().setAttributes("attr1", 1234);
Airbridge.trackEvent(StandardEventCategory.SIGN_IN);
Airbridge.getCurrentUser().email = "testID@ab180.co"
Airbridge.getCurrentUser().phone = "821012341234"
Airbridge.getCurrentUser().id = "testID"
Airbridge.getCurrentUser().setAlias("alias1", "value")
Airbridge.getCurrentUser().setAttribute("attr1", 1234)
Airbridge.trackEvent(StandardEventCategory.SIGN_IN)
Airbridge.trackEvent(StandardEventCategory.SIGN_OUT);
Airbridge.expireUser();
Airbridge.trackEvent(StandardEventCategory.SIGN_OUT)
Airbridge.expireUser()
Airbridge.trackEvent(StandardEventCategory.HOME_VIEW);
Airbridge.trackEvent(StandardEventCategory.HOME_VIEW)
SemanticAttributes semanticAttributes = new SemanticAttributes();
semanticAttributes.setQuery("Coca Cola");
Airbridge.trackEvent(StandardEventCategory.SEARCH_RESULT_VIEW, null, null, null, null, semanticAttributes);
val semanticAttributes = SemanticAttributes()
semanticAttributes.query = "Coca Cola"
Airbridge.trackEvent(StandardEventCategory.SEARCH_RESULT_VIEW, null, null, null, null, semanticAttributes)
Product fanta = new Product();
fanta.setId("fanta_orange");
fanta.setName("FANTA Orange");
fanta.setQuantity(1);
fanta.setCurrency("usd");
fanta.setPrice(1.99);
fanta.setPosition(0);
Product cocacola = new Product();
cocacola.setId("cocacola_low_sugar");
cocacola.setName("Cocacola Low Sugar");
cocacola.setQuantity(1);
cocacola.setCurrency("usd");
cocacola.setPrice(2.99);
cocacola.setPosition(1);
SemanticAttributes semanticAttributes = new SemanticAttributes();
semanticAttributes.setProductListId("beverage_1");
semanticAttributes.setProducts(Arrays.asList(fanta, cocacola));
Airbridge.trackEvent(StandardEventCategory.PRODUCT_LIST_VIEW, null, null, null, null, semanticAttributes);
val fanta = Product()
fanta.id = "fanta_orange"
fanta.name = "FANTA Orange"
fanta.quantity = 1
fanta.currency = "usd"
fanta.price = 1.99
fanta.position = 0
val cocacola = Product()
cocacola.id = "cocacola_low_sugar"
cocacola.name = "Cocacola Low Sugar"
cocacola.quantity = 1
cocacola.currency = "usd"
cocacola.price = 2.99
cocacola.position = 1
val semanticAttributes = SemanticAttributes()
semanticAttributes.productListId = "beverage_1"
semanticAttributes.products = listOf(fanta, cocacola)
Airbridge.trackEvent(StandardEventCategory.PRODUCT_LIST_VIEW, null, null, null, null, semanticAttributes)
Product fanta = new Product();
fanta.setId("fanta_orange");
fanta.setName("FANTA Orange");
fanta.setQuantity(1);
fanta.setCurrency("usd");
fanta.setPrice(1.99);
fanta.setPosition(0);
Product cocacola = new Product();
cocacola.setId("cocacola_low_sugar");
cocacola.setName("Cocacola Low Sugar");
cocacola.setQuantity(1);
cocacola.setCurrency("usd");
cocacola.setPrice(2.99);
cocacola.setPosition(1);
SemanticAttributes semanticAttributes = new SemanticAttributes();
semanticAttributes.setProducts(Arrays.asList(fanta, cocacola));
Airbridge.trackEvent(StandardEventCategory.PRODUCT_DETAILS_VIEW, null, null, null, null, semanticAttributes);
val fanta = Product()
fanta.id = "fanta_orange"
fanta.name = "FANTA Orange"
fanta.quantity = 1
fanta.currency = "usd"
fanta.price = 1.99
fanta.position = 0
val cocacola = Product()
cocacola.id = "cocacola_low_sugar"
cocacola.name = "Cocacola Low Sugar"
cocacola.quantity = 1
cocacola.currency = "usd"
cocacola.price = 2.99
cocacola.position = 1
val semanticAttributes = SemanticAttributes()
semanticAttributes.products = listOf(fanta, cocacola)
Airbridge.trackEvent(StandardEventCategory.PRODUCT_DETAILS_VIEW, null, null, null, null, semanticAttributes)
Product fanta = new Product();
fanta.setId("fanta_orange");
fanta.setName("FANTA Orange");
fanta.setQuantity(1);
fanta.setCurrency("usd");
fanta.setPrice(1.99);
fanta.setPosition(0);
Product cocacola = new Product();
cocacola.setId("cocacola_low_sugar");
cocacola.setName("Cocacola Low Sugar");
cocacola.setQuantity(1);
cocacola.setCurrency("usd");
cocacola.setPrice(2.99);
cocacola.setPosition(1);
SemanticAttributes semanticAttributes = new SemanticAttributes();
semanticAttributes.setCartId("cart_123");
semanticAttributes.setProducts(Arrays.asList(fanta, cocacola));
semanticAttributes.setCurrency("usd");
Event event = new Event(StandardEventCategory.ADD_TO_CART);
event.setValue(4.98);
event.setSemanticAttributes(semanticAttributes);
Airbridge.trackEvent(event);
val fanta = Product()
fanta.id = "fanta_orange"
fanta.name = "FANTA Orange"
fanta.quantity = 1
fanta.currency = "usd"
fanta.price = 1.99
fanta.position = 0
val cocacola = Product()
cocacola.id = "cocacola_low_sugar"
cocacola.name = "Cocacola Low Sugar"
cocacola.quantity = 1
cocacola.currency = "usd"
cocacola.price = 2.99
cocacola.position = 1
val event = Event(StandardEventCategory.ADD_TO_CART).apply {
value = 4.98
semanticAttributes = SemanticAttributes().apply {
cartId = "cart_123"
products = listOf(fanta, cocacola)
currency = "usd"
}
}
Airbridge.trackEvent(event)
Product fanta = new Product();
fanta.setId("fanta_orange");
fanta.setName("FANTA Orange");
fanta.setQuantity(1);
fanta.setCurrency("usd");
fanta.setPrice(1.99);
fanta.setPosition(0);
Product cocacola = new Product();
cocacola.setId("cocacola_low_sugar");
cocacola.setName("Cocacola Low Sugar");
cocacola.setQuantity(1);
cocacola.setCurrency("usd");
cocacola.setPrice(2.99);
cocacola.setPosition(1);
SemanticAttributes semanticAttributes = new SemanticAttributes();
semanticAttributes.setProducts(Arrays.asList(fanta, cocacola));
semanticAttributes.setCurrency("usd");
semanticAttributes.setInAppPurchased(true);
Event event = new Event(StandardEventCategory.ORDER_COMPLETED);
event.setValue(4.98);
event.setSemanticAttributes(semanticAttributes);
Airbridge.trackEvent(event);
val fanta = Product()
fanta.id = "fanta_orange"
fanta.name = "FANTA Orange"
fanta.quantity = 1
fanta.currency = "usd"
fanta.price = 1.99
fanta.position = 0
val cocacola = Product()
cocacola.id = "cocacola_low_sugar"
cocacola.name = "Cocacola Low Sugar"
cocacola.quantity = 1
cocacola.currency = "usd"
cocacola.price = 2.99
cocacola.position = 1
val event = Event(StandardEventCategory.ORDER_COMPLETED).apply {
value = 4.98
semanticAttributes = SemanticAttributes().apply {
products = listOf(fanta, cocacola)
currency = "usd"
inAppPurchased = true
}
}
Airbridge.trackEvent(event)
Airbridge SDKから送信されたイベント情報はAirbridgeダッシュボード
> Raw Data
> App Real-time Log
タブで以下のように確認できます。
内部でのデータ分析などのため、ハッシュ(SHA256)せずにユーザーの識別子情報を送信したい場合、以下のような設定をすることでユーザーのEメールや電話番号などの情報のハッシュ化(SHA256)を中止することができます。
Attention
このオプションはユーザーのEメールや電話番号など、敏感な個人情報を第3者に提供することになるため、あらかじめ内部的なセキュリティ措置が必要となります。
// Default User Info Hash Enabled = true
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setHashUserInformationEnabled(false)
.build()
Airbridge.initializeSDK(this, option)
// Default User Info Hash Enabled = true
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setHashUserInformationEnabled(false)
.build();
Airbridge.initializeSDK(this, option);
Airbridge SDKでは以下のような処理をすることで、特定のセッション時間内にユーザーがアプリを再起動しても同じセッションと判断し、アプリ実行イベントを再送信しないように変更することができます。
// Default Session Timeout = 5 minutes
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setSessionTimeoutSeconds(300)
.build();
Airbridge.init(this, config);
// Default Session Timeout = 5 minutes
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setSessionTimeoutSeconds(15)
.build()
Airbridge.init(this, config)
この機能はGDPRやCCPAのように、お客様から個人情報保護に関する同意を得てデータを収集、送信するときに有効な機能です。
以下のような方法でデータの収集や送信を開始できます。
// Default Auto Start Tracking Enabled = true
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setAutoStartTrackingEnabled(false)
.build();
Airbridge.init(this, config);
...
// Set a variable like below
if (properties.isGDPRAccepted) {
Airbridge.startTracking();
}
// Default Auto Start Tracking Enabled = true
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setAutoStartTrackingEnabled(false)
.build()
Airbridge.init(this, config)
...
// Set a variable like below
if (properties.isGDPRAccepted) {
Airbridge.startTracking()
}
広告主のアプリ内で複数のディープリンクの動作があり、Airbridgeでリエンゲージメントの成果を確認しにくい場合、以下のような設定をすることで、Airbridgeのディープリンクからの成果のみフィルタリングすることができます。
この機能を有効化すると、以下の条件付きのディープリンクからアプリが起動された場合のみ、ディープリンクの成果として計測します。
ダッシュボードに登録された形のディープリンクからアプリが起動された場合
airbridge.io
のディープリンクからアプリが起動された場合
deeplink.page
のディープリンクからアプリが起動された場合
airbridge_referrer
クエリ情報が存在する場合
// Default Airbridge Link Only = false
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setTrackAirbridgeLinkOnly(true)
.build();
Airbridge.init(this, config);
// Default Airbridge Link Only = false
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setTrackAirbridgeLinkOnly(true)
.build()
Airbridge.init(this, config)
簡単な設定で、FacebookのディファードアプリリンクをAirbridge SDKで一緒に取得することができます。
参照 - https://developers.facebook.com/docs/app-events/getting-started-app-events-android
参照 - https://developers.facebook.com/docs/app-ads/deep-linking
project/build.gradle
ファイルにリポジトリを追加してください。
allprojects {
...
repositories {
...
mavenCentral()
...
}
...
}
app/build.gradle
ファイルのdependenciesのブロック内に以下の内容を追加してください。
dependencies {
...
implementation 'com.facebook.android:facebook-android-sdk:latest.release'
...
}
app/res/values/string.xml
ファイルに以下のようなストリングを追加してください。
...
<string name="facebook_app_id">FACEBOOK_APP_ID</string>
<string name="facebook_client_token">FACEBOOK_CLIENT_TOKEN</string>
...
AndroidManifest.xml
ファイルの <application>
要素の中に以下のような <meta-data>
を追加してください。
...
<application android:label="@string/app_name" ...>
...
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/facebook_app_id"/>
<meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/facebook_client_token"/>
...
</application>
...
以下のオプションを true
に設定してください。
// Default Facebook Deferred App Link Enabled = false
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setFacebookDeferredAppLinkEnabled(true)
.build();
Airbridge.init(this, config);
// Default Facebook Deferred App Link Enabled = false
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setFacebookDeferredAppLinkEnabled(true)
.build()
Airbridge.init(this, config)
Firebase Cloud Messaging(FCM)を使ったアプリのアンインストールトラッキング設定は、Airbridge SDK
v2.6.0
以降のバージョンから利用できます。
アプリのアンインストールトラッキング設定に関する詳細はこちらのページを参照してください。
Airbridge SDKでは、以下のような方法でユーザーの位置情報を収集することができます。
Attention
位置情報は合法的な目的と方法で収集することが大前提となるため、この機能の使用には注意が必要です。
// Choose one
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
...
// Default Location Collection Enabled = false
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setLocationCollectionEnabled(true)
.build();
Airbridge.init(this, config);
// Default Location Collection Enabled = false
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setLocationCollectionEnabled(true)
.build()
Airbridge.init(this, config)
Attention
Airbridge SDKでは直近の位置情報を収集します。GPS情報がない状態では、当該権限の付与と設定が完了していても値が存在しない場合があります。
広告主はマーケット(GooglePlay Store, One Store, Huawei Store, Galaxy Store ...)別のアプリのインストール成果を分析したい時、以下のように各マーケットに登録するアプリの識別子を設定することで、マーケット別のデータをAirbridgeダッシュボードで確認することができます。
android:value
にマーケット名(playStore
、 oneStore
、 huaweiStore
、 galaxyStore
)を追加します。
...
<application android:label="@string/app_name" ...>
...
<meta-data android:name="co.ab180.airbridge.app_market_identifier" android:value="playStore"/>
...
</application>
...
setAppMarketIdentifierにマーケット名(playStore
、 oneStore
、 huaweiStore
)を値として追加します。
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setAppMarketIdentifier("playStore")
.build();
Airbridge.init(this, config);
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setAppMarketIdentifier("playStore") // oneStore, huaweiStore ...
.build()
Airbridge.init(this, config)
Actuals Reportのグループバイで Event Property > App Market Identifier、または Raw Data Export (App)のグループバイで Event Property > App Market Identifier を選択するとデータを確認できます。
App Market Identifier基準のインストール数
Airbridge SDKでは品質向上のため、SDK内部でエラーが発生した場合、その情報をAirbridgeサーバーに送信しています。Airbridgeサーバーへの送信を中止したい場合は、以下のように設定してください。
// Default Error Log Collection Enabled = true
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setErrorLogCollectionEnabled(false)
.build();
Airbridge.init(this, config);
// Default Error Log Collection Enabled = true
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setErrorLogCollectionEnabled(false)
.build()
Airbridge.init(this, config)
Airbridge SDKではイベントバッファを使ってイベントデータの送信を管理しています。以下のような設定をすることで、Airbridgeイベントバッファの上限を設けることができます。
int count = 10;
long bytes = 1000000L;
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setEventMaximumBufferCount(count)
.setEventMaximumBufferSize(bytes)
.build();
Airbridge.init(this, config);
val count = 1_000
val bytes = 1_000_000L
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setEventMaximumBufferCount(count)
.setEventMaximumBufferSize(bytes)
.build()
Airbridge.init(this, config)
イベントバッファのサイズはメタデータの管理などにより、実際に使用するデータよりはやや小さくなっています。
Airbridge SDKでは以下のような処理をすることで、イベント送信周期を設定できます。
// Default Event Transmit Interval = 0 millisecond
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setEventTransmitInterval(3000)
.build();
Airbridge.init(this, config);
// Default Event Transmit Interval = 0 millisecond
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setEventTransmitInterval(3000)
.build()
Airbridge.init(this, config)
Attention
インターバルタイムとしてマイナスの値を入力すると、
IllegalArgumentException
(ランタイムエラー)が発生します。
Airbridge SDKでは以下のような処理をすることで、セッション中に発生したライフサイクルイベント(ORGANIC_REOPEN
, FOREGROUND
)を収集するように設定できます。
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setTrackInSessionLifeCycleEventEnabled(true)
.build();
Airbridge.init(this, config);
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setTrackInSessionLifeCycleEventEnabled(true)
.build()
Airbridge.init(this, config)
Airbridge SDKでは以下のような処理をすることで、サーバに送信できずデバイス内のDBに保存されているイベントを削除する機能を追加することができます。
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setResetEventBufferEnabled(true)
.build();
Airbridge.init(this, config);
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setResetEventBufferEnabled(true)
.build()
Airbridge.init(this, config)
Airbridge SDKはアプリ内でトラッキングリンクを開ける機能を提供し、ブラウザを通さなくても他の画面に遷移することができます。
Airbridge.click("https://abr.ge/~~~")
Airbridge.impression("https://abr.ge/~~~")
トラッキングリンクがクリックされた時に呼び出します。トラッキングリンクのクリックの統計を追加し、設定されたアプリ、ウェブまたはフォールバックに移動します。
トラッキングリンクがUIに表示された時に呼び出します。トラッキングリンクのインプレッションの統計を1つ追加します。
Attention
カスタムドメインを使用している場合、カスタムShort IDを含むトラッキングリンクは使用できません。
example1) http://deeplink.ab180.co/custom → 使用不可
example2) http://deeplink.ab180.co/a3b1c2 → 使用可能
example3) https://abr.ge/a3b1c2 → 使用可能
Airbridge SDKでは以下のような処理をすることで、Airbridgeの全ての機能をオフにすることができます。
AirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setSdkEnabled(false)
.build();
Airbridge.init(this, config);
val config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setSdkEnabled(false)
.build()
Airbridge.init(this, config)
Attention
「処理失敗イベントの削除設定」と「Airbridge停止設定」が全て設定されている場合、「Airbridge停止設定」が優先されるため、「処理失敗イベントの削除設定」は無効になります。
ウェブSDKをインストールしただけでは、アプリのインストールおよび実行、またはディープリンクの呼び出しなどの追加的なイベントをトラッキングできません。Airbridgeでは以下のような設定をすることで、ハイブリッドアプリからアプリ内イベントを簡単に呼び出すことができます。
Attention
ハイブリッドアプリの連携のためには、あらかじめAirbridge SDKのインストールおよび設定をする必要があります。
対象のWebViewに、以下のように Airbridge :::setJavascriptInterface
の関数を呼び出してください。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initWebView();
}
void initWebView() {
webView = findViewById(R.id.webView);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setDomStorageEnabled(true);
Airbridge.setJavascriptInterface(webView, "YOUR_WEB_SDK_TOKEN");
webView.setWebChromeClient(new WebChromeClient());
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("http://dev.blog.airbridge.io/websdk-web-app/");
}
}
class MainActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
initWebView()
}
fun initWebView() {
webView.settings.javaScriptEnabled = true
webView.settings.domStorageEnabled = true
Airbridge.setJavascriptInterface(webView, "YOUR_WEB_TOKEN")
webView.webChromeClient = WebChromeClient()
webView.webViewClient = WebViewClient()
webView.loadUrl("http://my_company.com/main")
}
}
ここでの YOUR_WEB_SDK_TOKEN は Airbridgeダッシュボード
> Settings
> Tokens
タブで確認できます。
この設定を完了した後、実際に使用するウェブページで、利用ガイドに沿ってウェブSDKを初期化してください。
ウェブSDK利用ガイド:リンク
java.lang.NoClassDefFoundError: kotlin/coroutines/AbstractCoroutineContextKey
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1016)
...
@qwwdfsad によると、kotlinx-coroutines-core
の V1.3.5
以上のライブラリを使う際には、必ず kotlin-stdlib
V1.3.70
以上のライブラリを使うように強制しています。
gradlew dependencies
コマンドを使って、現在の kotlinx-coroutines-core
ライブラリが V1.3.5
以上の場合、kotlin-stdlib
のライブラリが V1.3.70
以上か確認してください。
Androidアプリで自動バックアップ
が必要な場合、自動バックアップルール
の定義が必要です。この場合、Airbridge SDKでは内部データの自動コピーを防止するため、別途 airbridge_auto_backup_rules.xml
を AndroidManifest.xml
に定義しています。そのため、ビルドする時に Manifest merger failed : Attribute application@fullBackupContent value=(true)
のような衝突が発生することがあります。
このような衝突が発生した場合、tools:replace="android:fullBackupContent"
の設定と、上記のカスタムオートバックアップルールのファイルに追加のマージ作業が必要になります。Airbridge SDKで定義する自動バックアップルール
は以下の通りです。
<?xml version="1.0" encoding="utf-8"?>
<full-backup-content>
<exclude domain="sharedpref" path="airbridge-internal" />
<exclude domain="sharedpref" path="airbridge-install" />
<exclude domain="sharedpref" path="airbridge-user-info" />
<exclude domain="sharedpref" path="airbridge-user-alias" />
<exclude domain="sharedpref" path="airbridge-user-attributes" />
<exclude domain="database" path="airbridge.db" />
</full-backup-content>
HashMap<String, Object> semanticAttributes = new HashMap();
semanticAttributes.put("products", Arrays.asList(
// double brace initialization issue
new HashMap<String, Object>() {{
put("name", "MacBook Pro");
put("price", 1548200);
put("position", 1);
put("brandID", 23);
put("brandName", "apple");
}},
new HashMap<String, Object>() {{
put("name", "MacBook Air");
put("price", 1500000);
put("position", 2);
put("brandID", 23);
put("brandName", "apple");
}}
)
);
HashMap<String, Object> customAttributes = new HashMap();
customAttributes.put("customKey", "customValue");
Airbridge.trackEvent(
"purchase",
"action",
"label",
3048200,
customAttributes,
semanticAttributes
);
Android SDKはGoogleのGSONライブラリを使っています。このライブラリにはDouble Brace Initialization関連の既知の問題があります。そのため、上記のJavaコードのように、Productsのオブジェクトを作る際にDouble Brace Initializationを使うとproductsのデータが欠落することがあるため、決済完了のコードの例のように、直接Productオブジェクトを作って使用することを推奨します。
このページは役に立ちましたか?