Attention
This is a guide for the installation and setup of Unreal SDK v4. Please check the Unreal SDK guide for previous versions.
You can install the Airbridge Unreal SDK and add the necessary settings.
Airbridge Unreal SDK supports Unreal Engine version
4.23
or above.
You can install the Airbridge Unreal SDK in the following ways. After installation, you can verify that the SDK is installed correctly by testing the Unreal SDK.
1. Download the Latest version of the Airbridge Unreal SDK.
2. Create a Plugins
folder in the root directory of your Unreal Engine project.
3. Move the Airbridge Unreal SDK into the Plugins
folder inside the following structure
<YOUR_UE_PROJECT>
├── Plugins
└── AirbridgeUnrealSDK
├── Resources
├── Source
└── AirbridgeUnrealSDK.uplugin
4. Enable the Airbridge Unreal SDK by clicking Settings > Plugins
in the Unreal Engine toolbar.
5. Inside your app's Build.cs file(<YOUR_UE_PROJECT>.Build.cs
), add AirbridgeUnreal
to the PublicDependencyModuleNames array like this
public class <YOUR_UE_PROJECT> : ModuleRules
{
public <YOUR_UE_PROJECT>(ReadOnlyTargetRules Target) : base(Target)
{
...
PublicDependencyModuleNames.AddRange(new string[] { ... , "AirbridgeUnreal" }); // ADD DEPENDENCY
...
}
}
Attention
Install only one version of the SDK, either the general SDK or the restricted SDK.
Depending on policies and environments, restrictions on collecting device IDs like GAID and IDFA may be required. When installing the Restricted SDK version, the device IDs are not collected.
Install the Restricted SDK using the method below.
1. Download the Latest version of the Airbridge Unreal SDK.
2. Create a Plugins
folder in the root directory of your Unreal Engine project.
3. Move the Airbridge Unreal SDK into the Plugins
folder inside the following structure
<YOUR_UE_PROJECT>
├── Plugins
└── AirbridgeUnrealSDK
├── Resources
├── Source
└── AirbridgeUnrealSDK.uplugin
4. Enable the Airbridge Unreal SDK by clicking Settings > Plugins
in the Unreal Engine toolbar.
5. Inside your app's Build.cs file(<YOUR_UE_PROJECT>.Build.cs
), add AirbridgeUnreal
to the PublicDependencyModuleNames array like this
public class <YOUR_UE_PROJECT> : ModuleRules
{
public <YOUR_UE_PROJECT>(ReadOnlyTargetRules Target) : base(Target)
{
...
PublicDependencyModuleNames.AddRange(new string[] { ... , "AirbridgeUnreal" }); // ADD DEPENDENCY
...
}
}
Enter the correct values for the App Name
, App Token
in the Configure SDK.
You can find App Name and App Token in the "Airbridge Dashboard → Settings → Tokens" tab.
1. Open the Project Settings
window in Unreal Engine.
2. Under the Plugins section, click Airbridge Unreal SDK and you will see the screen below. If you do not need to set any values, please omit the key values.
See below for a guide to the settings.
Value | Reference |
---|---|
App Name | |
App Token | |
Log Level | |
iOS URI Scheme | |
Android URI Scheme | |
Session Timeout Seconds | |
User Info Hash Enabled | |
Track Airbridge Link Only | |
Auto Start Tracking Enabled | |
Facebook Deferred App Link Enabled | |
iOS Tracking Authorize Timeout Seconds | |
SDK Signature Secret ID | |
SDK Signature Secret | |
Track In Session Life Cycle Event Enabled | |
Clear Event Buffer On Initialize Enabled | |
SDK Enabled | |
Event Buffer Count Limit | |
Event Buffer Size Limit In Gibibyte | |
Event Transmit Interval Seconds | |
Meta Install Referrer (Facebook App ID) | |
Is Handle Airbridge Deeplink Only |
Note
The functions necessary to ensure compliance with privacy policies should be reviewed with legal counsel.
In the iOS environment, you can only collect the IDFA as an identifier for users who have consented to collect information in the AppTrackingTransparency(ATT) prompt.
You should delay collecting the app install event until the user agrees to collect information at the ATT prompt. IDFA is collected with the app install event. If you collect the app install event before the user agrees to collect information, then you can't measure your performance because IDFAs are not collected. We recommend that you time the collection of the app install event to collect IDFAs when the user agrees to the ATT prompt.
Translated with www.DeepL.com/Translator (free version)
1. Prepare the wording you use for the ATT prompt.
2. Follow Apple's guide to set up ATT prompts.
3. The Airbridge Unreal SDK delays the collection of app install events for 30 seconds each time the app is launched until the user agrees to collect the information if no app install events are collected. If the user exits the app before deciding whether or not to consent to the collection of information, the app install event is not collected and is retried the next time the app is launched.
You can set a longer delay for collecting installation events with iOS Tracking Authorize Timeout Seconds in Configure SDK. The default setting for iOS Tracking Authorize Timeout Seconds is 300 seconds. You can set it up to 3600 seconds (1 hour).
Attention
Sufficient time must be configured to delay the collection of install events. If the delay time is up, the SDK will collect install events without identifiers before users can allow tracking on the ATT prompt.
Attention
The instructions below are optional. Proceed only if necessary.
Opt-in is a policy where you don't use a user's information until they agree to it.
After setting Auto Start Tracking Enabled to false in Configure SDK, call the StartTracking function at a time when events can be collected. Events are collected from the time the StartTracking function is called.
FAirbridge::StartTracking();
Attention
The instructions below are optional. Proceed only if necessary.
Opt-Out is a policy that uses user information before the user can opt out.
After setting Auto Start Tracking Enabled to true in Configure SDK, call the StopTracking function at a point when events cannot be collected. Stop collecting events from the time the StopTracking function is called.
FAirbridge::StopTracking();
Attention
The instructions below are optional. Proceed only if necessary.
SDK Signature prevents SDK spoofing to ensure that only events that have been verified for accuracy and safety can be used to measure ad performance.
SDK signature settings require SDK signature security information. SDK signature security information includes a secret ID and secret. You can find the required SDK signature security information in the Airbridge dashboard. For more information about SDK signature security information, see the Airbridge guide.
Enter the SDK Signature Secret ID from Configure SDK.
Enter the SDK Signature Secret from Configure SDK.
The SDK signature security information required to set up the SDK signature is listed below.
SDK Signature Secret ID: Secret ID. You can check it in Airbridge dashboard [Rule Management]>[Ad Fraud Verification Rule]>[SDK Signature]>[SDK Signature Security Information].
SDK Signature Secret: Secret. You can check it in Airbridge dashboard [Rule Management]> [Ad Fraud Verification Rules]> [SDK Signature]> [SDK Signature Security Information].
By setting up a deep link, you can send users who click on an ad with a tracking link to a specific page in your app of their choice. You can also see the performance of the deep link in Airbridge based on the information collected by the tracking link.
Airbridge automatically selects and utilizes the best Airbridge Deeplink for the environment, based on the Scheme Deeplink used for the user's movement, while creating the tracking link.
Airbridge deep link: https://YOUR_APP_NAME.airbridge.io/~~~
Scheme deep link: YOUR_SCHEME://product/12345
With the app installed, when a user opens a tracking link, the app opens with an Airbridge deep link. The Airbridge SDK converts the Airbridge deep link to the scheme deep link set in the tracking link. The converted scheme deep link is passed to the app.
When the app is not installed, it saves the Airbridge deep link when a user opens the tracking link. When the app is installed and launched after going to the app store or website, the Airbridge SDK converts the stored Airbridge deep link to a scheme deep link. The converted scheme deep link is passed to the app.
Set up a deep link. You'll need the information you set up in the Airbridge dashboard and the app page address used as the destination for the user.
First, register your deep link information with Airbridge.
For the deep linking setup, the following information must be entered into the Airbridge dashboard.
iOS URI scheme: The Airbridge deep link is converted to a scheme deep link using the iOS URI scheme.
iOS App ID: The universal link domain of the Airbridge deep link is set using the iOS App ID.
Android URI scheme: The Airbridge deep link is converted to a schema deep link using the Android URI scheme. This information is necessary for the App Link and URI scheme.
Package name: This is the Android app identifier necessary for the App Link and URI scheme.
Android sha256_cert_fingerprints: This is used for setting the App Link domain. This information is necessary for the App Link.
Attention
To properly redirect users as intended, submit different information for the production app and the development app.
Follow the steps below to enter the above information into the Airbridge dashboard.
1. Go to [Tracking Link]>[Deep Links] in the Airbridge dashboard.
2. Enter the iOS URI scheme in the iOS URI Scheme field. Include ://
. For example, if the iOS URI scheme is demo
, you enter it as demo://
.
3. In the Apple Developer Dashboard, go to [Identifier] of the app you want to set up the deep link. Find the App ID Prefix and Bundle ID.
4. The iOS App ID is in the format of App ID Prefix+ .+ Bundle ID
. Enter the iOS App ID into the iOS App ID field. For example, if the App ID Prefix is prefix
and the Bundle ID is example
, the iOS App ID is prefix.example
.
1. Go to [Tracking Link]>[Deep Links] in the Airbridge dashboard.
2. Enter the Android URI scheme into the Android URI Scheme field. Include ://
. For example, if the URI scheme is demo
, you must enter it as demo://
.
3. Enter the package name in the Package name field.
4. You need to find the sha256_cert_fingerprints. Run the following command from the keystore file you are deploying.
keytool -list -v -keystore YOUR_KEYSTORE.keystore
Find the SHA256 value in the results. The SHA256 value is the 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. Enter the SHA256 value into the sha256_cert_fingerprints field.
After you register your deep link information with Airbridge, you need to set up deep linking in your app. The development required for deep linking in your app is described below.
Enable your app to launch with an Airbridge deep link.
Collect Airbridge deep links from apps.
Sends the user to an Airbridge deep link.
See below.
Follow the steps below to enable app launch with Airbridge deep links after the user clicks on a tracking link.
Set up the scheme deep link to your app.
In Configure SDK, enter the iOS URI scheme that you entered in the dashboard in field iOS URI Scheme
.
Setting up Universal Link is done automatically through the App Name
value in Configure SDK.
Set up the scheme deep link to your app.
In Configure SDK, enter the Android URI scheme that you entered in the dashboard in field Android URI Scheme
.
Setting up App Links is done automatically through the App Name
value in Configure SDK.
When the Airbridge deeplink is executed, it is converted into a scheme deeplink and passed on to the OnDeeplinkReceived
callback. And if a deeplink that is not an Airbridge deeplink is executed, it is delivered to the callback without conversion.
Utilize the received deeplink to send the user to the set destination.
Click on Content Browser > Add/Import > New C++ Class...
and then specify the Parent Class as Game Mode Base
to create a Game Mode Base class.
Proceed with deeplink callback settings through the following method in the source code of the created Game Mode Base class
...
#include "AirbridgeUnreal.h"
void AExampleGameModeBase::BeginPlay()
{
...
FAirbridge::SetOnDeeplinkReceived([](const FString& Url)
{
// show proper content using url
});
...
}
Specify the game mode (e.g. ExampleGameModeBase) with the completed deeplink callback settings as the Default GameMode
field value in the Project > Maps & Modes > Default Modes
of the Unreal Editor Project Settings window.
When you click a tracking link with deferred deep linking enabled without the app installed, the Airbridge deep link is saved. When you set up deferred deep linking, the Airbridge SDK acquires the deep link in the following ways
The Airbridge SDK attempts to retrieve a deep link after initializing the SDK when all the following conditions are met. If the app is closed during retrieval, the Airbridge SDK treats it as if there is no stored Airbridge deep link.
The FAirbridge::StartTracking
function is called with the opt-in settings in place. Or, opt-in has not been set.
The ATT tracking response has been determined. Or, the event collection delay time set in the ATT prompt has expired.
Deferred deep links are automatically passed to the onDeeplinkReceived callback, so you don't need to set anything up.
The Airbridge SDK collects certain user actions in your service, depending on your settings, and sends them as in-app events.
Setting up a Hybrid App
You can set up the Unreal SDK to handle Airbridge-related work occurring on in-app websites in hybrid apps without changing the website code.
To send an event, you need to call the Airbridge.TrackEvent function. The Airbridge.TrackEvent function components are required and their types are shown below.
static void TrackEvent(
const FString& Category,
const UAirbridgeMap* SemanticAttributes = nullptr,
const UAirbridgeMap* CustomAttributes = nullptr
);
Name | Required | Type | Description |
---|---|---|---|
category | Required | String | Name of the event |
semanticAttributes | Optional | UAirbridgeMap | Semantic attributes of events |
customAttributes | Optional | UAirbridgeMap | Custom attributes of events |
Below you'll find the definition of each component and the strings you can use.
You can check the standard event categories provided by the Airbridge SDK in AirbridgeCategory. Or, enter the event category you've found in the standard event list.
Custom events can be sent by entering the event name set in the event taxonomy.
Please refer to the example below.
// track standard event (provided by sdk)
FAirbridge::TrackEvent(AirbridgeCategory::ORDER_COMPLETED);
// track standard event (not provided by sdk)
FAirbridge::TrackEvent("airbridge.ecommerce.order.canceled");
// track custom event
FAirbridge::TrackEvent("eventViewed");
Attention
The Airbridge SDK v4 attributes differ from the previous version. The previous version's attributes do not include action, label, and value.
You can collect additional information of the event through attributes.
Action, Label: Information which can be utilized in Airbridge reports as group-bys are collected.
Value: Information used for sales analysis is collected. Data collected can freely be applied in arithmetic operations.
Semantic Attribute: It is an attribute predefined by Airbridge. The list of semantic attributes provided by Airbridge can be found in the Airbridge guide.
Custom Attributes: Attributes defined by Airbridge users.
You can enter Action, Label, Value, and Semantic Attributes through the semanticAttributes parameter of the FAirbridge::TrackEvent
function, and enter Custom Attributes through the customAttributes parameter.
You can check the list of semantic attributes provided by Airbridge below.
Please refer to the example below.
UAirbridgeList* Products = UAirbridgeList::CreateObject();
UAirbridgeMap* PlasticHammer = UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, 12345);
Products->Add(PlasticHammer);
UAirbridgeMap *SemanticAttributes = UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::ACTION, "Tool")
->Set(AirbridgeAttribute::LABEL, "Hammer")
->Set(AirbridgeAttribute::VALUE, 10)
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::PRODUCTS, Products)
->Set("totalQuantity", 1);
UAirbridgeMap *CustomAttributes = UAirbridgeMap::CreateObject()
->Set("promotion", "FirstPurchasePromotion")
FAirbridge::TrackEvent(
"airbridge.ecommerce.order.canceled",
SemanticAttributes,
CustomAttributes
);
Attention
Semantic attributes and custom attributes only allow JSON as a data type.
JSON types: String, Number, Boolean, Object<String, JSON>, Array<JSON>
Types that cannot be used in semantic attributes and custom attributes: Struct, Class, etc.
The standard event categories and semantic attributes provided by the SDK are listed below.
Key | Type | Value |
---|---|---|
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 |
Key | Type | Value |
---|---|---|
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 |
See the example code for each data type below.
FAirbridge::TrackEvent(
"event",
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::VALUE, 10),
UAirbridgeMap::CreateObject()
->Set("string", "string")
->Set("number", 1000)
->Set("boolean", true)
->Set("object", UAirbridgeMap::CreateObject()->Set("key", "value"))
->Set("array", UAirbridgeList::CreateObject()->Add("value"))
);
Attention
The default settings will apply if no additional settings are configured. Proceed after reviewing whether additional settings are necessary.
You can add the necessary settings for the in-app events that you send.
The Airbridge SDK supports events triggered by users on a session basis. A session ends if any of the following conditions are met.
The app moves to the background, or the app is terminated
The session expires with the app being in the foreground
When the app is launched or an event is performed after the end of a session, a new session is initiated.
The default session timeout is set to 300 seconds. Use the Session Timeout Seconds
field of Configure SDK to modify this value of up to 604,800 seconds (7 days).
Attention
The Airbridge SDK collects Open events that initiate a new session and Foreground events. It does not collect these events during a session. To collect them while the session is being maintained, additional settings are required.
The Airbridge SDK maintains a queue of collected events and transmits them until the queue is empty.
If event transmission fails, transmission is attempted again after waiting for 1, 2, 4, ... seconds, depending on the number of times it failed. If the transmission continues to fail, the SDK waits for the set event transmission interval and repeats loading events until successful.
The default transmission interval is 0 seconds. Using the Event Transmit Interval Seconds
field of Configure SDK, you can modify it up to 86,400 seconds (1 day).
The Airbridge SDK stores events as long as they don't exceed the maximum event count and size limits. Excess events are discarded.
The default maximum event count is set to INT_MAX, and the default maximum event size is 1024 GiB (gibibytes). You can adjust these settings using the Event Buffer Count Limit
field and Event Buffer Size Limit In Gibibyte
field of Configure SDK. The highest allowable event count is INT_MAX, and the highest maximum event size you can set is 1024 GiB (gibibytes).
When the event deletion option is activated, all in-app events that are not transmitted during the initialization process of the Airbridge SDK are deleted. By default, the event deletion option is inactive.
By setting the Clear Event Buffer On Initialize Enabled
field of Configure SDK to true, the event deletion option is activated.
The Airbridge SDK supports functions to include device identifiers in all events for transmission.
Function | Description |
---|---|
| Adds additional device identifiers. Up to 10 can be entered. - Key: Maximum 128 characters. It must satisfy the regular expression - Value: Maximum 128 characters. |
| Deletes the specified device identifier from among the device identifiers. |
| Deletes all device identifiers. |
Refer to the example below.
FAirbridge::SetDeviceAlias("string", "string");
FAirbridge::RemoveDeviceAlias("string");
FAirbridge::ClearDeviceAlias();
The main in-app events that Airbridge collects are standard events and custom events. Standard events are events defined by Airbridge. See the example code below.
FAirbridge::SetUserID("string");
FAirbridge::SetUserAlias("string", "string");
FAirbridge::SetUserEmail("string");
FAirbridge::SetUserPhone("string");
FAirbridge::SetUserAttribute("string", "string");
FAirbridge::TrackEvent(AirbridgeCategory::SIGN_UP);
FAirbridge::SetUserID("string");
FAirbridge::SetUserAlias("string", "string");
FAirbridge::SetUserEmail("string");
FAirbridge::SetUserPhone("string");
FAirbridge::SetUserAttribute("string", "string");
FAirbridge::TrackEvent(AirbridgeConstant::AirbridgeCategory::SIGN_IN);
FAirbridge::TrackEvent(AirbridgeCategory::SIGN_OUT);
FAirbridge::ClearUser();
FAirbridge::TrackEvent(AirbridgeCategory::HOME_VIEWED);
FAirbridge::TrackEvent(
AirbridgeCategory::PRODUCT_LIST_VIEWED,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::LIST_ID, "84e6e236-38c4-48db-9b49-16e4cc064386")
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticFork")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 1)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::SEARCH_RESULTS_VIEWED,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::QUERY, "Plastic")
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticFork")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 1)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::PRODUCT_VIEWED,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::ADD_PAYMENT_INFO,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::TYPE, "CreditCard")
);
FAirbridge::TrackEvent(
AirbridgeCategory::ADD_TO_WISHLIST,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::LIST_ID, "189a2f8b-83ee-4074-8158-726be54e57d4")
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::ADDED_TO_CART,
UAirbridgeMap::CreateObject()
->Set(:AirbridgeAttribute::CART_ID, "421eaeb7-6e80-4694-933e-f2e1a55e9cbd")
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::INITIATE_CHECKOUT,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::TRANSACTION_ID, "0a7ee1ec-33da-4ffb-b775-89e80e75978a")
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticFork")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 1)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::ORDER_COMPLETED,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::VALUE, 11)
->Set(AirbridgeAttribute::TRANSACTION_ID, "8065ef16-162b-4a82-b683-e51aefdda7d5")
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::IN_APP_PURCHASED, true)
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticFork")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 1)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::ORDER_CANCELED,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::VALUE, 11)
->Set(AirbridgeAttribute::TRANSACTION_ID, "8065ef16-162b-4a82-b683-e51aefdda7d5")
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::IN_APP_PURCHASED, true)
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticFork")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 1)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::START_TRIAL,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::TRANSACTION_ID, "ef1e5271-0370-407c-b1e9-669a8df1dc2c")
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::PERIOD, "P1M")
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "306a57cb-f653-4220-a208-8405d8e4d506")
->Set(AirbridgeAttribute::PRODUCT_NAME, "MusicStreamingMembership")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 15)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::SUBSCRIBE,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::VALUE, 15)
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::TRANSACTION_ID, "cbe718c7-e44e-4707-b5cd-4a6a29f29649")
->Set(AirbridgeAttribute::PERIOD, "P1M")
->Set(AirbridgeAttribute::IS_RENEWAL, true)
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "306a57cb-f653-4220-a208-8405d8e4d506")
->Set(AirbridgeAttribute::PRODUCT_NAME, "MusicStreamingMembership")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 15)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::UNSUBSCRIBE,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::VALUE, 15)
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::TRANSACTION_ID, "cbe718c7-e44e-4707-b5cd-4a6a29f29649")
->Set(AirbridgeAttribute::IS_RENEWAL, true)
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "306a57cb-f653-4220-a208-8405d8e4d506")
->Set(AirbridgeAttribute::PRODUCT_NAME, "MusicStreamingMembership")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 15)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::AD_IMPRESSION,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::VALUE, 0.01)
->Set(AirbridgeAttribute::AD_PARTNERS,
UAirbridgeMap::CreateObject()
->Set("mopub",
UAirbridgeMap::CreateObject()
->Set("app_version", "5.18.0")
->Set("adunit_id", "12345")
->Set("adunit_name", "12345")
->Set("adunit_format", "Banner")
->Set("id", "12345")
->Set("currency", "USD")
->Set("publisher_revenue", 12345.123)
->Set("adgroup_id", "12345")
->Set("adgroup_name", "12345")
->Set("adgroup_type", "12345")
->Set("adgroup_priority", "12345")
->Set("country", "kr")
->Set("precision", "publisher_defined")
->Set("network_name", "12345")
->Set("network_placement_id", "12345")
->Set("demand_partner_data", "12345")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::AD_CLICK,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::VALUE, 0.01)
->Set(AirbridgeAttribute::AD_PARTNERS,
UAirbridgeMap::CreateObject()
->Set("mopub",
UAirbridgeMap::CreateObject()
->Set("app_version", "5.18.0")
->Set("adunit_id", "12345")
->Set("adunit_name", "12345")
->Set("adunit_format", "Banner")
->Set("id", "12345")
->Set("currency", "USD")
->Set("publisher_revenue", 12345.123)
->Set("adgroup_id", "12345")
->Set("adgroup_name", "12345")
->Set("adgroup_type", "12345")
->Set("adgroup_priority", "12345")
->Set("country", "kr")
->Set("precision", "publisher_defined")
->Set("network_name", "12345")
->Set("network_placement_id", "12345")
->Set("demand_partner_data", "12345")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::COMPLETE_TUTORIAL,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::DESCRIPTION, "Finish Initial Tutorial")
);
FAirbridge::TrackEvent(
AirbridgeCategory::ACHIEVE_LEVEL,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::LEVEL, 13)
);
FAirbridge::TrackEvent(
AirbridgeCategory::UNLOCK_ACHIEVEMENT,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::ACHIEVEMENT_ID, "36a0f0bb-b153-4be1-a3e0-3cb5b2b076c1")
->Set(AirbridgeAttribute::DESCRIPTION, "Get Score Over 50")
->Set(AirbridgeAttribute::SCORE, 80)
);
FAirbridge::TrackEvent(
AirbridgeCategory::RATE,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::RATE_ID, "531c64b3-4704-4780-a306-89014ec18daf")
->Set(AirbridgeAttribute::RATE, 4.5)
->Set(AirbridgeAttribute::MAX_RATE, 5)
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::SHARE,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::DESCRIPTION, "Share Promotion")
->Set(AirbridgeAttribute::SHARED_CHANNEL, "CopyLink")
);
FAirbridge::TrackEvent(
AirbridgeCategory::SCHEDULE,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::SCHEDULE_ID, "75712915-2cd9-4e42-a85e-8d42f356f4c6")
->Set(AirbridgeAttribute::DATE_TIME, "2024-01-01T00:00:00+00:00")
->Set(AirbridgeAttribute::PLACE, "ConferenceRoom")
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "abb3e65d-17bc-4b28-89e3-5e356c0ea697")
->Set(AirbridgeAttribute::PRODUCT_NAME, "ConferenceRoom")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::SPEND_CREDITS,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::TRANSACTION_ID, "22eb193d-be11-4fe4-95da-c91a196faf1c")
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
A custom event is a newly defined user behavior that does not fit into a standard event to track ad performance specific to your app service. See the example code below.
FAirbridge::TrackEvent(
"event",
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::VALUE, 10),
UAirbridgeMap::CreateObject()
->Set("string", "string")
->Set("number", 1000)
->Set("boolean", true)
->Set("object", UAirbridgeMap::CreateObject()->Set("key", "value"))
->Set("array", UAirbridgeList::CreateObject()->Add("value"))
);
Send user information in the event. With this user information, you can better analyze the performance of your ads across web and apps.
The user ID is the user identifier utilized by the service. The user ID must be a unique ID that identifies the user as a single user across web and apps.
Function |
Description |
---|---|
| Set your user ID. |
| Clear the user ID. |
| Enter additional user identifiers. You can enter up to 10. |
| Remove the specified identifier from the additional user identifiers you entered. |
| Clear any additional user identifiers you entered. |
See the example below.
// ID
FAirbridge::SetUserID("testID");
// Alias
FAirbridge::SetUserAlias("ADD_YOUR_KEY", "ADD_YOUR_VALUE");
FAirbridge::RemoveUserAlias("DELETE_THIS_KEY");
FAirbridge::ClearUserAlias();
Attention
Sensitive user information may be included. Send after a thorough review with a legal advisor.
You can send additional user information by setting user attributes.
Function |
Description |
---|---|
| Enter the user email. It is hashed with SHA256. |
| Clear the user's email. |
| Enter the user's phone number. It is hashed with SHA256. |
| Clear the user's phone. |
| Enter additional user attributes. You can enter up to 100. |
| Delete the specified attribute from the additional user attributes you entered. |
| Clear any additional user attributes you entered. |
See the example below.
// Automatically hashed on client side using SHA256
// Can turn off hashing feature with special flag
FAirbridge::SetUserEmail("testID@ab180.co");
FAirbridge::SetUserPhone("821012341234");
// Attributes
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", 1);
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", 1L);
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", 1f);
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", 1.0);
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", "1");
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", true);
FAirbridge::RemoveUserAttribute("DELETE_THIS_KEY");
FAirbridge::ClearUserAttributes();
Setting User Info Hash Enabled to false in Configure SDK will send user emails and phone numbers without hashing them. The default setting is true.
You can initialize user information with the FAirbridge::ClearUser
function.
Attention
The instructions below are optional. Proceed only if necessary.
You can make additional settings for the Unreal SDK.
Attention
The instructions below are optional. Proceed only if necessary.
The deep links received through the FAirbridge::SetOnDeeplinkReceived
method of the Airbridge Unreal SDK include not only Airbridge deep links but also deep links from other solutions.
...
#include "AirbridgeUnreal.h"
void AExampleGameModeBase::BeginPlay()
{
...
FAirbridge::SetOnDeeplinkReceived([](const FString& Url)
{
// show proper content using url
});
...
}
If you set Is Handle Airbridge Deeplink Only
to true
, only Airbridge deep links will be delivered through the OnDeeplinkReceived
callback. If you are using deep links from different solutions, you can handle the deep links separately.
Depending on how the link is opened, it may be difficult to properly utilize the app's tracking link in-app.
The FAirbridge::Click
function or FAirbridge::Impression
function allows you to utilize tracking links normally, bypassing the external browser.
When a user clicks on the tracking link in the app, it calls the FAirbridge::Click
function. When this function is called, it sends a scheme deeplink according to the tracking link settings, or sends it to the app market or website.
FAirbridge::Click(
"https://abr.ge/~~~",
[]()
{
// when url is tracking link and succeed
},
[](const FString& Error)
{
// when url is tracking link and failed
// example: url is another app's tracking link, internet is not connected
}
);
When a user is impressed to the tracking link, it calls the FAirbridge::Impression
function. Calling this function collects Impression event data.
FAirbridge::Impression(
"https://abr.ge/~~~",
[]()
{
// when url is tracking link and succeed
},
[](const FString& Error)
{
// when url is tracking link and failed
// example: url is another app's tracking link, internet is not connected
}
);
Attention
When you set up the Airbridge SDK to use tracking links within apps, every time a tracking link is used within the app, Deeplink Pageviews are aggregated as Target Events. The deep link performance may be affected when Deeplink Pageviews occur frequently right after Deeplink Opens.
The attribution window for Deeplink Pageviews is set to 3 days by default. If you want to change the attribution window for Deeplink Pageviews, contact your Airbridge CSM. If you don't have a designated CSM, contact the Airbridge Help Center.
Attention
It takes some time for the Airbridge SDK to collect attribution results. We do not recommend using attribution results for functionalities requiring real-time processing.
You can get attribution results for installation events with the FAirbridge::SetOnAttributionReceived
function.
static void OnReceived(TMap<FString, FString> Attribution) { }
void SomeFunction()
{
FAirbridge::SetOnAttributionReceived(OnReceived);
}
Depending on whether the attribution result exists, a value is passed as shown below.
If the attribution result exists, a dictionary including the values below will be passed as a callback. All keys provide the attribution data. For example, attributedChannel
contains information about the ad channel to which the ad performance is attributed.
The attribution results are delivered as a callback within 1 minute after SDK initialization. If the app is closed before the attribution result is delivered, the previous attribution results will be delivered as a callback within 1 minute the next time the app is launched. Depending on network conditions and other factors, there may be a delay of up to 5 minutes.
Key | Type | Description |
---|---|---|
attributedChannel | String | Channel |
attributedCampaign | String | Campaign |
attributedAdGroup | String | Ad Group |
attributedAdCreative | String | Ad Creative |
attributedContent | String | Content |
attributedTerm | String | Keyword |
attributedSubPublisher | String | Sub Publisher |
attributedSubSubPublisher1 | String | Sub Sub Publisher 1 |
attributedSubSubPublisher2 | String | Sub Sub Publisher 2 |
attributedSubSubPublisher3 | String | Sub Sub Publisher 3 |
If there is no attribution result, the following dictionary will be sent as a callback. For this data to be delivered, the app must be launched again at least 3 hours after the SDK initialization.
{
"attributedChannel": "unattributed"
}
Attention
Apply the code below using a custom iOS AppDelegate.
After the push notification is clicked, you need to pass the deep link information in the payload to the Airbridge SDK to collect the deep link event. Set up the FAirbridge::trackDeeplink
function.
Add the code below to your custom AppDelegate.
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <Airbridge/Airbridge.h>
#import <UserNotifications/UserNotifications.h>
@interface SomeAppDelegate : NSObject <UIApplicationDelegate, UNUserNotificationCenterDelegate>
@end
@implementation SomeAppDelegate
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
UIApplicationState state = UIApplication.sharedApplication.applicationState;
if (state == UIApplicationStateInactive) {
NSURL *url = // 푸시 알림 페이로드의 딥링크
Airbridge.trackDeeplink(url)
}
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler {
UIApplicationState state = UIApplication.sharedApplication.applicationState;
if ((state == UIApplicationStateInactive || state == UIApplicationStateBackground)
&& [response.actionIdentifier isEqualToString:UNNotificationDefaultActionIdentifier]) {
NSURL *url = // 푸시 알림 페이로드의 딥링크
Airbridge.trackDeeplink(url)
}
}
#if PLATFORM_IOS
#include "SomeAppDelegate.h"
#endif
void SomeCpp::SomeCpp
{
#if PLATFORM_IOS
[SomeAppDelegate load];
#endif
}
The Airbridge SDK collects deep link events when an app is launched with a deep link, regardless of the service that generated the deep link. If you find that you are collecting too many deep link events, you can set Track Airbridge Link Only to true in Configure SDK to collect only airbridge deep links.
The Airbridge SDK collects Open and Foreground events that start a new session. It does not collect these events while the session is persisted.
Setting Track In Session Life Cycle Event Enabled to true in Configure SDK allows you to collect Open and Foreground events while the session is persisted.
Any foreground events collected are logged as running (Open) events.
To comply with the Digital Markets Act (DMA), you must pass user response information (User Consent) to Airbridge. For more information about the DMA and who it applies to, please see the Airbridge guide.
If you are in the European Economic Area (EEA), you must always pass information to Airbridge about whether the user is in the European Economic Area and the user's response.
1. Check the region of the user who launched the app. If the user launched the app from the EEA (eea=1), check to see if you already have collected user response information. If you have collected user response information, then proceed to step 3.
If the user launched the app from outside the EEA, then you don't need to collect user response information.
Translated with www.DeepL.com/Translator (free version)
Note
Airbridge cannot provide guidance on storing the user consent data and implementing the prompts. For assistance, consult legal professionals.
2. If you don't have any user response information collected, collect user response information from prompts, etc. The information you need to collect in this step is adPersonalization, adUserData
.
Attention
Advertisers must collect user consent data from all existing and new users in the EEA region at least once starting March 6, 2024.
The table below illustrates the consent data that must be passed to Airbridge. The eea
value is neither the response from the user nor a value automatically filled in by Airbridge. Advertisers should determine the eea
value based on whether the user is in the EEA region and whether the DMA applies or not.
Field Name in Airbridge |
Field Name in Google |
Description |
---|---|---|
<string> |
| Indicates whether the user is in the EEA region and whether the DMA applies or not. The value is neither the response from the user nor a value automatically filled in by Airbridge. Determine the value based on where the user is located and whether the DMA applies or not. Values other than - - |
<string> |
| Indicates whether the user gave Google consent to use their data for ad personalization. Values other than - - |
<string> |
| Indicates whether the user gave consent to pass the user data used for advertising to Google. Values other than - - |
3. Set Auto Start Tracking Enabled to false in Configure SDK.
4. Initialize the Airbridge SDK and pass user response information to Airbridge before collecting user information.
Attention
Take note of the following items.
Use the field names specified by Airbridge:
eea
,adPersonalization
, andadUserData
Input
0
or1
in accordance with the consent data collected.
// Set device alias into Airbridge SDK
// Based on actual region
FAirbridge::SetDeviceAlias("eea", "0" /* or "1" */);
// Based on actual user consent
FAirbridge::SetDeviceAlias("adPersonalization", "0" /* or "1" */);
FAirbridge::SetDeviceAlias("adUserData", "0" /* or "1" */);
// Explicitly start tracking
FAirbridge::StartTracking();
You can serve deferred deep links in Meta Ads in the following ways The Airbridge SDK collects meta deferred app links first. If there is no meta deferred app link, it collects the Airbridge deferred deep link.
SKAdNetwork campaigns in Meta Ads do not support meta deferred app links.
1. Install the Facebook SDK. Refer to the Meta Ads Guide (iOS).
2. in Configure SDK, set Facebook Deferred App Link Enabled to true.
Attention
If not activated immediately after the SDK initialization, the Install, Open, Deeplink events may not be collected.
Initializing the Airbridge SDK enables all features. You can initialize the Airbridge SDK with all features disabled by setting SDK Enabled to false in Configure SDK.
Alternatively, you can check whether the Airbridge SDK is enabled and enable or disable all features in the following ways
FAirbridge::IsSDKEnabled();
FAirbridge::EnableSDK();
FAirbridge::DisableSDK();
This setting is required for Meta Install Referrer collection. During the SDK initialization step, pass your Facebook App ID to Meta Install Referrer (Facebook App ID) in Configure SDK.
Once set up, you'll need to enter the decryption key into the Airbridge dashboard to view the decrypted meta-install referrer. For instructions on how to enter the decryption key, see the Airbridge guide on .
Airbridge sends a silent push to users whose app events have been tracked at least once in the last six months, every day between 0:00 and 1:00 KST, to check for app uninstalls. App deletion events can be viewed in Airbridge reports and by extracting the original data.
For detailed setup instructions and explanations, see the Airbridge guide.
Some third-party solutions require SDK setup to integrate. We recommend that you complete the necessary setup for your third-party solution before collecting data with the Airbridge SDK.
Refer to the guides below for the settings required for each third-party solution integration.
The logs provided by the Airbridge SDK are organized into Debug, Info, Warning, Error, and Fault levels. The Debug level is the least critical log, and the Fault level is the most critical log.
The Airbridge SDK provides logs above the Warning, Error, and Fault levels by default. You can view logs from that log level up to the Fault level by entering a log level in Log Level in Configure SDK.
Was this page helpful?
FAirbridge::StartTracking();
FAirbridge::StopTracking();
keytool -list -v -keystore YOUR_KEYSTORE.keystore
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
...
#include "AirbridgeUnreal.h"
void AExampleGameModeBase::BeginPlay()
{
...
FAirbridge::SetOnDeeplinkReceived([](const FString& Url)
{
// show proper content using url
});
...
}
...
#include "AirbridgeUnreal.h"
void AExampleGameModeBase::BeginPlay()
{
...
FAirbridge::SetOnDeeplinkReceived([](const FString& Url)
{
// show proper content using url
});
...
}
static void TrackEvent(
const FString& Category,
const UAirbridgeMap* SemanticAttributes = nullptr,
const UAirbridgeMap* CustomAttributes = nullptr
);
// track standard event (provided by sdk)
FAirbridge::TrackEvent(AirbridgeCategory::ORDER_COMPLETED);
// track standard event (not provided by sdk)
FAirbridge::TrackEvent("airbridge.ecommerce.order.canceled");
// track custom event
FAirbridge::TrackEvent("eventViewed");
UAirbridgeList* Products = UAirbridgeList::CreateObject();
UAirbridgeMap* PlasticHammer = UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, 12345);
Products->Add(PlasticHammer);
UAirbridgeMap *SemanticAttributes = UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::ACTION, "Tool")
->Set(AirbridgeAttribute::LABEL, "Hammer")
->Set(AirbridgeAttribute::VALUE, 10)
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::PRODUCTS, Products)
->Set("totalQuantity", 1);
UAirbridgeMap *CustomAttributes = UAirbridgeMap::CreateObject()
->Set("promotion", "FirstPurchasePromotion")
FAirbridge::TrackEvent(
"airbridge.ecommerce.order.canceled",
SemanticAttributes,
CustomAttributes
);
FAirbridge::TrackEvent(
"event",
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::VALUE, 10),
UAirbridgeMap::CreateObject()
->Set("string", "string")
->Set("number", 1000)
->Set("boolean", true)
->Set("object", UAirbridgeMap::CreateObject()->Set("key", "value"))
->Set("array", UAirbridgeList::CreateObject()->Add("value"))
);
FAirbridge::TrackEvent(
"event",
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::VALUE, 10),
UAirbridgeMap::CreateObject()
->Set("string", "string")
->Set("number", 1000)
->Set("boolean", true)
->Set("object", UAirbridgeMap::CreateObject()->Set("key", "value"))
->Set("array", UAirbridgeList::CreateObject()->Add("value"))
);
FAirbridge::SetDeviceAlias("string", "string");
FAirbridge::RemoveDeviceAlias("string");
FAirbridge::ClearDeviceAlias();
FAirbridge::SetUserID("string");
FAirbridge::SetUserAlias("string", "string");
FAirbridge::SetUserEmail("string");
FAirbridge::SetUserPhone("string");
FAirbridge::SetUserAttribute("string", "string");
FAirbridge::TrackEvent(AirbridgeCategory::SIGN_UP);
FAirbridge::SetUserID("string");
FAirbridge::SetUserAlias("string", "string");
FAirbridge::SetUserEmail("string");
FAirbridge::SetUserPhone("string");
FAirbridge::SetUserAttribute("string", "string");
FAirbridge::TrackEvent(AirbridgeConstant::AirbridgeCategory::SIGN_IN);
FAirbridge::TrackEvent(AirbridgeCategory::SIGN_OUT);
FAirbridge::ClearUser();
FAirbridge::TrackEvent(AirbridgeCategory::HOME_VIEWED);
FAirbridge::TrackEvent(
AirbridgeCategory::PRODUCT_LIST_VIEWED,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::LIST_ID, "84e6e236-38c4-48db-9b49-16e4cc064386")
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticFork")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 1)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::SEARCH_RESULTS_VIEWED,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::QUERY, "Plastic")
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticFork")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 1)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::PRODUCT_VIEWED,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::ADD_PAYMENT_INFO,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::TYPE, "CreditCard")
);
FAirbridge::TrackEvent(
AirbridgeCategory::ADD_TO_WISHLIST,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::LIST_ID, "189a2f8b-83ee-4074-8158-726be54e57d4")
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::ADDED_TO_CART,
UAirbridgeMap::CreateObject()
->Set(:AirbridgeAttribute::CART_ID, "421eaeb7-6e80-4694-933e-f2e1a55e9cbd")
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::INITIATE_CHECKOUT,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::TRANSACTION_ID, "0a7ee1ec-33da-4ffb-b775-89e80e75978a")
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticFork")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 1)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::ORDER_COMPLETED,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::VALUE, 11)
->Set(AirbridgeAttribute::TRANSACTION_ID, "8065ef16-162b-4a82-b683-e51aefdda7d5")
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::IN_APP_PURCHASED, true)
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticFork")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 1)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::ORDER_CANCELED,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::VALUE, 11)
->Set(AirbridgeAttribute::TRANSACTION_ID, "8065ef16-162b-4a82-b683-e51aefdda7d5")
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::IN_APP_PURCHASED, true)
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "d6ab2fbe-decc-4362-b719-d257a131e91e")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticFork")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 1)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::START_TRIAL,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::TRANSACTION_ID, "ef1e5271-0370-407c-b1e9-669a8df1dc2c")
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::PERIOD, "P1M")
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "306a57cb-f653-4220-a208-8405d8e4d506")
->Set(AirbridgeAttribute::PRODUCT_NAME, "MusicStreamingMembership")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 15)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::SUBSCRIBE,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::VALUE, 15)
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::TRANSACTION_ID, "cbe718c7-e44e-4707-b5cd-4a6a29f29649")
->Set(AirbridgeAttribute::PERIOD, "P1M")
->Set(AirbridgeAttribute::IS_RENEWAL, true)
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "306a57cb-f653-4220-a208-8405d8e4d506")
->Set(AirbridgeAttribute::PRODUCT_NAME, "MusicStreamingMembership")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 15)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::UNSUBSCRIBE,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::VALUE, 15)
->Set(AirbridgeAttribute::CURRENCY, "USD")
->Set(AirbridgeAttribute::TRANSACTION_ID, "cbe718c7-e44e-4707-b5cd-4a6a29f29649")
->Set(AirbridgeAttribute::IS_RENEWAL, true)
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "306a57cb-f653-4220-a208-8405d8e4d506")
->Set(AirbridgeAttribute::PRODUCT_NAME, "MusicStreamingMembership")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 15)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::AD_IMPRESSION,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::VALUE, 0.01)
->Set(AirbridgeAttribute::AD_PARTNERS,
UAirbridgeMap::CreateObject()
->Set("mopub",
UAirbridgeMap::CreateObject()
->Set("app_version", "5.18.0")
->Set("adunit_id", "12345")
->Set("adunit_name", "12345")
->Set("adunit_format", "Banner")
->Set("id", "12345")
->Set("currency", "USD")
->Set("publisher_revenue", 12345.123)
->Set("adgroup_id", "12345")
->Set("adgroup_name", "12345")
->Set("adgroup_type", "12345")
->Set("adgroup_priority", "12345")
->Set("country", "kr")
->Set("precision", "publisher_defined")
->Set("network_name", "12345")
->Set("network_placement_id", "12345")
->Set("demand_partner_data", "12345")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::AD_CLICK,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::VALUE, 0.01)
->Set(AirbridgeAttribute::AD_PARTNERS,
UAirbridgeMap::CreateObject()
->Set("mopub",
UAirbridgeMap::CreateObject()
->Set("app_version", "5.18.0")
->Set("adunit_id", "12345")
->Set("adunit_name", "12345")
->Set("adunit_format", "Banner")
->Set("id", "12345")
->Set("currency", "USD")
->Set("publisher_revenue", 12345.123)
->Set("adgroup_id", "12345")
->Set("adgroup_name", "12345")
->Set("adgroup_type", "12345")
->Set("adgroup_priority", "12345")
->Set("country", "kr")
->Set("precision", "publisher_defined")
->Set("network_name", "12345")
->Set("network_placement_id", "12345")
->Set("demand_partner_data", "12345")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::ACHIEVE_LEVEL,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::LEVEL, 13)
);
FAirbridge::TrackEvent(
AirbridgeCategory::UNLOCK_ACHIEVEMENT,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::ACHIEVEMENT_ID, "36a0f0bb-b153-4be1-a3e0-3cb5b2b076c1")
->Set(AirbridgeAttribute::DESCRIPTION, "Get Score Over 50")
->Set(AirbridgeAttribute::SCORE, 80)
);
FAirbridge::TrackEvent(
AirbridgeCategory::COMPLETE_TUTORIAL,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::DESCRIPTION, "Finish Initial Tutorial")
);
FAirbridge::TrackEvent(
AirbridgeCategory::RATE,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::RATE_ID, "531c64b3-4704-4780-a306-89014ec18daf")
->Set(AirbridgeAttribute::RATE, 4.5)
->Set(AirbridgeAttribute::MAX_RATE, 5)
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::SHARE,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::DESCRIPTION, "Share Promotion")
->Set(AirbridgeAttribute::SHARED_CHANNEL, "CopyLink")
);
FAirbridge::TrackEvent(
AirbridgeCategory::SCHEDULE,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::SCHEDULE_ID, "75712915-2cd9-4e42-a85e-8d42f356f4c6")
->Set(AirbridgeAttribute::DATE_TIME, "2024-01-01T00:00:00+00:00")
->Set(AirbridgeAttribute::PLACE, "ConferenceRoom")
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "abb3e65d-17bc-4b28-89e3-5e356c0ea697")
->Set(AirbridgeAttribute::PRODUCT_NAME, "ConferenceRoom")
)
)
);
FAirbridge::TrackEvent(
AirbridgeCategory::SPEND_CREDITS,
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::TRANSACTION_ID, "22eb193d-be11-4fe4-95da-c91a196faf1c")
->Set(AirbridgeAttribute::PRODUCTS,
UAirbridgeList::CreateObject()
->Add(
UAirbridgeMap::CreateObject()
->Set(AirbridgeAttribute::PRODUCT_ID, "0117b32a-5a6c-4d4c-b64c-7858e07dba78")
->Set(AirbridgeAttribute::PRODUCT_NAME, "PlasticHammer")
->Set(AirbridgeAttribute::PRODUCT_PRICE, 10)
->Set(AirbridgeAttribute::PRODUCT_QUANTITY, 1)
->Set(AirbridgeAttribute::PRODUCT_CURRENCY, "USD")
)
)
);
// ID
FAirbridge::SetUserID("testID");
// Alias
FAirbridge::SetUserAlias("ADD_YOUR_KEY", "ADD_YOUR_VALUE");
FAirbridge::RemoveUserAlias("DELETE_THIS_KEY");
FAirbridge::ClearUserAlias();
// Automatically hashed on client side using SHA256
// Can turn off hashing feature with special flag
FAirbridge::SetUserEmail("testID@ab180.co");
FAirbridge::SetUserPhone("821012341234");
// Attributes
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", 1);
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", 1L);
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", 1f);
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", 1.0);
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", "1");
FAirbridge::SetUserAttribute("ADD_YOUR_KEY", true);
FAirbridge::RemoveUserAttribute("DELETE_THIS_KEY");
FAirbridge::ClearUserAttributes();
FAirbridge::Click(
"https://abr.ge/~~~",
[]()
{
// when url is tracking link and succeed
},
[](const FString& Error)
{
// when url is tracking link and failed
// example: url is another app's tracking link, internet is not connected
}
);
FAirbridge::Impression(
"https://abr.ge/~~~",
[]()
{
// when url is tracking link and succeed
},
[](const FString& Error)
{
// when url is tracking link and failed
// example: url is another app's tracking link, internet is not connected
}
);
static void OnReceived(TMap<FString, FString> Attribution) { }
void SomeFunction()
{
FAirbridge::SetOnAttributionReceived(OnReceived);
}
{
"attributedChannel": "unattributed"
}
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <Airbridge/Airbridge.h>
#import <UserNotifications/UserNotifications.h>
@interface SomeAppDelegate : NSObject <UIApplicationDelegate, UNUserNotificationCenterDelegate>
@end
@implementation SomeAppDelegate
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
UIApplicationState state = UIApplication.sharedApplication.applicationState;
if (state == UIApplicationStateInactive) {
NSURL *url = // 푸시 알림 페이로드의 딥링크
Airbridge.trackDeeplink(url)
}
}
- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler {
UIApplicationState state = UIApplication.sharedApplication.applicationState;
if ((state == UIApplicationStateInactive || state == UIApplicationStateBackground)
&& [response.actionIdentifier isEqualToString:UNNotificationDefaultActionIdentifier]) {
NSURL *url = // 푸시 알림 페이로드의 딥링크
Airbridge.trackDeeplink(url)
}
}
#if PLATFORM_IOS
#include "SomeAppDelegate.h"
#endif
void SomeCpp::SomeCpp
{
#if PLATFORM_IOS
[SomeAppDelegate load];
#endif
}
// Set device alias into Airbridge SDK
// Based on actual region
FAirbridge::SetDeviceAlias("eea", "0" /* or "1" */);
// Based on actual user consent
FAirbridge::SetDeviceAlias("adPersonalization", "0" /* or "1" */);
FAirbridge::SetDeviceAlias("adUserData", "0" /* or "1" */);
// Explicitly start tracking
FAirbridge::StartTracking();
FAirbridge::IsSDKEnabled();
FAirbridge::EnableSDK();
FAirbridge::DisableSDK();