提示
本指南介绍如何安装和设置 Android SDK(v4)。如需了解以前的版本,请参阅 Android SDK(v2)。
您可以通过以下方法安装 Airbridge Android SDK。安装后,您可以通过 测试 Android SDK 来检查 SDK 是否正确安装。
1. 请在 Project build.gradle
文件的 repositories
块中声明 Airbridge maven 仓库。
allprojects {
repositories {
maven { url "https://sdk-download.airbridge.io/maven" }
}
}
allprojects {
repositories {
maven("https://sdk-download.airbridge.io/maven")
}
}
2. 请在 Application 的 gradle
文件中,添加 Airbridge Android SDK 包。
dependencies {
// Get the latest version from https://sdk-download.airbridge.io/maven
implementation "io.airbridge:sdk-android:HERE_LATEST_VERSION"
// For example
// implementation "io.airbridge:sdk-android:0.0.0"
}
dependencies {
// Get the latest version from https://sdk-download.airbridge.io/maven
implementation("io.airbridge:sdk-android:HERE_LATEST_VERSION")
// For example
// implementation("io.airbridge:sdk-android:0.0.0")
}
提示
Airbridge Android SDK 需要 1.4 及以上版本的 Kotlin stdlib 和 Kotlinx coroutines 库。
Airbridge Android SDK 同时使用 JetBrains 的 Kotlin 和 Coroutines 库。
如果使用 .aar
手动安装 SDK,需要将以下 Dependency 库添加到 Project 中:
提示
请根据需求选择 General SDK 或 Restricted SDK, 只能安装其中一个。
根据政策或环境,可能需要对收集 设备 ID(例如 GAID 和 IDFA)进行限制。如果安装 Restricted SDK,Airbridge SDK 不会收集设备 ID。
请按照以下说明安装 Restricted SDK:
1. 请在 Project build.gradle
文件的 repositories
块中声明 Airbridge maven 仓库。
allprojects {
repositories {
maven { url "https://sdk-download.airbridge.io/maven" }
}
}
allprojects {
repositories {
maven("https://sdk-download.airbridge.io/maven")
}
}
2. 请在 Application 的 gradle
文件中,添加 Airbridge Android SDK 包。
dependencies {
// Get the latest version from https://sdk-download.airbridge.io/maven
implementation "io.airbridge:sdk-android-restricted:HERE_LATEST_VERSION"
// For example
// implementation "io.airbridge:sdk-android-restricted:0.0.0"
}
dependencies {
// Get the latest version from https://sdk-download.airbridge.io/maven
implementation("io.airbridge:sdk-android-restricted:HERE_LATEST_VERSION")
// For example
// implementation("io.airbridge:sdk-android-restricted:0.0.0")
}
提示
Airbridge Android SDK 需要 1.4 及以上版本的 Kotlin stdlib 和 Kotlinx coroutines 库。
Airbridge Android SDK 同时使用 JetBrains 的 Kotlin 和 Coroutines 库。
如果使用 .aar
手动安装 SDK,需要将以下 Dependency 库添加到 Project 中:
建议在 Android Application class 中初始化 Airbridge Android SDK。
1. 请创建 Application class。
import android.app.Application
class AndroidApplication: Application() {
override fun onCreate() {
super.onCreate()
}
}
import android.app.Application;
public class AndroidApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
}
}
2. 请在 AndroidManifest.xml
中设置在步骤 1. 创建的 Application。
<application
android:name=".AndroidApplication"
...>
3. 请从 Application class 导入 Airbridge
。
import co.ab180.airbridge.Airbridge
import co.ab180.airbridge.Airbridge;
4. 请在 AndroidManifest.xml
中注册的 Application class 文件中添加以下代码。
YOUR_APP_NAME 和 YOUR_APP_SDK_TOKEN 可在 Airbridge 面板的 [设置]>[Token] 获取。
override fun onCreate() {
super.onCreate()
// YOUR_APP_NAME: input your app name
// YOUR_APP_SDK_TOKEN: input your app token
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.build()
Airbridge.initializeSDK(this, option)
}
@Override
public void onCreate() {
super.onCreate();
// YOUR_APP_NAME: input your app name
// YOUR_APP_SDK_TOKEN: input your app token
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.build();
Airbridge.initializeSDK(this, option);
}
注意
为确保正常工作,请在
Application
class 的onCreate
时调用initializeSDK
函数。
5. 请设置以下权限:
Airbridge Android SDK 需要通过网络传输事件的权限。
请在 Application 的 AndroidManifest.xml
添加以下权限:
<manifest ...>
...
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
...
</manifest>
根据 Google 政策,针对 Android 13(API 33)及以上版本的 App 必须在 AndroidManifest.xml
文件中声明 Google Play 服务的一般权限才能获取设备的广告 ID(Advertising ID,简称 ADID)。
从 2.13.0 版本起,Airbridge Android SDK 会自动添加 AD_ID 权限,以获取 ADID。
如果未设置 LAT(Limit Ad Tracking,限制广告跟踪),但 GAID(Google Advertising ID,Google 广告 ID)显示为 00000000-0000-0000-0000-000000000000,则是由于 AD_ID 权限被第三方库等排除所致,请使用以下代码添加 AD_ID 权限以解决问题。
<manifest ...>
...
<uses-permission android:name="com.google.android.gms.permission.AD_ID" />
...
</manifest>
提示
此功能并非必需功能,请在设置前确认需求。
Opt-in 政策是指在用户同意之前不使用用户信息。
请将 setAutoStartTrackingEnabled
函数设置为 false
后,在可以收集事件时调用 startTracking
函数。从调用 startTracking
函数的时刻起,才开始收集事件。
1. 请在 Application class 进行初始化。请使用 setAutoStartTrackingEnabled
函数防止事件追踪在初始化后自动启用。
// Default Auto Start Tracking Enabled = true
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setAutoStartTrackingEnabled(false)
.build()
Airbridge.initializeSDK(this, option)
// Default Auto Start Tracking Enabled = true
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setAutoStartTrackingEnabled(false)
.build();
Airbridge.initializeSDK(this, option);
2. 请收集用户对个人信息收集和使用的响应。如果用户同意收集和使用个人信息,则开始事件追踪。
// Set a variable like below
if (properties.isGDPRAccepted) {
Airbridge.startTracking()
}
// Set a variable like below
if (properties.isGDPRAccepted) {
Airbridge.startTracking();
}
提示
此功能并非必需功能,请在设置前确认需求。
Opt-out 政策是指在用户拒绝之前使用用户信息。
请将 setAutoStartTrackingEnabled
设置为 true
后,在无法收集事件时调用 stopTracking
函数。从调用 stopTracking
函数的时刻起,将不再收集事件。
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setAutoStartTrackingEnabled(true)
.build()
Airbridge.initializeSDK(this, option)
...
Airbridge.stopTracking()
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setAutoStartTrackingEnabled(true)
.build();
Airbridge.initializeSDK(this, option);
...
Airbridge.stopTracking();
提示
此功能并非必需功能,请在设置前确认需求。
您可以通过 SDK 签名防止 SDK 伪造(SDK Spoofing)。
SDK 签名设置需要 SDK 签名凭证。SDK 签名凭证包括 Secret 和 Secret ID。您可以在 Airbridge 面板中获取 SDK 签名凭证。SDK 签名凭证的更多信息,请参阅 本指南。
您可以通过在 SDK 初始化代码之前调用 setSDKSignature
函数来设置 SDK 签名。
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setSDKSignature("YOUR_SDK_SIGNATURE_SECRET_ID", "YOUR_SDK_SIGNATURE_SECRET")
.build()
Airbridge.initializeSDK(this, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setSDKSignature("YOUR_SDK_SIGNATURE_SECRET_ID", "YOUR_SDK_SIGNATURE_SECRET")
.build();
Airbridge.initializeSDK(this, option);
SDK 设置需要以下信息:
YOUR_APP_NAME:Airbridge App 名称,可在 Airbridge 面板的 [设置]>[Token] 中查看。
YOUR_APP_SDK_TOKEN:Android SDK Token,可在 Airbridge 面板的 [设置]>[Token] 中查看。
YOUR_SDK_SIGNATURE_SECRET:Secret,可在 Airbridge 面板的 [规则管理]>[作弊验证规则]>[SDK 签名] 中查看。
YOUR_SDK_SIGNATURE_SECRET_ID:Secret ID,可在 Airbridge 面板的 [规则管理]>[作弊验证规则]>[SDK 签名] 中查看。
您可以通过设置深度链接,将点击包含追踪链接的广告的用户跳转至 App 的特定页面。此外,还可以基于追踪链接收集的信息,在 Airbridge 面板查看通过深度链接产生的绩效。
Airbridge 在创建追踪链接时,会根据环境自动选用最适合的 Airbridge 深度链接来实现用户跳转。用于实现用户跳转的链接被称为 URI Scheme 深度链接。
Airbridge 深度链接:https://YOUR_APP_NAME.airbridge.io/~~~
URI Scheme 深度链接:YOUR_SCHEME://product/12345
当 App 已安装时,用户点击追踪链接后,App 将通过 Airbridge 深度链接打开。随后,Airbridge SDK 会将该 Airbridge 深度链接转换为追踪链接中配置的 URI Scheme 深度链接,并将转换后的 URI Scheme 深度链接传递给 App。
当 App 未安装时,用户点击追踪链接后,Airbridge 深度链接信息将被保存。用户被发送至应用商店或网站安装并打开 App 后,Airbridge SDK 会将保存的 Airbridge 深度链接转换为 URI Scheme 深度链接,并将转换后的 URI Scheme 深度链接传递给 App。
请按照以下步骤设置深度链接。请准备在 Airbridge 面板中注册的深度链接信息和用户跳转目的地的 App 内页面地址。
首先,请在 Airbridge 面板注册深度链接信息。
请前往 [追踪链接]>[深度链接] 并输入以下信息:
Android URI Scheme:根据 Android URI Scheme,将 Airbridge 深度链接转换为 URI Scheme 深度链接。App Link 和 URI Scheme 需要此信息。
Android 包名:用于识别 Android 包。App Link 和 URI Scheme 需要此信息。
Android sha256_cert_fingerprints:用于设置 App Link 域名。App Link 需要此信息。
注意
为确保正确的用户跳转,请为正式版 App 和开发用 App 注册不同的 Android URI Scheme 和 sha256_cert_fingerprints。
请按照以下步骤将上述信息注册至 Airbridge 面板。
1. 请前往 [追踪链接]>[深度链接]。
2. 请在 [Android URI Scheme] 中输入 Android URI Scheme,该 URI Scheme 必须与 ://
一起输入。例如,如果 Android URI Scheme 是 demo
,则输入 demo://
。
3. 请在 [Android 包名] 中输入 Android 包名。
4. 为了获取 sha256_cert_fingerprints,请在部署的 keystore 文件中运行以下命令:
keytool -list -v -keystore YOUR_KEYSTORE.keystore
请查看结果中的 SHA256 值。SHA256 值即是 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
5. 请在 [sha256_cert_fingerprints] 中输入在步骤 4. 获取的 SHA256 值。
在 Airbridge 面板输入深度链接信息后,请进行设置启用以下功能:
使用 Airbridge 深度链接启用 App
使用 Airbridge 深度链接实现用户跳转
请按照以下步骤进行设置,以确保用户点击追踪链接后,App 能通过 Airbridge 深度链接启用。
1. 请添加处理深度链接的 Activity。将 Activity class 文件添加到 src 中。
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
class DeeplinkActivity: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
}
}
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
public class DeeplinkActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
请在 AndroidManifest.xml
文件添加该 Activity。
<application
...>
<activity android:name=".DeeplinkActivity" />
</application>
2. 为了在 App 设置 Airbridge 深度链接的 URI Scheme 深度链接,请在 AndroidManifest.xml
的处理深度链接的 Activity 中添加 Intent Filter。
添加的 Intent Filter 必须使用在 Airbridge 面板中注册的 Android URI Scheme。请输入 Android URI Scheme,不包括 ://
。
<activity ...>
...
<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_SCHEME" />
</intent-filter>
...
</activity>
注意
必须输入不包括
://
的 Android URI Scheme。
3. 为了在 App 设置 Airbridge 深度链接的 App Link,请在 AndroidManifest.xml
的处理深度链接的 Activity 中添加以下 Intent Filter。
YOUR_APP_NAME
是 Airbridge App 名称。
<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>
...
</activity>
启用 Airbridge 深度链接时,处理深度链接的 Activity 会使用 Airbridge.handleDeeplink
函数将 Airbridge 深度链接转换为 URI Scheme 深度链接。
转换后的 URI Scheme 深度链接将用户发送至预设的目标页面。
// when activity is opened with scheme deeplink or app links
override fun onResume() {
super.onResume()
// handle airbridge deeplink
val isHandled = Airbridge.handleDeeplink(intent) {
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
}
if (isHandled) return
// when app is opened with other deeplink
// use existing logic as it is
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
setIntent(intent)
}
// when activity is opened with scheme deeplink or app links
@Override
protected void onResume() {
super.onResume();
boolean isHandled = Airbridge.handleDeeplink(
getIntent(),
uri -> {
// when app is opened with airbridge deeplink
// show proper content using url (YOUR_SCHEME://...)
}
);
if (isHandled) return;
// when app is opened with other deeplink
// use existing logic as it is
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
}
提示
当输入的是 Airbridge 深度链接时,
Airbridge.handleDeeplink
函数会返回true
,并将转换后的 URI Scheme 深度链接传递给onSuccess
。如果输入的不是 Airbridge 深度链接,则返回false
,且不触发回调。
Airbridge.handleDeeplink
函数不会自动提供目标页面的跳转功能。请您通过传递给Airbridge.handleDeeplink
函数的onSuccess
的uri
,手动实现页面跳转逻辑。
当 App 未安装时,如果用户点击了设置了延迟深度链接的追踪链接,Airbridge 深度链接信息将被保存。Airbridge SDK 会通过以下方法来获取保存的深度链接:
Airbridge SDK 在初始化以后,如果满足以下所有条件,会尝试获取深度链接。如果在获取深度链接的过程中 App 被关闭,Airbridge SDK 会将视为没有保存的深度链接。
已设置 Opt-in 时调用 Airbridge.startTracking
函数;或未设置 Opt-in。
用户在 ATT 弹窗中做出选择,或 ATT 弹窗中设置的事件收集延迟时间已到期。
Airbridge.handleDeferredDeeplink
函数在获取已保存的 Airbridge 深度链接后,会将 Airbridge 深度链接转换为 URI Scheme 深度链接,并将转换后的 URI Scheme 深度链接传递给 App。转换后的 URI Scheme 深度链接将用户发送至预设的目标页面。
val isHandled = Airbridge.handleDeferredDeeplink {
// when app is opened with deferred deeplink
// show proper content using url
}
boolean isHandled = Airbridge.handleDeferredDeeplink(uri -> {
// when app is opened with deferred deeplink
// show proper content using url
});
Airbridge.handleDeferredDeeplink
函数在 App 安装后首次被调用时会返回 true
,并等待获取 Airbridge 深度链接,将其转换为 URI Scheme 深度链接后传递给 onSuccess
。您可以使用该 URI Scheme 深度链接将用户发送至预设的目标页面。
如果没有保存的 Airbridge 深度链接,则会向 onSuccess
传递 null
。如果 SDK 尚未初始化,或 Airbridge.handleDeferredDeeplink
函数并非首次被调用,则会返回 false
。
传递的 URI Scheme 深度链接通常是 YOUR_SCHEME://...
格式的 URL。如果使用 Meta Deferred App Link 等服务,则可能会传递其他格式的 URL。
Airbridge SDK 会根据设置从您的服务中收集特定用户行为,并将其作为应用内事件发送。
Hybrid App 设置
在 Hybrid App 中,无需更改网站代码,即可通过设置使 Android SDK 处理应用内网站上出现的与 Airbridge 相关的操作。
请使用 trackEvent
方法发送事件。为了使用 trackEvent
方法,请导入 Airbridge。
import co.ab180.airbridge.Airbridge
import co.ab180.airbridge.Airbridge;
为了使用 Airbridge 预定义的 Category 名称和 Attribute,您需要调用 AirbridgeCategory
和 AirbridgeAttribute
。
import co.ab180.airbridge.common.AirbridgeCategory
import co.ab180.airbridge.common.AirbridgeAttribute
import co.ab180.airbridge.common.AirbridgeCategory;
import co.ab180.airbridge.common.AirbridgeAttribute;
trackEvent
函数构成要素的类型及其必需性如下:
fun trackEvent(
category: String,
semanticAttributes: Map<String, Any?>? = null,
customAttributes: Map<String, Any?>? = null
)
void trackEvent(@NonNull String category)
void trackEvent(
@NonNull String category,
@Nullable Map<String, Any?> semanticAttributes
)
void trackEvent(
@NonNull String category,
@Nullable Map<String, Any?> semanticAttributes
@Nullable Map<String, Any?> customAttributes
)
名称 | 是否必需 | 类型 | 说明 |
---|---|---|---|
category | 必需 | String | 事件名称 |
semanticAttributes | 可选 | Map<String, Any?> | 事件标准属性 |
customAttributes | 可选 | Map<String, Any?> | 事件自定义属性 |
各构成要素的定义和可用数据类型请参阅下文:
您可在 AirbridgeCategory 查看 Airbridge SDK 提供的标准事件 Category。您也可以输入从标准事件列表中获取的 Category。
自定义事件可以通过输入在 事件结构(Event Taxonomy)中定义的事件名称发送。
请参阅以下示例:
// track standard event (provided by sdk)
Airbridge.trackEvent(AirbridgeCategory.ORDER_COMPLETED)
// track standard event (not provided by sdk)
Airbridge.trackEvent("airbridge.ecommerce.order.canceled")
// track custom event
Airbridge.trackEvent("eventViewed")
// track standard event (provided by sdk)
Airbridge.trackEvent(AirbridgeCategory.ORDER_COMPLETED);
// track standard event (not provided by sdk)
Airbridge.trackEvent("airbridge.ecommerce.order.canceled");
// track custom event
Airbridge.trackEvent("eventViewed");
注意
Airbridge SDK v4 的 Attribute 与旧版本不同。旧版本的 Attribute 不包含 Action、Label 和 Value。
您可以通过 Attribute 收集有关事件的详细信息。
Action、Label:收集可在 Airbridge 报告中用作分组的信息。
Value:收集用于分析收入的信息,通过 Value 收集的数据可用于计算。
Semantic Attribute:Airbridge 预定义的属性。
Custom Attribute:由 Airbridge 客户自定义的属性。
您可以通过 Airbridge.trackEvent
函数的 semanticAttributes 参数输入 Action、Label、Value 和 Semantic Attribute,并通过 customAttributes 参数输入 Custom Attribute。
Airbridge 提供的 Semantic Attribute 列表可在以下指南中查看:
请参阅以下示例:
Airbridge.trackEvent(
AirbridgeCategory.ORDER_COMPLETED,
mapOf(
// action
AirbridgeAttribute.ACTION to "Tool",
// label
AirbridgeAttribute.LABEL to "Hammer",
// value
AirbridgeAttribute.VALUE to 10,
// semantic attribute (provided by sdk)
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
// semantic attribute value (provided by sdk)
AirbridgeAttribute.PRODUCT_ID to "12345",
// semantic attribute value (not provided by sdk)
"name" to "PlasticHammer",
),
),
// semantic attribute (not provided by sdk)
"totalQuantity" to 1,
),
mapOf(
// custom attribute
"promotion" to "FirstPurchasePromotion",
)
)
Airbridge.trackEvent(
AirbridgeCategory.ORDER_COMPLETED,
new HashMap() {{
// action
put(AirbridgeAttribute.ACTION, "Tool");
// label
put(AirbridgeAttribute.LABEL, "Hammer");
// value
put(AirbridgeAttribute.VALUE, 10);
// semantic attribute (provided by sdk)
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
// semantic attribute value (provided by sdk)
put(AirbridgeAttribute.PRODUCT_ID, "12345");
// semantic attribute value (not provided by sdk)
put("name", "PlasticHammer");
}}
));
// semantic attribute (not provided by sdk)
put("totalQuantity", 1);
}},
new HashMap() {{
// custom attribute
put("promotion", "FirstPurchasePromotion");
}}
);
注意
Semantic Attribute 和 Custom Attribute 仅支持 JSON 数据类型。
JSON 类型:String、Number、Boolean、Object<String, JSON>、Array<JSON>
Semantic Attribute 和 Custom Attribute 不支持的类型:Struct、Class 等
SDK 提供的标准事件 Category 和 Semantic Attribute 如下:
键 | 类型 | 值 |
---|---|---|
SIGN_UP | String | airbridge.user.signup |
SIGN_IN | String | airbridge.user.signin |
SIGN_OUT | String | airbridge.user.signout |
HOME_VIEWED | String | airbridge.ecommerce.home.viewed |
PRODUCT_LIST_VIEWED | String | airbridge.ecommerce.productList.viewed |
SEARCH_RESULTS_VIEWED | String | airbridge.ecommerce.searchResults.viewed |
PRODUCT_VIEWED | String | airbridge.ecommerce.product.viewed |
ADD_PAYMENT_INFO | String | airbridge.addPaymentInfo |
ADD_TO_WISHLIST | String | airbridge.addToWishlist |
ADDED_TO_CART | String | airbridge.ecommerce.product.addedToCart |
INITIATE_CHECKOUT | String | airbridge.initiateCheckout |
ORDER_COMPLETED | String | airbridge.ecommerce.order.completed |
ORDER_CANCELED | String | airbridge.ecommerce.order.canceled |
START_TRIAL | String | airbridge.startTrial |
SUBSCRIBE | String | airbridge.subscribe |
UNSUBSCRIBE | String | airbridge.unsubscribe |
AD_IMPRESSION | String | airbridge.adImpression |
AD_CLICK | String | airbridge.adClick |
COMPLETE_TUTORIAL | String | airbridge.completeTutorial |
ACHIEVE_LEVEL | String | airbridge.achieveLevel |
UNLOCK_ACHIEVEMENT | String | airbridge.unlockAchievement |
RATE | String | airbridge.rate |
SHARE | String | airbridge.share |
SCHEDULE | String | airbridge.schedule |
SPEND_CREDITS | String | airbridge.spendCredits |
键 | 类型 | 值 |
---|---|---|
ACTION | String | action |
LABEL | String | label |
VALUE | String | value |
CURRENCY | String | currency |
ORIGINAL_CURRENCY | String | originalCurrency |
PRODUCTS | String | products |
PRODUCT_ID | String | productID |
PRODUCT_NAME | String | name |
PRODUCT_PRICE | String | price |
PRODUCT_QUANTITY | String | quantity |
PRODUCT_CURRENCY | String | currency |
PRODUCT_POSITION | String | position |
PRODUCT_CATEGORY_ID | String | categoryID |
PRODUCT_CATEGORY_NAME | String | categoryName |
PRODUCT_BRAND_ID | String | brandID |
PRODUCT_BRAND_NAME | String | brandName |
PERIOD | String | period |
IS_RENEWAL | String | isRenewal |
RENEWAL_COUNT | String | renewalCount |
PRODUCT_LIST_ID | String | productListID |
CART_ID | String | cartID |
TRANSACTION_ID | String | transactionID |
TRANSACTION_TYPE | String | transactionType |
TRANSACTION_PAIRED_EVENT_CATEGORY | String | transactionPairedEventCategory |
TRANSACTION_PAIRED_EVENT_TIMESTAMP | String | transactionPairedEventTimestamp |
TOTAL_QUANTITY | String | totalQuantity |
QUERY | String | query |
IN_APP_PURCHASED | String | inAppPurchased |
CONTRIBUTION_MARGIN | String | contributionMargin |
ORIGINAL_CONTRIBUTION_MARGIN | String | originalContributionMargin |
LIST_ID | String | listID |
RATE_ID | String | rateID |
RATE | String | rate |
MAX_RATE | String | maxRate |
ACHIEVEMENT_ID | String | achievementID |
SHARED_CHANNEL | String | sharedChannel |
DATE_TIME | String | datetime |
DESCRIPTION | String | description |
IS_REVENUE | String | isRevenue |
PLACE | String | place |
SCHEDULE_ID | String | scheduleID |
TYPE | String | type |
LEVEL | String | level |
SCORE | String | score |
AD_PARTNERS | String | adPartners |
IS_FIRST_PER_USER | String | isFirstPerUser |
各数据类型的示例代码如下:
Airbridge.trackEvent(
"event",
mapOf(
AirbridgeAttribute.VALUE to 10,
),
mapOf(
"string" to "string",
"number" to 1000,
"boolean" to true,
"object" to mapOf("key" to "value"),
"array" to listOf("value"),
)
)
Airbridge.trackEvent(
"event",
new HashMap() {{
put(AirbridgeAttribute.VALUE, 10);
}},
new HashMap() {{
put("string", "string");
put("number", 1000);
put("boolean", true);
put("object", new HashMap() {{
put("key", "value");
}});
put("array", Arrays.asList(
"value"
));
}}
)
提示
如果未配置其他设置,则将应用默认设置。请查看是否需要其他设置后再继续。
您可以为发送的应用内事件添加所需的设置。
Airbridge SDK 按会话支持用户触发的事件。当满足以下任一条件时,会话将结束:
App 移至后台(Background)或关闭
App 处于前台(Foreground)时会话过期
如果会话结束后启用 App 或触发事件,则会开启新的会话。
默认会话超时设置为 300 秒。您可以使用 setSessionTimeout
函数修改此值,最长可达 604,800 秒(7 天)。
// Default Session Timeout = 300 sec
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setSessionTimeout(300)
.build()
Airbridge.initializeSDK(this, option)
// Default Session Timeout = 300 sec
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setSessionTimeout(300)
.build();
Airbridge.initializeSDK(this, option);
Airbridge SDK 会将收集的事件保存下来,并逐一加载已保存的事件,直到所有事件传输成功。成功传输的事件将被移除。
默认事件发送周期为 0 秒,您可以使用 setEventTransmitInterval
函数修改此值,最长可达 86,400 秒(1 天)。
请参阅以下示例:
// Default Event Transmit Interval = 0 millisecond
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setEventTransmitInterval(3000)
.build()
Airbridge.initializeSDK(this, option)
// Default Event Transmit Interval = 0 millisecond
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setEventTransmitInterval(3000)
.build();
Airbridge.initializeSDK(this, option);
Airbridge SDK 仅在未超出最大事件数和最大事件大小限制的情况下保存事件。超过限制的事件将被丢弃。
可设置的最大事件数为 INT_MAX 个;可设置的最大事件大小为 1024 GiB(千兆字节)。默认的最大事件数也为 INT_MAX 个;默认的最大事件大小也为 1024 GiB(千兆字节)。您可以使用 setEventBufferCountLimit
函数和 setEventBufferSizeLimit
函数进行修改。
请参阅以下的示例:
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setEventBufferCountLimit(1_000)
.build()
Airbridge.initializeSDK(this, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setEventBufferCountLimit(1000)
.build();
Airbridge.initializeSDK(this, option);
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setEventBufferSizeLimit(1_000)
.build()
Airbridge.initializeSDK(this, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setEventBufferSizeLimit(1000L)
.build();
Airbridge.initializeSDK(this, option);
如果启用未发送事件删除选项,在 Airbridge SDK 初始化过程中未发送的所有已保存应用内事件将被删除。未发送事件删除选项默认为禁用。
您可以将 setClearEventBufferOnInitializeEnabled
函数设置为 true
,以启用未发送事件删除选项。
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setClearEventBufferOnInitializeEnabled(true)
.build()
Airbridge.initializeSDK(this, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setClearEventBufferOnInitializeEnabled(true)
.build();
Airbridge.initializeSDK(this, option);
Airbridge SDK 支持在所有事件中包含设备标识符进行发送。
函数 | 说明 |
---|---|
| 输入其他设备标识符,最多可输入 10 个 - 键:最多 128 个字符,必须符合正则表达式 - 值:最多 128 个字符 |
| 从设备标识符中删除指定的设备标识符 |
| 删除所有设备标识符 |
请参阅以下示例:
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 收集的主要应用内事件是标准事件和自定义事件。标准事件是 Airbridge 预定义的事件,请参阅以下的示例代码:
Airbridge.setUserID("string")
Airbridge.setUserAlias("string", "string")
Airbridge.setUserEmail("string")
Airbridge.setUserPhone("string")
Airbridge.setUserAttribute("string", "string")
Airbridge.trackEvent(
AirbridgeCategory.SIGN_UP
)
Airbridge.setUserID("string");
Airbridge.setUserAlias("string", "string");
Airbridge.setUserEmail("string");
Airbridge.setUserPhone("string");
Airbridge.setUserAttribute("string", "string");
Airbridge.trackEvent(
AirbridgeCategory.SIGN_UP
);
Airbridge.setUserID("string")
Airbridge.setUserAlias("string", "string")
Airbridge.setUserEmail("string")
Airbridge.setUserPhone("string")
Airbridge.setUserAttribute("string", "string")
Airbridge.trackEvent(
AirbridgeCategory.SIGN_IN
)
Airbridge.setUserID("string");
Airbridge.setUserAlias("string", "string");
Airbridge.setUserEmail("string");
Airbridge.setUserPhone("string");
Airbridge.setUserAttribute("string", "string");
Airbridge.trackEvent(
AirbridgeCategory.SIGN_UP
);
Airbridge.trackEvent(
AirbridgeCategory.SIGN_OUT
)
Airbridge.clearUser()
Airbridge.trackEvent(
AirbridgeCategory.SIGN_OUT
);
Airbridge.clearUser();
Airbridge.trackEvent(
AirbridgeCategory.HOME_VIEWED
)
Airbridge.trackEvent(
AirbridgeCategory.HOME_VIEWED
);
Airbridge.trackEvent(
AirbridgeCategory.PRODUCT_LIST_VIEWED,
mapOf(
AirbridgeAttribute.LIST_ID to "84e6e236-38c4-48db-9b49-16e4cc064386",
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
mapOf(
AirbridgeAttribute.PRODUCT_ID to "d6ab2fbe-decc-4362-b719-d257a131e91e",
AirbridgeAttribute.PRODUCT_NAME to "PlasticFork",
AirbridgeAttribute.PRODUCT_PRICE to 1,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.PRODUCT_LIST_VIEWED,
new HashMap() {{
put(AirbridgeAttribute.LIST_ID, "84e6e236-38c4-48db-9b49-16e4cc064386");
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticFork");
put(AirbridgeAttribute.PRODUCT_PRICE, 1);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.SEARCH_RESULTS_VIEWED,
mapOf(
AirbridgeAttribute.QUERY to "Plastic",
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
mapOf(
AirbridgeAttribute.PRODUCT_ID to "d6ab2fbe-decc-4362-b719-d257a131e91e",
AirbridgeAttribute.PRODUCT_NAME to "PlasticFork",
AirbridgeAttribute.PRODUCT_PRICE to 1,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.SEARCH_RESULTS_VIEWED,
new HashMap() {{
put(AirbridgeAttribute.QUERY, "Plastic");
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticFork");
put(AirbridgeAttribute.PRODUCT_PRICE, 1);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.PRODUCT_VIEWED,
mapOf(
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.PRODUCT_VIEWED,
new HashMap() {{
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.ADD_PAYMENT_INFO,
mapOf(
AirbridgeAttribute.TYPE to "CreditCard",
)
)
Airbridge.trackEvent(
AirbridgeCategory.ADD_PAYMENT_INFO,
new HashMap() {{
put(AirbridgeAttribute.TYPE, "CreditCard");
}}
);
Airbridge.trackEvent(
AirbridgeCategory.ADD_TO_WISHLIST,
mapOf(
AirbridgeAttribute.LIST_ID to "189a2f8b-83ee-4074-8158-726be54e57d4",
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.ADD_TO_WISHLIST,
new HashMap() {{
put(AirbridgeAttribute.LIST_ID, "189a2f8b-83ee-4074-8158-726be54e57d4");
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.ADDED_TO_CART,
mapOf(
AirbridgeAttribute.CART_ID to "421eaeb7-6e80-4694-933e-f2e1a55e9cbd",
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.ADDED_TO_CART,
new HashMap() {{
put(AirbridgeAttribute.CART_ID, "421eaeb7-6e80-4694-933e-f2e1a55e9cbd");
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.INITIATE_CHECKOUT,
mapOf(
AirbridgeAttribute.TRANSACTION_ID to "0a7ee1ec-33da-4ffb-b775-89e80e75978a",
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
mapOf(
AirbridgeAttribute.PRODUCT_ID to "d6ab2fbe-decc-4362-b719-d257a131e91e",
AirbridgeAttribute.PRODUCT_NAME to "PlasticFork",
AirbridgeAttribute.PRODUCT_PRICE to 1,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.INITIATE_CHECKOUT,
new HashMap() {{
put(AirbridgeAttribute.TRANSACTION_ID, "0a7ee1ec-33da-4ffb-b775-89e80e75978a");
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticFork");
put(AirbridgeAttribute.PRODUCT_PRICE, 1);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.ORDER_COMPLETED,
mapOf(
AirbridgeAttribute.VALUE to 11,
AirbridgeAttribute.TRANSACTION_ID to "8065ef16-162b-4a82-b683-e51aefdda7d5",
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.IN_APP_PURCHASED to true,
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
mapOf(
AirbridgeAttribute.PRODUCT_ID to "d6ab2fbe-decc-4362-b719-d257a131e91e",
AirbridgeAttribute.PRODUCT_NAME to "PlasticFork",
AirbridgeAttribute.PRODUCT_PRICE to 1,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.ORDER_COMPLETED,
new HashMap() {{
put(AirbridgeAttribute.VALUE, 11);
put(AirbridgeAttribute.TRANSACTION_ID, "8065ef16-162b-4a82-b683-e51aefdda7d5");
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.IN_APP_PURCHASED, true);
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticFork");
put(AirbridgeAttribute.PRODUCT_PRICE, 1);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.ORDER_CANCELED,
mapOf(
AirbridgeAttribute.VALUE to 11,
AirbridgeAttribute.TRANSACTION_ID to "8065ef16-162b-4a82-b683-e51aefdda7d5",
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.IN_APP_PURCHASED to true,
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
mapOf(
AirbridgeAttribute.PRODUCT_ID to "d6ab2fbe-decc-4362-b719-d257a131e91e",
AirbridgeAttribute.PRODUCT_NAME to "PlasticFork",
AirbridgeAttribute.PRODUCT_PRICE to 1,
AirbridgeAttribute.PRODUCT_QUANTITY to 1,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.ORDER_CANCELED,
new HashMap() {{
put(AirbridgeAttribute.VALUE, 11);
put(AirbridgeAttribute.TRANSACTION_ID, "8065ef16-162b-4a82-b683-e51aefdda7d5");
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.IN_APP_PURCHASED, true);
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticFork");
put(AirbridgeAttribute.PRODUCT_PRICE, 1);
put(AirbridgeAttribute.PRODUCT_QUANTITY, 1);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.START_TRIAL,
mapOf(
AirbridgeAttribute.TRANSACTION_ID to "ef1e5271-0370-407c-b1e9-669a8df1dc2c",
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.PERIOD to "P1M",
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "306a57cb-f653-4220-a208-8405d8e4d506",
AirbridgeAttribute.PRODUCT_NAME to "MusicStreamingMemebership",
AirbridgeAttribute.PRODUCT_PRICE to 15,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.START_TRIAL,
new HashMap() {{
put(AirbridgeAttribute.TRANSACTION_ID, "ef1e5271-0370-407c-b1e9-669a8df1dc2c");
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.PERIOD, "P1M");
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "306a57cb-f653-4220-a208-8405d8e4d506");
put(AirbridgeAttribute.PRODUCT_NAME, "MusicStreamingMemebership");
put(AirbridgeAttribute.PRODUCT_PRICE, 15);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.SUBSCRIBE,
mapOf(
AirbridgeAttribute.VALUE to 15,
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.TRANSACTION_ID to "cbe718c7-e44e-4707-b5cd-4a6a29f29649",
AirbridgeAttribute.PERIOD to "P1M",
AirbridgeAttribute.IS_RENEWAL to true,
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "306a57cb-f653-4220-a208-8405d8e4d506",
AirbridgeAttribute.PRODUCT_NAME to "MusicStreamingMemebership",
AirbridgeAttribute.PRODUCT_PRICE to 15,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.SUBSCRIBE,
new HashMap() {{
put(AirbridgeAttribute.VALUE, 15);
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.TRANSACTION_ID, "cbe718c7-e44e-4707-b5cd-4a6a29f29649");
put(AirbridgeAttribute.PERIOD, "P1M");
put(AirbridgeAttribute.IS_RENEWAL, true);
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "306a57cb-f653-4220-a208-8405d8e4d506");
put(AirbridgeAttribute.PRODUCT_NAME, "MusicStreamingMemebership");
put(AirbridgeAttribute.PRODUCT_PRICE, 15);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.UNSUBSCRIBE,
mapOf(
AirbridgeAttribute.VALUE to 15,
AirbridgeAttribute.CURRENCY to "USD",
AirbridgeAttribute.TRANSACTION_ID to "cbe718c7-e44e-4707-b5cd-4a6a29f29649",
AirbridgeAttribute.IS_RENEWAL to true,
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "306a57cb-f653-4220-a208-8405d8e4d506",
AirbridgeAttribute.PRODUCT_NAME to "MusicStreamingMemebership",
AirbridgeAttribute.PRODUCT_PRICE to 15,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.UNSUBSCRIBE,
new HashMap() {{
put(AirbridgeAttribute.VALUE, 15);
put(AirbridgeAttribute.CURRENCY, "USD");
put(AirbridgeAttribute.TRANSACTION_ID, "cbe718c7-e44e-4707-b5cd-4a6a29f29649");
put(AirbridgeAttribute.IS_RENEWAL, true);
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "306a57cb-f653-4220-a208-8405d8e4d506");
put(AirbridgeAttribute.PRODUCT_NAME, "MusicStreamingMemebership");
put(AirbridgeAttribute.PRODUCT_PRICE, 15);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.AD_IMPRESSION,
mapOf(
AirbridgeAttribute.VALUE to 0.01,
AirbridgeAttribute.AD_PARTNERS to mapOf(
"mopub" to mapOf(
"app_version" to "5.18.0",
"adunit_id" to "12345",
"adunit_name" to "12345",
"adunit_format" to "Banner",
"id" to "12345",
"currency" to "USD",
"publisher_revenue" to 12345.123,
"adgroup_id" to "12345",
"adgroup_name" to "12345",
"adgroup_type" to "12345",
"adgroup_priority" to "12345",
"country" to "kr",
"precision" to "publisher_defined",
"network_name" to "12345",
"network_placement_id" to "12345",
"demand_partner_data" to "12345",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.AD_IMPRESSION,
new HashMap() {{
put(AirbridgeAttribute.VALUE, 0.01);
put(AirbridgeAttribute.AD_PARTNERS, new HashMap() {{
put("mopub", new HashMap() {{
put("app_version", "5.18.0");
put("adunit_id", "12345");
put("adunit_name", "12345");
put("adunit_format", "Banner");
put("id", "12345");
put("currency", "USD");
put("publisher_revenue", 12345.123);
put("adgroup_id", "12345");
put("adgroup_name", "12345");
put("adgroup_type", "12345");
put("adgroup_priority", "12345");
put("country", "kr");
put("precision", "publisher_defined");
put("network_name", "12345");
put("network_placement_id", "12345");
put("demand_partner_data", "12345");
}});
}});
}}
);
Airbridge.trackEvent(
AirbridgeCategory.AD_CLICK,
mapOf(
AirbridgeAttribute.VALUE to 0.1,
AirbridgeAttribute.AD_PARTNERS to mapOf(
"mopub" to mapOf(
"app_version" to "5.18.0",
"adunit_id" to "12345",
"adunit_name" to "12345",
"adunit_format" to "Banner",
"id" to "12345",
"currency" to "USD",
"publisher_revenue" to 12345.123,
"adgroup_id" to "12345",
"adgroup_name" to "12345",
"adgroup_type" to "12345",
"adgroup_priority" to "12345",
"country" to "kr",
"precision" to "publisher_defined",
"network_name" to "12345",
"network_placement_id" to "12345",
"demand_partner_data" to "12345",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.AD_CLICK,
new HashMap() {{
put(AirbridgeAttribute.VALUE, 0.1);
put(AirbridgeAttribute.AD_PARTNERS, new HashMap() {{
put("mopub", new HashMap() {{
put("app_version", "5.18.0");
put("adunit_id", "12345");
put("adunit_name", "12345");
put("adunit_format", "Banner");
put("id", "12345");
put("currency", "USD");
put("publisher_revenue", 12345.123);
put("adgroup_id", "12345");
put("adgroup_name", "12345");
put("adgroup_type", "12345");
put("adgroup_priority", "12345");
put("country", "kr");
put("precision", "publisher_defined");
put("network_name", "12345");
put("network_placement_id", "12345");
put("demand_partner_data", "12345");
}});
}});
}}
);
Airbridge.trackEvent(
AirbridgeCategory.COMPLETE_TUTORIAL,
mapOf(
AirbridgeAttribute.DESCRIPTION to "Finish Initial Tutorial",
)
)
Airbridge.trackEvent(
AirbridgeCategory.COMPLETE_TUTORIAL,
new HashMap() {{
put(AirbridgeAttribute.DESCRIPTION, "Finish Initial Tutorial");
}}
);
Airbridge.trackEvent(
AirbridgeCategory.ACHIEVE_LEVEL,
mapOf(
AirbridgeAttribute.LEVEL to 13,
)
)
Airbridge.trackEvent(
AirbridgeCategory.ACHIEVE_LEVEL,
new HashMap() {{
put(AirbridgeAttribute.LEVEL, 13);
}}
);
Airbridge.trackEvent(
AirbridgeCategory.UNLOCK_ACHIEVEMENT,
mapOf(
AirbridgeAttribute.ACHIEVEMENT_ID to "36a0f0bb-b153-4be1-a3e0-3cb5b2b076c1",
AirbridgeAttribute.DESCRIPTION to "Get Score Over 50",
AirbridgeAttribute.SCORE to 80,
)
)
Airbridge.trackEvent(
AirbridgeCategory.UNLOCK_ACHIEVEMENT,
new HashMap() {{
put(AirbridgeAttribute.ACHIEVEMENT_ID, "36a0f0bb-b153-4be1-a3e0-3cb5b2b076c1");
put(AirbridgeAttribute.DESCRIPTION, "Get Score Over 50");
put(AirbridgeAttribute.SCORE, 80);
}}
);
Airbridge.trackEvent(
AirbridgeCategory.RATE,
mapOf(
AirbridgeAttribute.RATE_ID to "531c64b3-4704-4780-a306-89014ec18daf",
AirbridgeAttribute.RATE to 4.5,
AirbridgeAttribute.MAX_RATE to 5,
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.RATE,
new HashMap() {{
put(AirbridgeAttribute.RATE_ID, "531c64b3-4704-4780-a306-89014ec18daf");
put(AirbridgeAttribute.RATE, 4.5);
put(AirbridgeAttribute.MAX_RATE, 5);
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.SHARE,
mapOf(
AirbridgeAttribute.DESCRIPTION to "Share Promotion",
AirbridgeAttribute.SHARED_CHANNEL to "CopyLink",
)
)
Airbridge.trackEvent(
AirbridgeCategory.SHARE,
new HashMap() {{
put(AirbridgeAttribute.DESCRIPTION, "Share Promotion");
put(AirbridgeAttribute.SHARED_CHANNEL, "CopyLink");
}}
);
Airbridge.trackEvent(
AirbridgeCategory.SCHEDULE,
mapOf(
AirbridgeAttribute.SCHEDULE_ID to "75712915-2cd9-4e42-a85e-8d42f356f4c6",
AirbridgeAttribute.DATE_TIME to "2024-01-01T00:00:00+00:00",
AirbridgeAttribute.PLACE to "ConferenceRoom",
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "abb3e65d-17bc-4b28-89e3-5e356c0ea697",
AirbridgeAttribute.PRODUCT_NAME to "ConferenceRoom",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.SCHEDULE,
new HashMap() {{
put(AirbridgeAttribute.SCHEDULE_ID, "75712915-2cd9-4e42-a85e-8d42f356f4c6");
put(AirbridgeAttribute.DATE_TIME, "2024-01-01T00:00:00+00:00");
put(AirbridgeAttribute.PLACE, "ConferenceRoom");
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "abb3e65d-17bc-4b28-89e3-5e356c0ea697");
put(AirbridgeAttribute.PRODUCT_NAME, "ConferenceRoom");
}},
));
}}
);
Airbridge.trackEvent(
AirbridgeCategory.SPEND_CREDITS,
mapOf(
AirbridgeAttribute.TRANSACTION_ID to "22eb193d-be11-4fe4-95da-c91a196faf1c",
AirbridgeAttribute.PRODUCTS to listOf(
mapOf(
AirbridgeAttribute.PRODUCT_ID to "0117b32a-5a6c-4d4c-b64c-7858e07dba78",
AirbridgeAttribute.PRODUCT_NAME to "PlasticHammer",
AirbridgeAttribute.PRODUCT_PRICE to 10,
AirbridgeAttribute.PRODUCT_CURRENCY to "USD",
),
),
)
)
Airbridge.trackEvent(
AirbridgeCategory.SPEND_CREDITS,
new HashMap() {{
put(AirbridgeAttribute.TRANSACTION_ID, "22eb193d-be11-4fe4-95da-c91a196faf1c");
put(AirbridgeAttribute.PRODUCTS, Arrays.asList(
new HashMap() {{
put(AirbridgeAttribute.PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78");
put(AirbridgeAttribute.PRODUCT_NAME, "PlasticHammer");
put(AirbridgeAttribute.PRODUCT_PRICE, 10);
put(AirbridgeAttribute.PRODUCT_CURRENCY, "USD");
}},
));
}}
);
自定义事件是 Airbridge 客户自定义的事件,用于追踪无法通过标准事件满足的、针对 Airbridge 客户服务定制的用户行为。请参阅以下示例代码:
Airbridge.trackEvent(
"event",
mapOf(
AirbridgeAttribute.VALUE to 10,
),
mapOf(
"string" to "string",
"number" to 1000,
"boolean" to true,
"object" to ["key": "value"],
"array" to ["value"],
)
)
Airbridge.trackEvent(
"event",
new HashMap() {{
put(AirbridgeAttribute.VALUE, 10);
}},
new HashMap() {{
put("string", "string");
put("number", 1000);
put("boolean", true);
put("object", new HashMap() {{
put("key", "value");
}});
put("array", Arrays.asList(
"value",
));
}}
);
您可以将用户信息随事件一同发送至 Airbridge,以基于这些信息更精确地衡量跨 Web 和 App 的广告绩效。
用户 ID 是您服务中使用的用户标识符。用户 ID 必须唯一,能够在 Web 和 App 中将同一用户识别为一个用户。
函数 |
说明 |
---|---|
| 输入用户 ID |
| 删除用户 ID |
| 输入其他用户标识符,最多可输入 10 个 - 键:最多 128 个字符,必须符合正则表达式 - 值:最多 1024 个字符 |
| 从输入的其他用户标识符中删除指定的标识符 |
| 删除所有输入的其他用户标识符 |
请参阅以下示例:
// ID
Airbridge.setUserID("testID")
// alias
Airbridge.setUserAlias("ADD_YOUR_KEY", "value")
Airbridge.removeUserAlias("DELETE_THIS_KEY")
Airbridge.clearUserAlias()
// ID
Airbridge.setUserID("testID");
// alias
Airbridge.setUserAlias("ADD_YOUR_KEY", "value");
Airbridge.removeUserAlias("DELETE_THIS_KEY");
Airbridge.clearUserAlias();
注意
可能包含敏感的用户信息。发送前请咨询法律顾问。
您可以通过设置用户属性发送其他用户信息。
函数 |
说明 |
---|---|
| 输入用户邮箱。自动进行 SHA256 哈希处理 |
| 删除用户邮箱 |
| 输入用户电话号码。自动进行 SHA256 哈希处理 |
| 删除用户电话号码 |
| 输入其他用户属性,最多可输入 100 个 - 键:最多 128 个字符, 必须符合正则表达式 - 值:仅支持 String、Number、Boolean 类型,最多 1024 个字符 |
| 从输入的其他用户属性中删除指定属性 |
| 删除所有输入的其他用户属性 |
请参阅以下示例:
// Automatically hashed on client side using SHA256
// Can turn off hashing feature with special flag
Airbridge.setUserEmail("testID@ab180.co")
Airbridge.setUserPhone("821012341234")
// attributes
Airbridge.setUserAttribute("ADD_YOUR_KEY", 1)
Airbridge.setUserAttribute("ADD_YOUR_KEY", 1L)
Airbridge.setUserAttribute("ADD_YOUR_KEY", 1f)
Airbridge.setUserAttribute("ADD_YOUR_KEY", 1.0)
Airbridge.setUserAttribute("ADD_YOUR_KEY", "1")
Airbridge.setUserAttribute("ADD_YOUR_KEY", true)
Airbridge.removeUserAttribute("DELETE_THIS_KEY")
Airbridge.clearUserAttributes()
// Automatically hashed on client side using SHA256
// Can turn off hashing feature with special flag
Airbridge.setUserEmail("testID@ab180.co");
Airbridge.setUserPhone("821012341234");
// attributes
Airbridge.setUserAttribute("ADD_YOUR_KEY", 1);
Airbridge.setUserAttribute("ADD_YOUR_KEY", 1L);
Airbridge.setUserAttribute("ADD_YOUR_KEY", 1f);
Airbridge.setUserAttribute("ADD_YOUR_KEY", 1.0);
Airbridge.setUserAttribute("ADD_YOUR_KEY", "1");
Airbridge.setUserAttribute("ADD_YOUR_KEY", true);
Airbridge.removeUserAttribute("DELETE_THIS_KEY");
Airbridge.clearUserAttributes();
如果将 setHashUserInformationEnabled
函数设置为 false
,则发送用户邮箱和电话号码时不会进行 SHA256 哈希处理。默认设置为 true
。
// 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.clearUser
函数重置用户信息。
Airbridge.clearUser()
Airbridge.clearUser();
提示
此功能并非必需功能,请在设置前确认需求。
根据链接的打开方式,在 App 内正确使用追踪链接可能会有一定困难。
通过使用 Airbridge.click
函数或 Airbridge.impression
函数,您可以使用户在 App 中跳转到同一 App 的另一个页面,无需通过外部浏览器。
当用户点击 App 内的追踪链接时,会调用 Airbridge.click
函数,该函数用于根据追踪链接设置将传递 URI Scheme 深度链接,或将用户跳转到应用商店或网站。
fun click(
trackingLink: String,
onSuccess: OnSuccess<Unit>? = null,
onFailure: OnFailure? = null
): Boolean
boolean click(
@NonNull String trackingLink,
@Nullable OnSuccess<Unit> onSuccess,
@Nullable OnFailure onFailure
)
当追踪链接被展示在用户界面(UI)时,将调用 Airbridge.impression
函数,该函数用于收集展示(Impression)事件。
fun impression(
trackingLink: String,
onSuccess: OnSuccess<Unit>? = null,
onFailure: OnFailure? = null
): Boolean
boolean impression(
@NonNull String trackingLink,
@Nullable OnSuccess<Unit> onSuccess,
@Nullable OnFailure onFailure
)
注意
注意
Airbridge SDK 收集归因结果需要时间,因此不建议将归因结果用于需要实时处理的功能。
您可以使用 AirbridgeOptionBuilder.setOnAttributionReceived
函数收取归因结果数据。
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setOnAttributionReceived(object : OnAttributionResultReceiveListener {
override fun onAttributionResultReceived(result: Map<String, String>) {
// Process attribution data
}
})
.build()
Airbridge.initializeSDK(application, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setOnAttributionReceived(new OnAttributionResultReceiveListener() {
@Override
public void onAttributionResultReceived(@NonNull Map<String, String> result) {
// Process attribution data
}
})
.build();
Airbridge.initializeSDK(application, option);
根据归因结果的存在与否,数据传递如下:
可以通过归因结果回调查看以下数据,数据以 map 格式传递。
归因结果会在 SDK 初始化后 1 分钟内通过回调传递。如因 App 关闭未传递归因结果,则会在下次 App 启用时在 1 分钟内传递。受网络状态等因素影响,传递时间可能延迟至最多 5 分钟。
键 | 类型 | 说明 |
---|---|---|
attributedChannel | String | 渠道 |
attributedCampaign | String | 广告系列 |
attributedAdGroup | String | 广告组 |
attributedAdCreative | String | 广告素材 |
attributedContent | String | 内容 |
attributedTerm | String | 关键词 |
attributedSubPublisher | String | 子渠道 |
attributedSubSubPublisher1 | String | 二级子渠道 1 |
attributedSubSubPublisher2 | String | 二级子渠道 2 |
attributedSubSubPublisher3 | String | 二级子渠道 3 |
如果没有归因结果,则传递以下数据。在 SDK 初始化至少 3 小时后 App 重新启用时,传递此数据。
{
"attributedChannel": "unattributed"
}
无论深度链接由何种服务生成,只要通过深度链接启用 App,Airbridge SDK 即会收集深度链接事件。您可以将 setTrackAirbridgeDeeplinkOnlyEnabled
函数设置为 true
,则只收集 Airbridge 深度链接触发的事件。
// Default Track Airbridge Link Only = false
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setTrackAirbridgeDeeplinkOnlyEnabled(true)
.build()
Airbridge.initializeSDK(application, option)
// Default Track Airbridge Link Only = false
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setTrackAirbridgeDeeplinkOnlyEnabled(true)
.build();
Airbridge.initializeSDK(application, option);
Airbridge SDK 会收集开启新会话的 Open 事件和 Foreground 事件,但在会话持续期间,这些事件不会被收集。
您可以通过将 setTrackInSessionLifeCycleEventEnabled
函数设置为 true
,以在会话持续期间也收集 Open 事件和 Foreground 事件。
所有收集到的 Foreground 事件都将被记录为 Open 事件。
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setTrackInSessionLifeCycleEventEnabled(true)
.build()
Airbridge.initializeSDK(application, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setTrackInSessionLifeCycleEventEnabled(true)
.build();
Airbridge.initializeSDK(application, option);
为遵守《数字市场法案》(Digital Markets Act,简称 DMA),用户的同意信息(User Consent)必须共享给 Airbridge。请注意,如果用户位于欧洲经济区(European Economic Area,简称 EEA),则必须始终向 Airbridge 共享用户是否位于 EEA 以及用户的同意信息。DMA 的更多信息,请参阅 本指南。
1. 请检查启用 App 的用户所在地。如果用户在 EEA(eea
= 1
)启用了 App,则检查是否已取得该用户的同意信息。如果已取得,请继续步骤 3。
提示
Airbridge 无法提供有关存储用户同意信息或实现同意弹窗的指导。请咨询法律顾问。
2. 如果尚未取得用户的同意信息,请通过同意弹窗等方法取得用户的同意信息。必须收集 adPersonalization
和 adUserData
。
注意
从 2024-03-06 起,必须对 EEA 的现有用户和新用户至少收集一次同意信息。
必须共享给 Airbridge 的用户同意信息如下。eea
值不是用户的直接响应,也不是 Airbridge 自动收集的信息。请根据用户所在地确定 eea
值并将其共享给 Airbridge。
Airbridge 字段 |
Google 字段 |
说明 |
---|---|---|
<string> |
| 表示用户是否在 EEA,或 DMA 适用地区。该值不是用户的直接响应,也不是 Airbridge 自动收集的信息。请根据用户所在地确定 不处理除 - - |
<string> |
| 对于收集信息以提供个性化广告(Personalized Ads) 的用户同意情况。不处理除 - - |
<string> |
| 对于向 Google 发送用于广告目的用户数据的同意情况。不处理除 - - |
3. 请初始化 Airbridge Android SDK,并在收集用户信息之前将用户同意信息共享给 Airbridge。
注意
必须为
eea
、adPersonalization
和adUserData
使用相同的名称。请根据收集的信息正确输入
0
或1
。
// MainApplication.kt
override fun onCreate() {
super.onCreate()
// Initialize Airbridge SDK
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
// Make Airbridge SDK explicitly start tracking
.setAutoStartTrackingEnabled(false)
.build()
Airbridge.initializeSDK(application, option)
// Set device alias into Airbridge SDK
// Based on actual region
Airbridge.setDeviceAlias("eea", "0" or "1")
// Based on actual user consent
Airbridge.setDeviceAlias("adPersonalization", "0" or "1")
Airbridge.setDeviceAlias("adUserData", "0" or "1")
// Explicitly start tracking
Airbridge.startTracking()
}
// MainApplication.java
@Override
public void onCreate() {
super.onCreate();
// Initialize Airbridge SDK
AirbridgeOption option = new AirbridgeOptionBuilder("APP_NAME", "APP_TOKEN")
// Make Airbridge SDK explicitly start tracking
.setAutoStartTrackingEnabled(false)
.build();
Airbridge.initializeSDK(application, option);
// Set device alias into Airbridge SDK
// Based on actual region
Airbridge.setDeviceAlias("eea", "0" or "1");
// Based on actual user consent
Airbridge.setDeviceAlias("adPersonalization", "0" or "1");
Airbridge.setDeviceAlias("adUserData", "0" or "1");
// Explicitly start tracking
Airbridge.startTracking();
}
注意
如果已设置 Meta Deferred App Link,则不得使用 Facebook SDK 的
fetchDeferredAppLink
函数。
您可以通过以下方法在 Meta ads 使用 延迟深度链接。Airbridge SDK 优先收集 Meta Deferred App Link,若无 Meta Deferred App Link,则收集 Airbridge 延迟深度链接。
1. 请将以下 repository
添加到 project/build.gradle
文件中。
allprojects {
...
repositories {
...
mavenCentral()
...
}
...
}
2. 请在 app/build.gradle
文件的 dependencies 块中添加以下代码:
dependencies {
...
implementation 'com.facebook.android:facebook-android-sdk:latest.release'
...
}
3. 请将以下代码添加到 app/res/values/string.xml
文件中。
...
<string name="facebook_app_id">FACEBOOK_APP_ID</string>
<string name="facebook_client_token">FACEBOOK_CLIENT_TOKEN</string>
...
4. 请在 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>
...
5. 您可以在 SDK 初始化阶段通过 setTrackMetaDeferredAppLinkEnabled
函数使用 Meta Deferred App Link 功能。请将 setTrackMetaDeferredAppLinkEnabled
设置为 true
。
// Default meta Deferred App Link Enabled = false
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setTrackMetaDeferredAppLinkEnabled(true)
.build()
Airbridge.initializeSDK(application, option)
// Default meta Deferred App Link Enabled = false
AAirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setTrackMetaDeferredAppLinkEnabled(true)
.build();
Airbridge.initializeSDK(application, option);
注意
如果 Airbridge SDK 在初始化后未立即启用,则可能无法收集安装(Install)、打开(Open)、深度链接(Deeplink)事件。
初始化 Airbridge SDK 时,所有功能将默认启用。您可以通过将 setSDKEnabled
函数设置为 false
,在禁用所有功能的状态下初始化 Airbridge SDK。
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setSdkEnabled(false)
.build()
Airbridge.initializeSDK(application, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setSdkEnabled(false)
.build();
Airbridge.initializeSDK(application, option);
或者,可以通过以下方法检查 Airbridge SDK 的启用状态,以启用或禁用所有功能。
// Checks whether the SDK is currently enabled.
// @return Boolean
Airbridge.isSDKEnabled()
// Enables the SDK.
Airbridge.enableSDK()
// Disables the SDK.
Airbridge.disableSDK()
// Checks whether the SDK is currently enabled.
// @return boolean
Airbridge.isSDKEnabled();
// Enables the SDK.
Airbridge.enableSDK();
// Disables the SDK.
Airbridge.disableSDK();
以下是收集 MIR 所需的设置。请在 SDK 初始化阶段,将 Meta App ID 传递给 setMetaInstallReferrer
函数。
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setMetaInstallReferrer("YOUR_FACEBOOK_APP_ID")
.build()
Airbridge.initializeSDK(application, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setMetaInstallReferrer("YOUR_FACEBOOK_APP_ID")
.build();
Airbridge.initializeSDK(application, option);
完成设置后,需要将 Install Referrer Decryption Key(安装引荐来源解密密钥)注册到 Airbridge 面板,才能查看解密后的 MIR。如何注册 Install Referrer Decryption Key,请参阅 本指南。
Airbridge 会向过去 6 个月内执行过至少 1 次 App 事件的用户发送静默推送通知,以检查用户是否已卸载 App。此静默推送通知在每天 UTC 15:00 至 16:00 之间发送。App 卸载事件可在 Airbridge 报告和通过导出原始数据查看。
详细设置方法和说明,请参阅以下指南:
部分第三方解决方案的集成需要进行 SDK 设置。建议在通过 Airbridge SDK 收集数据之前,完成所需设置。
各第三方解决方案的集成设置,请参见下文:
Airbridge SDK 提供的日志分为以下 5 个级别:Debug、Info、Warning、Error、Fault。Debug 为严重性最低的日志级别,Fault 为最严重的日志级别。
Airbridge SDK 默认提供 Warning、Error、Fault 级别的日志。通过将日志级别输入 setLogLevel
函数,可以查看从该日志级别到 Fault 级别的所有日志。
// Default log level = Log.INFO
val option = AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setLogLevel(AirbridgeLogLevel.DEBUG)
.build()
Airbridge.initializeSDK(this, option)
AirbridgeOption option = new AirbridgeOptionBuilder("YOUR_APP_NAME", "YOUR_APP_SDK_TOKEN")
.setLogLevel(AirbridgeLogLevel.DEBUG)
.build();
Airbridge.initializeSDK(this, option);
Was this page helpful?