ダッシュボードには以下の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.keystore3. 下記のように 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:99Android 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ダッシュボードに記載された情報と一致しなければいけません。
上記の アクティビティ で追加した インテントフィルタ のディープリンクを処理するためには、以下のような作業が必要になります。
@Overrideprotected 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@Overrideprotected 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 processingoverride 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 flagAirbridge.getCurrentUser().setEmail("testID@ab180.co");Airbridge.getCurrentUser().setPhone("821012341234"); // Does not hash Airbridge.getCurrentUser().setId("testID");Airbridge.getCurrentUser().setAlias("key", "value"); // Clear user dataAirbridge.expireUser()// Automatically hashed on client side using SHA256// Can turn off hashing feature with special flagAirbridge.getCurrentUser().email = "testID@ab180.co"Airbridge.getCurrentUser().phone = "821012341234" // Does not hash Airbridge.getCurrentUser().id = "testID"Airbridge.getCurrentUser().setAlias("key", "value") // Clear user dataAirbridge.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 = 10val 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 = 10val 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.setCurrency("usd");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 = 1fanta.currency = "usd"fanta.price = 1.99fanta.position = 0 val cocacola = Product()cocacola.id = "cocacola_low_sugar"cocacola.name = "Cocacola Low Sugar"cocacola.quantity = 1cocacola.currency = "usd"cocacola.price = 2.99cocacola.position = 1 val semanticAttributes = SemanticAttributes()semanticAttributes.productListId = "beverage_1"semanticAttributes.currency = "usd"semanticAttributes.products = listOf(fanta, cocacola)Airbridge.trackEvent( category = StandardEventCategory.PRODUCT_LIST_VIEW, semanticAttributes = 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.setCurrency("usd");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 = 1fanta.currency = "usd"fanta.price = 1.99fanta.position = 0 val cocacola = Product()cocacola.id = "cocacola_low_sugar"cocacola.name = "Cocacola Low Sugar"cocacola.quantity = 1cocacola.currency = "usd"cocacola.price = 2.99cocacola.position = 1 val semanticAttributes = SemanticAttributes()semanticAttributes.currency = "usd"semanticAttributes.products = listOf(fanta, cocacola)Airbridge.trackEvent( category = StandardEventCategory.PRODUCT_DETAILS_VIEW, semanticAttributes = 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 = 1fanta.currency = "usd"fanta.price = 1.99fanta.position = 0 val cocacola = Product()cocacola.id = "cocacola_low_sugar"cocacola.name = "Cocacola Low Sugar"cocacola.quantity = 1cocacola.currency = "usd"cocacola.price = 2.99cocacola.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 = 1fanta.currency = "usd"fanta.price = 1.99fanta.position = 0 val cocacola = Product()cocacola.id = "cocacola_low_sugar"cocacola.name = "Cocacola Low Sugar"cocacola.quantity = 1cocacola.currency = "usd"cocacola.price = 2.99cocacola.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 = trueAirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN") .setHashUserInformationEnabled(false) .build();Airbridge.initializeSDK(this, option);// Default User Info Hash Enabled = trueval option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN") .setHashUserInformationEnabled(false) .build()Airbridge.initializeSDK(this, option)Airbridge SDKでは以下のような処理をすることで、特定のセッション時間内にユーザーがアプリを再起動しても同じセッションと判断し、アプリ実行イベントを再送信しないように変更することができます。
// Default Session Timeout = 5 minutesAirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN") .setSessionTimeoutSeconds(300) .build();Airbridge.init(this, config);// Default Session Timeout = 5 minutesval config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN") .setSessionTimeoutSeconds(15) .build()Airbridge.init(this, config)この機能はGDPRやCCPAのように、お客様から個人情報保護に関する同意を得てデータを収集、送信するときに有効な機能です。
以下のような方法でデータの収集や送信を開始できます。
// Default Auto Start Tracking Enabled = trueAirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN") .setAutoStartTrackingEnabled(false) .build();Airbridge.init(this, config); ... // Set a variable like belowif (properties.isGDPRAccepted) { Airbridge.startTracking();}// Default Auto Start Tracking Enabled = trueval config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN") .setAutoStartTrackingEnabled(false) .build()Airbridge.init(this, config) ... // Set a variable like belowif (properties.isGDPRAccepted) { Airbridge.startTracking()}広告主のアプリ内で複数のディープリンクの動作があり、Airbridgeでリエンゲージメントの成果を確認しにくい場合、以下のような設定をすることで、Airbridgeのディープリンクからの成果のみフィルタリングすることができます。
この機能を有効化すると、以下の条件付きのディープリンクからアプリが起動された場合のみ、ディープリンクの成果として計測します。
ダッシュボードに登録された形のディープリンクからアプリが起動された場合
airbridge.ioのディープリンクからアプリが起動された場合
deeplink.pageのディープリンクからアプリが起動された場合
airbridge_referrerクエリ情報が存在する場合
// Default Airbridge Link Only = falseAirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN") .setTrackAirbridgeLinkOnly(true) .build();Airbridge.init(this, config);// Default Airbridge Link Only = falseval 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 = falseAirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN") .setFacebookDeferredAppLinkEnabled(true) .build();Airbridge.init(this, config);// Default Facebook Deferred App Link Enabled = falseval 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 = falseAirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN") .setLocationCollectionEnabled(true) .build();Airbridge.init(this, config);// Default Location Collection Enabled = falseval 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 = trueAirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN") .setErrorLogCollectionEnabled(false) .build();Airbridge.init(this, config);// Default Error Log Collection Enabled = trueval 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_000val bytes = 1_000_000Lval 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 millisecondAirbridgeConfig config = new AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN") .setEventTransmitInterval(3000) .build();Airbridge.init(this, config);// Default Event Transmit Interval = 0 millisecondval config = AirbridgeConfig.Builder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN") .setEventTransmitInterval(3000) .build()Airbridge.init(this, config)Attention
インターバルタイムとしてマイナスの値を入力すると、
IllegalArgumentException(ランタイムエラー)が発生します。
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オブジェクトを作って使用することを推奨します。
メソッド | 説明 |
|---|---|
| 送信したキーと値のペアをデバイス識別子に追加します。 |
| 送信したキーに該当するデバイス識別子を削除します。該当する識別子がない場合、動作はありません。 |
| 全てのデバイス識別子を削除します。 |
このページは役に立ちましたか?