You'll find what you need to know about the process of updating the Airbridge iOS SDK. We recommend that you check everything from the current version onwards to the version after the update.
Please update the Airbridge iOS SDK to 4.0 to check.
iOS SDK name changed from AirBridge to Airbridge. The AirBridge class has been changed to the Airbridge class. Functions and options have been renamed.
AirBridge | AirbridgeOptionBuilder | Change |
---|---|---|
- | AirbridgeOptionBuilder(name: String, token: String) | The option has been changed so that you can set it through the Builder. |
- | build() | The option has been changed to be unmodifiable after SDK initialization. |
setLogLevel(ABLogLevel) | setLogLevel(AirbridgeLogLevel) | The type name has been changed. |
setPaginateLogEnabled(Bool) | setPaginateLogEnabled(Bool) | - |
state().setSDKDevelopmentPlatform(String) | setSDKDevelopmentPlatform(String) | The name has been changed. |
- | setAppGroup(String) | New features have been added. |
setSDKEnabled(Bool) | setSDKEnabled(Bool) | - |
- | setTrackingLinkCustomDomains([String]) | The setting through Info.plist has been changed to an option. |
setIsFacebookDeferredAppLinkEnabled(Bool) | setTrackMetaDeferredAppLinkEnabled(Bool) | The name has been changed. |
deeplink().setDeeplinkCallback((String) -> Void) | - | The role has been transferred to the handleDeeplink function. |
deeplink().setDeferredDeeplinkCallback((String) -> Void) | - | The role has been transferred to the handleDeferredDeeplink function. |
deeplink().setHandleTrackingLinkTimeout: UInt | - | The feature has been removed. (It will be fixed to the default of 3 seconds.) |
setAutoStartTrackingEnabled(Bool) | setAutoStartTrackingEnabled(Bool) | - |
- | setAutoDetermineTrackingAuthorizationEnabled(Bool) | New features have been added. |
setting().trackingAuthorizeTimeout: UInt | setAutoDetermineTrackingAuthorizationTimeout(second: Double) | The name has been changed. And the unit has been changed from milliseconds to seconds. Also, a maximum limit of 1 hour has been added. |
setting().isRestartTrackingAuthorizeTimeout: Bool | - | The function has been removed. (Fixed to the default, true.) |
setIsUserInfoHashed(Bool) | setHashUserInformationEnabled(Bool) | The name has been changed. |
setSessionTimeout(Int) | setSessionTimeout(second: Double) | The unit has been changed from milliseconds to seconds. And a maximum limit of 7 days has been added. |
setting().setTrackInSessionLifeCycleEventEnabled(Bool) | setTrackInSessionLifecycleEventEnabled(Bool) | The name has been changed. |
setIsTrackAirbridgeDeeplinkOnly(Bool) | setTrackAirbridgeDeeplinkOnlyEnabled(Bool) | The name has been changed. |
setSDKSignature(id: String, secret: String) | setSDKSignature(id: String, secret: String) | - |
resetEventBufferEnabled(Bool) | setClearEventBufferOnInitializeEnabled(Bool) | The name has been changed. |
setting().isResetEventBufferEnabled: Bool | setClearEventBufferOnInitializeEnabled(Bool) | The name has been changed. |
- | setPauseEventTransmitOnBackgroundEnabled(Bool) | New features have been added. |
setting().setEventMaximumBufferCount(UInt) | setEventBufferCountLimit(Int) | The name has been changed. |
setting().setEventMaximumBufferSize(UInt) | setEventBufferSizeLimit(gibibyte: Double) | The name has been changed. And the unit has been changed from byte to gibibyte. |
setting().setEventTransmitInterval(UInt) | setEventTransmitInterval(second: Double) | The name has been changed. And the unit has been changed from milliseconds to seconds. Also, a maximum limit of 1 day has been added. |
setting().attributionCallback: ([String: String]) -> Void | setOnAttributionReceived(([String: String]) -> Void) | The name has been changed. |
AirBridge | Airbridge | Change |
---|---|---|
getInstance(String, appName: String) | initializeSDK(option: AirbridgeOption) | The name has been changed. |
isSDKEnabled: Bool | isSDKEnabled: Bool | - |
enableSDK() | enableSDK() | - |
disableSDK() | disableSDK() | The implementation method that restricted access to SDK components has been changed to remove components from memory. |
startTracking() | startTracking() | - |
deeplink().handleURLSchemeDeeplink(URL) | trackDeeplink(url: URL) | The name has been changed. |
deeplink().handleUserActivity(NSUserActivity) | trackDeeplink(userActivity: NSUserActivity) | The name has been changed. |
- | handleDeeplink(url: URL, onSuccess: (URL) -> Void, onFailure: (Error) -> Void) -> Bool | The "setDeeplinkCallback" option has been moved. |
- | handleDeeplink(userActivity: NSUserActivity, onSuccess: (URL) -> Void, onFailure: (Error) -> Void) -> Bool | The "setDeeplinkCallback" option has been moved. |
- | handleDeferredDeeplink(url: URL, onSuccess: (URL) -> Void, onFailure: (Error) -> Void) -> Bool | The "setDeferredDeeplinkCallback" option has been moved. |
- | trackEvent(category: String, semanticAttributes: [String: Any], customAttributes: [String: Any]) | The event transmission method has been changed. |
placement().click(URL, completion: (Error?) -> Void) | click(trackingLink: URL, onSuccess: () -> Void, onFailure: (Error) -> Void) -> Bool | The name has been changed. |
placement().impression(URL, completion: (Error?) -> Void) | impression(trackingLink: URL, onSuccess: () -> Void, onFailure: (Error) -> Void) -> Bool | The name has been changed. |
webInterface().inject(to: WKUserContentController, withWebToken: String) | setWebInterface(controller: WKUserContentController, webToken: String) | The name has been changed. And the DeviceAlias integration function has been added. |
deviceUUID: String | fetchDeviceUUID(onSuccess: (String) -> Void, onFailure: (Error) -> Void) -> Bool | The name has been changed. The function has been modified to operate asynchronously. |
fetchAirbridgeGeneratedUUID((String) -> Void) -> Bool | fetchAirbridgeGeneratedUUID(onSuccess: (String) -> Void, onFailure: (Error) -> Void) -> Bool | The name has been changed. |
- | isUninstallTrackingNotification([String: Any]) -> Bool | New features have been added. |
state().setUserID(String) | setUserID(String) | The name has been changed. |
- | clearUserID() | New features have been added. |
state().setUserEmail(String) | setUserEmail(String) | The name has been changed. |
- | clearUserEmail() | New features have been added. |
state().setUserPhone(String) | setUserPhone(String) | The name has been changed. |
- | clearUserPhone() | New features have been added. |
addUserAttribute(key: String, value: Any) | setUserAttribute(key: String, value: Any) | The name has been changed. |
removeUserAttribute(String) | removeUserAttribute(key: String) | The name has been changed. |
clearUserAttributes() | clearUserAttributes() | - |
addUserAlias(key: String, value: String) | setUserAlias(key: String, value: String) | The name has been changed. |
removeUserAlias(String) | removeUserAlias(key: String) | The name has been changed. |
clearUserAlias() | clearUserAlias() | - |
- | clearUser() | New features have been added. |
addDeviceAlias(key: String, value: String) | setDeviceAlias(key: String, value: String) | The name has been changed. |
setDeviceAlias(key: String, value: String) | setDeviceAlias(key: String, value: String) | - |
removeDeviceAlias(key: String) | removeDeviceAlias(key: String) | - |
clearDeviceAlias() | clearDeviceAlias() | - |
registerPushToken(Data) | registerPushToken(Data) | - |
ABInAppEvent | Airbridge | Change |
---|---|---|
setCategory(String) | trackEvent(category: String, semanticAttributes: [String: Any], customAttributes: [String: Any]) | Please enter AirbridgeCategory or String in the category parameter. |
setAction(String) | trackEvent(category: String, semanticAttributes: [String: Any], customAttributes: [String: Any]) | Please enter into the semanticAttributes parameter using AirbridgeAttribute.ACTION as the key. |
setLabel(String) | trackEvent(category: String, semanticAttributes: [String: Any], customAttributes: [String: Any]) | Please enter into the semanticAttributes parameter using AirbridgeAttribute.LABEL as the key. |
setValue(NSNumber) | trackEvent(category: String, semanticAttributes: [String: Any], customAttributes: [String: Any]) | Please enter into the semanticAttributes parameter using AirbridgeAttribute.VALUE as the key. |
setSemantics([String: Any]) | trackEvent(category: String, semanticAttributes: [String: Any], customAttributes: [String: Any]) | Please use AirbridgeAttribute for keys using ABSemanticsKey, and input keys using String directly into the semanticAttributes parameter. And for the value of products, please use AirbridgeAttribute for keys using ABProductKey, and enter keys using string as they are. |
setCustoms([String: Any]) | trackEvent(category: String, semanticAttributes: [String: Any], customAttributes: [String: Any]) | Please enter the key and value directly into customAttributes. |
ABCategory | AirbridgeCategory | Change |
---|---|---|
signUp | SIGN_UP | The name has been changed. |
signIn | SIGN_IN | The name has been changed. |
signOut | SIGN_OUT | The name has been changed. |
viewHome | HOME_VIEWED | The name has been changed. |
viewProductList | PRODUCT_LIST_VIEWED | The name has been changed. |
viewSearchResult | SEARCH_RESULTS_VIEWED | The name has been changed. |
viewProductDetail | PRODUCT_VIEWED | The name has been changed. |
- | ADD_PAYMENT_INFO | New features have been added. |
- | ADD_TO_WISHLIST | New features have been added. |
addToCart | ADDED_TO_CART | The name has been changed. |
- | INITIATE_CHECKOUT | New features have been added. |
purchase | ORDER_COMPLETED | The name has been changed. |
- | ORDER_CANCELED | New features have been added. |
- | START_TRIAL | New features have been added. |
- | SUBSCRIBE | New features have been added. |
- | UNSUBSCRIBE | New features have been added. |
- | AD_IMPRESSION | New features have been added. |
- | AD_CLICK | New features have been added. |
- | COMPLETE_TUTORIAL | New features have been added. |
- | ACHIEVE_LEVEL | New features have been added. |
- | UNLOCK_ACHIEVEMENT | New features have been added. |
- | RATE | New features have been added. |
- | SHARE | New features have been added. |
- | SCHEDULE | New features have been added. |
- | SPEND_CREDITS | New features have been added. |
ABSemanticsKey | AirbridgeAttribute | Change |
---|---|---|
- | ACTION | New features have been added. |
- | LABEL | New features have been added. |
- | VALUE | New features have been added. |
totalValue | - | The feature has been removed. Please enter in VALUE. |
currency | CURRENCY | The name has been changed. |
- | ORIGINAL_CURRENCY | New features have been added. |
products | PRODUCTS | The name has been changed. |
- | PERIOD | New features have been added. |
- | IS_RENEWAL | New features have been added. |
- | RENEWAL_COUNT | New features have been added. |
productListID | PRODUCT_LIST_ID | The name has been changed. |
cartID | CART_ID | The name has been changed. |
transactionID | TRANSACTION_ID | The name has been changed. |
- | TRANSACTION_TYPE | New features have been added. |
- | TRANSACTION_PAIRED_EVENT_CATEGORY | New features have been added. |
- | TRANSACTION_PAIRED_EVENT_TIMESTAMP | New features have been added. |
totalQuantity | TOTAL_QUANTITY | The name has been changed. |
query | QUERY | The name has been changed. |
inAppPurchased | IN_APP_PURCHASED | The name has been changed. |
- | CONTRIBUTION_MARGIN | New features have been added. |
- | ORIGINAL_CONTRIBUTION_MARGIN | New features have been added. |
- | LIST_ID | New features have been added. |
- | RATE_ID | New features have been added. |
- | RATE | New features have been added. |
- | MAX_RATE | New features have been added. |
- | ACHIEVEMENT_ID | New features have been added. |
- | SHARED_CHANNEL | New features have been added. |
- | DATE_TIME | New features have been added. |
- | DESCRIPTION | New features have been added. |
- | IS_REVENUE | New features have been added. |
- | PLACE | New features have been added. |
- | SCHEDULE_ID | New features have been added. |
- | TYPE | New features have been added. |
- | LEVEL | New features have been added. |
- | SCORE | New features have been added. |
- | AD_PARTNERS | New features have been added. |
- | IS_FIRST_PER_USER | New features have been added. |
ABProductKey | AirbridgeAttribute | Change |
---|---|---|
productID | PRODUCT_ID | The name has been changed. |
name | PRODUCT_NAME | The name has been changed. |
price | PRODUCT_PRICE | The name has been changed. |
quantity | PRODUCT_QUANTITY | The name has been changed. |
currency | PRODUCT_CURRENCY | The name has been changed. |
position | PRODUCT_POSITION | The name has been changed. |
- | PRODUCT_CATEGORY_ID | New features have been added. |
- | PRODUCT_CATEGORY_NAME | New features have been added. |
- | PRODUCT_BRAND_ID | New features have been added. |
- | PRODUCT_BRAND_NAME | New features have been added. |
The CocoaPods package name, SwiftPackageManager Git address, and direct install download URL have changed. Please delete the existing iOS SDK and reinstall it by following the Airbridge guide.
The AirBridge.getInstance
function used to initialise the SDK has been changed to the Airbridge.initializeSDK
function. Also, the option setting functions have been changed to the AirbridgeOption and AirbridgeOptionBuilder classes.
SDK's options are no longer changed at runtime.Please refer to the mapping below to write your new SDK initialisation code.
import Airbridge
...
let option = AirbridgeOptionBuilder(name: "YOUR_APP_NAME", token: "YOUR_APP_SDK_TOKEN")
.setLogLevel(.warning)
.setSessionTimeout(second: 300)
.build()
Airbridge.initializeSDK(option: option)
#import <Airbridge/Airbridge.h>
...
AirbridgeOptionBuilder* optionBuilder = [[AirbridgeOptionBuilder alloc] initWithName:@"YOUR_APP_NAME"
token:@"YOUR_APP_SDK_TOKEN"];
[optionBuilder setLogLevel:AirbridgeLogLevelWarning];
[optionBuilder setSessionTimeoutWithSecond:300];
AirbridgeOption* option = [optionBuilder build];
[Airbridge initializeSDKWithOption:option];
AirBridge | Default | AirbridgeOptionBuilder | Default |
---|---|---|---|
setLogLevel(ABLogLevel) | LOG_WARNING | setLogLevel(AirbridgeLogLevel) | .warning |
setSDKEnabled(Bool) | true | setSDKEnabled(Bool) | true |
setIsFacebookDeferredAppLinkEnabled(Bool) | false | setTrackMetaDeferredAppLinkEnabled(Bool) | false |
setAutoStartTrackingEnabled(Bool) | true | setAutoStartTrackingEnabled(Bool) | true |
setting().trackingAuthorizeTimeout // UInt | 30000 (millisecond) | setAutoDetermineTrackingAuthorizationTimeout(second: Double) | 300.0 (second) (0 ~ 1 hour) |
setting().isRestartTrackingAuthorizeTimeout // Bool | true | The feature has been removed. | - |
deeplink().setDeeplinkCallback((String) -> Void) | - | It has been replaced with another feature. Please refer to the deep link item. | - |
deeplink().setDeferredDeeplinkCallback((String) -> Void) | - | It has been replaced with another feature. Please refer to the deep link item. | - |
deeplink().setHandleTrackingLinkTimeout(UInt) | 3000 (millisecond) | The feature has been removed. (Fixed at 3 seconds) | - |
setIsUserInfoHashed(Bool) | true | setHashUserInformationEnabled(Bool) | true |
setSessionTimeout(Int) | 300000 (millisecond) | setSessionTimeout(second: Double) | 300.0 (second) (0 ~ 7 day) |
setting().setTrackInSessionLifeCycleEventEnabled(Bool) | false | setTrackInSessionLifecycleEventEnabled(Bool) | false |
setIsTrackAirbridgeDeeplinkOnly(Bool) | false | setTrackAirbridgeDeeplinkOnlyEnabled(Bool) | false |
setSDKSignatureSecret(id: String, secret: String) | - | setSDKSignature(id: String, secret: String) | - |
setResetEventBufferEnabled(Bool) | false | setClearEventBufferOnInitializeEnabled(Bool) | false |
setting().isResetEventBufferEnabled // Bool | false | setClearEventBufferOnInitializeEnabled(Bool) | false |
setting().setEventMaximumBufferCount(UInt) | INT_MAX | setEventBufferCountLimit(Int) | INT_MAX |
setting().setEventMaximumBufferCount(UInt) | INT_MAX (byte) | setEventBufferSizeLimit(gibibyte: Double) | 1024 (gibibyte) (0 ~ 1 tebibyte) |
setting().setEventTransmitInterval(UInt) | 0 (millisecond) | setEventTransmitInterval(second: Double) | 0 (second) (0 ~ 1 day) |
setting().attributionCallback(([String: String]) -> Void) | - | setOnAttributionReceived(([String: String]) -> Void) | - |
import Airbridge
...
let option = AirbridgeOptionBuilder(name: "YOUR_APP_NAME", token: "YOUR_APP_SDK_TOKEN")
.setLogLevel(.warning)
.setSessionTimeout(second: 300)
.build()
Airbridge.initializeSDK(option: option)
#import <Airbridge/Airbridge.h>
...
AirbridgeOptionBuilder* optionBuilder = [[AirbridgeOptionBuilder alloc] initWithName:@"YOUR_APP_NAME"
token:@"YOUR_APP_SDK_TOKEN"];
[optionBuilder setLogLevel:AirbridgeLogLevelWarning];
[optionBuilder setSessionTimeoutWithSecond:300];
AirbridgeOption* option = [optionBuilder build];
[Airbridge initializeSDKWithOption:option];
The AirBridge.setDeeplinkCallback
function has been replaced by the Airbridge.handleDeeplink
function and handleDeferredDeeplink
function.
You need to implement the existing AirBridge.setDeeplinkCallback
function by separating it into a function that handles scheme deep links registered in the Airbridge dashboard and another function that handles other deep links. Please refer to the following DeeplinkHandler class.
import Foundation
final class DeeplinkHandler {
private init() {}
static func handleSchemeDeeplink(url: URL) -> Bool {
if url.scheme != "YOUR_SCHEME" {
return false
}
// REQUIRE: show content
return true
}
static func handleOtherDeeplink(url: URL) -> Bool {
// OPTION: show content
return true
}
}
#import <Foundation/Foundation.h>
@implementation ABDeeplinkHandler
- (instancetype) init __unavailable;
+ (BOOL)handleSchemeDeeplink:(NSURL *)url;
+ (BOOL)handleOtherDeeplink:(NSURL *)url;
@end
...
#import "ABDeeplinkHandler.h"
@interface ABDeeplinkHandler : NSObject
+ (BOOL)handleSchemeDeeplink:(NSURL *)url {
if (![url.scheme isEqualToString:@"YOUR_SCHEME"]) {
return NO;
}
// REQUIRE: show content
return YES;
}
+ (BOOL)handleOtherDeeplink:(NSURL *)url {
// OPTION: show content
return YES;
}
@end
AirBridge.deeplink().handle
(or handleUniversalLink
) and AirBridge.deeplink().handleURLSchemeDeeplink
have been replaced by Airbridge.trackDeeplink
.
1. Remove the part that calls the AirBridge.deeplink().handle
(or handleUniversalLink
) and AirBridge.deeplink().handleURLSchemeDeeplink
functions depending on the system method.
2. You call the Airbridge.trackDeeplink
function and the Airbridge.handleDeeplink
function.
The Airbridge.handleDeeplink
function provides a scheme deep link with true when an Airbridge deeplink is entered. If it is not an Airbridge deeplink, it does not provide a callback with false.
3. Call a function that processes the scheme deeplink executed to Airbridge in the onSuccess
callback.
import UIKit
import Airbridge
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
// when terminated app is opened with scheme deeplink or universal links
func scene(
_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions
) {
// when app is opened with scheme deeplink
if let url = connectionOptions.urlContexts.first?.url {
// track deeplink
Airbridge.trackDeeplink(url: url)
// handle airbridge deeplink
var isHandled = Airbridge.handleDeeplink(url: url) { url in
DeeplinkHandler.handleSchemeDeeplink(url: url)
}
if isHandled { return }
// handle scheme deeplink
isHandled = DeeplinkHandler.handleSchemeDeeplink(url: url)
if isHandled { return }
// handle other deeplink
isHandled = DeeplinkHandler.handleOtherDeeplink(url: url)
}
// when app is opened with universal links
else if let userActivity = connectionOptions.userActivities.first {
// track deeplink
Airbridge.trackDeeplink(userActivity: userActivity)
// handle airbridge deeplink
var isHandled = Airbridge.handleDeeplink(userActivity: userActivity) { url in
DeeplinkHandler.handleSchemeDeeplink(url: url)
}
if isHandled { return }
// handle other deeplink
if let url = userActivity.webpageURL {
isHandled = DeeplinkHandler.handleOtherDeeplink(url: url)
}
}
}
// when backgrounded app is opened with scheme deeplink
func scene(
_ scene: UIScene,
openURLContexts URLContexts: Set<UIOpenURLContext>
) {
guard let url = URLContexts.first?.url else { return }
// track deeplink
Airbridge.trackDeeplink(url: url)
// handle airbridge deeplink
var isHandled = Airbridge.handleDeeplink(url: url) { url in
DeeplinkHandler.handleSchemeDeeplink(url: url)
}
if isHandled { return }
// handle scheme deeplink
isHandled = DeeplinkHandler.handleSchemeDeeplink(url: url)
if isHandled { return }
// handle other deeplink
isHandled = DeeplinkHandler.handleOtherDeeplink(url: url)
}
// when backgrounded app is opened with universal links
func scene(
_ scene: UIScene,
continue userActivity: NSUserActivity
) {
// track deeplink
Airbridge.trackDeeplink(userActivity: userActivity)
// handle airbridge deeplink
var isHandled = Airbridge.handleDeeplink(userActivity: userActivity) { url in
DeeplinkHandler.handleSchemeDeeplink(url: url)
}
if isHandled { return }
// handle other deeplink
if let url = userActivity.webpageURL {
isHandled = DeeplinkHandler.handleOtherDeeplink(url: url)
}
}
}
#import "SceneDelegate.h"
#import "ABDeeplinkHandler.h"
#import <Airbridge/Airbridge.h>
@interface SceneDelegate ()
@end
@implementation SceneDelegate
// when terminated app is opened with scheme deeplink or universal links
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
// when app is opened with scheme deeplink
NSURL* url = connectionOptions.URLContexts.allObjects.firstObject.URL;
NSUserActivity* userActivity = connectionOptions.userActivities.allObjects.firstObject;
if (url != nil) {
// track deeplink
[Airbridge trackDeeplinkWithUrl:url];
// handle airbridge deeplink
BOOL isHandled = [Airbridge handleDeeplinkWithUrl:url onSuccess:^(NSURL* url) {
[ABDeeplinkHandler handleSchemeDeeplink:url];
}];
if (isHandled) { return; }
// handle scheme deeplink
isHandled = [ABDeeplinkHandler handleSchemeDeeplink:url];
if (isHandled) { return; }
// handle other deeplink
isHandled = [ABDeeplinkHandler handleSchemeDeeplink:url];
}
else if (userActivity != nil) {
// track deeplink
[Airbridge trackDeeplinkWithUserActivity:userActivity];
// handle airbridge deeplink
BOOL isHandled = [Airbridge handleDeeplinkWithUserActivity:userActivity onSuccess:^(NSURL* url) {
[ABDeeplinkHandler handleSchemeDeeplink:url];
}];
if (isHandled) { return; }
// handle other deeplink
NSURL* url = userActivity.webpageURL;
if (url != nil) {
isHandled = [ABDeeplinkHandler handleOtherDeeplink:url];
}
}
}
// when backgrounded app is opened with scheme deeplink
- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
NSURL* url = URLContexts.allObjects.firstObject.URL;
if (url == nil) { return; }
// track deeplink
[Airbridge trackDeeplinkWithUrl:url];
// handle airbridge deeplink
BOOL isHandled = [Airbridge handleDeeplinkWithUrl:url onSuccess:^(NSURL* url) {
[ABDeeplinkHandler handleSchemeDeeplink:url];
}];
if (isHandled) { return; }
// handle scheme deeplink
isHandled = [ABDeeplinkHandler handleSchemeDeeplink:url];
if (isHandled) { return; }
// handle other deeplink
isHandled = [ABDeeplinkHandler handleSchemeDeeplink:url];
}
// when backgrounded app is opened with universal links
- (void)scene:(UIScene *)scene continueUserActivity:(NSUserActivity *)userActivity {
// track deeplink
[Airbridge trackDeeplinkWithUserActivity:userActivity];
// handle airbridge deeplink
BOOL isHandled = [Airbridge handleDeeplinkWithUserActivity:userActivity onSuccess:^(NSURL* url) {
[ABDeeplinkHandler handleSchemeDeeplink:url];
}];
if (isHandled) { return; }
// handle other deeplink
NSURL* url = userActivity.webpageURL;
if (url != nil) {
isHandled = [ABDeeplinkHandler handleOtherDeeplink:url];
}
}
@end
import SwiftUI
import Airbridge
@main
struct ActualApp: App {
var body: some Scene {
WindowGroup {
ContentView()
// when app is opened with scheme deeplink or universal links
.onOpenURL { url in
// track deeplink
Airbridge.trackDeeplink(url: url)
// handle airbridge deeplink
var isHandled = Airbridge.handleDeeplink(url: url) { url in
DeeplinkHandler.handleSchemeDeeplink(url: url)
}
if isHandled { return }
// handle scheme deeplink
isHandled = DeeplinkHandler.handleSchemeDeeplink(url: url)
if isHandled { return }
// handle other deeplink
isHandled = DeeplinkHandler.handleOtherDeeplink(url: url)
}
}
}
}
import UIKit
import Airbridge
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
// when app is opened with scheme deeplink
func application(
_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey : Any] = [:]
) -> Bool {
// track deeplink
Airbridge.trackDeeplink(url: url)
// handle airbridge deeplink
var isHandled = Airbridge.handleDeeplink(url: url) { url in
DeeplinkHandler.handleSchemeDeeplink(url: url)
}
if isHandled { return isHandled }
// handle scheme deeplink
isHandled = DeeplinkHandler.handleSchemeDeeplink(url: url)
if isHandled { return isHandled }
// handle other deeplink
isHandled = DeeplinkHandler.handleOtherDeeplink(url: url)
return isHandled
}
// when app is opened with universal links
func application(
_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void
) -> Bool {
// track deeplink
Airbridge.trackDeeplink(userActivity: userActivity)
// handle airbridge deeplink
var isHandled = Airbridge.handleDeeplink(userActivity: userActivity) { url in
DeeplinkHandler.handleSchemeDeeplink(url: url)
}
if isHandled { return isHandled }
// handle other deeplink
if let url = userActivity.webpageURL {
isHandled = DeeplinkHandler.handleOtherDeeplink(url: url)
}
return isHandled
}
}
#import "AppDelegate.h"
#import "ABDeeplinkHandler.h"
#import <Airbridge/Airbridge.h>
@interface AppDelegate ()
@end
@implementation AppDelegate
// when app is opened with scheme deeplink
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
// track deeplink
[Airbridge trackDeeplinkWithUrl:url];
// handle airbridge deeplink
BOOL isHandled = [Airbridge handleDeeplinkWithUrl:url onSuccess:^(NSURL* url) {
[ABDeeplinkHandler handleSchemeDeeplink:url];
}];
if (isHandled) { return isHandled; }
// handle scheme deeplink
isHandled = [ABDeeplinkHandler handleSchemeDeeplink:url];
if (isHandled) { return isHandled; }
// handle other deeplink
isHandled = [ABDeeplinkHandler handleOtherDeeplink:url];
return isHandled;
}
// when app is opened with universal links
- (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray<id<UIUserActivityRestoring>> * _Nullable))restorationHandler {
// track deeplink
[Airbridge trackDeeplinkWithUserActivity:userActivity];
// handle airbridge deeplink
BOOL isHandled = [Airbridge handleDeeplinkWithUserActivity:userActivity onSuccess:^(NSURL* url) {
[ABDeeplinkHandler handleSchemeDeeplink:url];
}];
if (isHandled) { return isHandled; }
// handle other deeplink
NSURL* url = userActivity.webpageURL;
if (url != nil) {
isHandled = [ABDeeplinkHandler handleOtherDeeplink:url];
}
return isHandled;
}
@end
Airbridge.handleDeeplink
function returns true when an Airbridge deeplink is inputted, and converts it to a Scheme deeplink and passes it on toonSuccess
. And if a URL that is not an Airbridge deeplink is inputted or SDK is not initialized, it simply returns false.
In the part where SDK is initialized, it calls the Airbridge.handleDeferredDeeplink
function. It calls a function that processes scheme deep links run by Airbridge in the onSuccess
callback.
import Airbridge
...
let option = AirbridgeOptionBuilder(name: "YOUR_APP_NAME", token: "YOUR_APP_SDK_TOKEN")
.build()
Airbridge.initializeSDK(option: option)
...
let isHandled = Airbridge.handleDeferredDeeplink() { url in
if let url {
DeeplinkHandler.handleSchemeDeeplink(url)
}
}
#import <Airbridge/Airbridge.h>
...
AirbridgeOptionBuilder* optionBuilder = [[AirbridgeOptionBuilder alloc] initWithName:@"YOUR_APP_NAME"
token:@"YOUR_APP_SDK_TOKEN"];
AirbridgeOption* option = [optionBuilder build];
[Airbridge initializeSDKWithOption:option];
...
[Airbridge handleDeferredDeeplinkOnSuccess:^(NSURL* url) {
if (url != nil) {
[ABDeeplinkHandler handleSchemeDeeplink:url];
}
}];
The Airbridge.handleDeferredDeeplink
function waits for the acquisition of Airbridge deeplinks with true if Airbridge deeplinks are entered, or converts them into scheme deeplinks and passes them to onSuccess
. You can use the corresponding scheme deeplink to send users to the set destination.
If there is no stored Airbridge deeplink, it delivers nil. If the SDK has not been initialized or if you did not call the Airbridge.handleDeferredDeeplink
function for the first time, it delivers false.
The method for registering custom domains has changed. Previously, custom domains were added as values to the co.ab180.airbridge.trackingLink.customDomains
key in Info.plist.
The changed method is to add them by calling the setTrackingLinkCustomDomains
function during the SDK initialization phase.
Please call the setTrackingLinkCustomDomains function in the SDK initialization code.
import Airbridge
...
let option = AirbridgeOptionBuilder(name: "YOUR_APP_NAME", token: "YOUR_APP_TOKEN")
.setTrackingLinkCustomDomains(["YOUR_CUSTOM_DOMAIN"])
.build()
Airbridge.initializeSDK(option: option)
#import <Airbridge/Airbridge.h>
...
AirbridgeOptionBuilder* optionBuilder = [[AirbridgeOptionBuilder alloc] initWithName:@"YOUR_APP_NAME"
token:@"YOUR_APP_TOKEN"];
[optionBuilder setTrackingLinkCustomDomains:@[@"YOUR_CUSTOM_DOMAIN"]];
AirbridgeOption* option = [optionBuilder build];
[Airbridge initializeSDKWithOption:option];
Attention
Please enter the value in AirbridgeAttribute.VALUE instead of the existing totalValue.
The logic where totalValue overwrites the value when using setSemantics' totalValue and defining the value with setValue has been removed from SDK v4.
The ABInAppEvent class has been replaced by the Airbridge.trackEvent
function.
Please follow the guide below to change the ABInAppEvent class and setAction, setLabel, setValue, setSemantics, and setCustoms to the Airbridge.trackEvent
function.
setCategory: If you are using ABCategory, you should use AirbridgeCategory. If you are using a String, enter it in the category parameter as is.
setAction: Enter the AirbridgeAttribute.ACTION key in the semanticAttributes parameter.
setLabel: Enter in the AirbridgeAttribute.LABEL key of the semanticAttributes parameter.
setValue: Enter in the AirbridgeAttribute.VALUE key of the semanticAttributes parameter.
setSemantics: If you are using ABSemanticsKey as the key in the semanticAttributes parameter, useAirbridgeAttribute. If you are using String, enter it as is. The value is entered regardless of the key.
setCustoms: In the customAttributes parameter, enter the key and value as they are.
See AirbridgeCategory, AirbridgeAttribute mapping, and the Airbridge.trackEvent function below.
ABCategory | AirbridgeCategory |
---|---|
signIn | SIGN_IN |
signUp | SIGN_UP |
signOut | SIGN_OUT |
viewHome | HOME_VIEWED |
viewProductList | PRODUCT_LIST_VIEWED |
viewSearchResult | SEARCH_RESULTS_VIEWED |
viewProductDetail | PRODUCT_VIEWED |
addToCart | ADDED_TO_CART |
purchase | ORDER_COMPLETED |
ABSemanticsKey | AirbridgeAttribute |
---|---|
products | PRODUCTS |
transactionID | TRANSACTION_ID |
inAppPurchased | IN_APP_PURCHASED |
cartID | CART_ID |
query | QUERY |
productListID | PRODUCT_LIST_ID |
currency | CURRENCY |
totalValue | Removed. Use VALUE instead. |
totalQuantity | TOTAL_QUANTITY |
ABProductKey | AirbridgeAttribute |
---|---|
productID | PRODUCT_ID |
name | PRODUCT_NAME |
price | PRODUCT_PRICE |
currency | PRODUCT_CURRENCY |
position | PRODUCT_POSITION |
quantity | PRODUCT_QUANTITY |
import Airbridge
...
// setCategory
Airbridge.trackEvent(
category: AirbridgeCategory.ORDER_COMPLETED,
semanticAttributes: [
// setAction
AirbridgeAttribute.ACTION: "Tool",
// setLabel
AirbridgeAttribute.LABEL: "Hammer",
// setValue
AirbridgeAttribute.VALUE: 10,
// setSemantics (using ABSemanticsKey)
AirbridgeAttribute.CURRENCY: "USD",
AirbridgeAttribute.PRODUCTS: [
[
// setSemantics value (using ABProductKey)
AirbridgeAttribute.PRODUCT_ID: "12345",
// setSemantics value (using String)
"name": "PlasticHammer",
],
],
// setSemantics (using String)
"totalQuantity": 1,
],
customAttributes: [
// setCustoms
"promotion": "FirstPurchasePromotion",
]
)
#import <Airbridge/Airbridge.h>
...
[Airbridge trackEventWithCategory:@"event" semanticAttributes:@{
// action
AirbridgeAttribute.ACTION: @"Tool",
// label
AirbridgeAttribute.LABEL: @"Hammer",
// value
AirbridgeAttribute.VALUE: @(10),
// semantic attribute (provided by sdk)
AirbridgeAttribute.CURRENCY: @"USD",
AirbridgeAttribute.PRODUCTS: @[
@{
// semantic attribute value (provided by sdk)
AirbridgeAttribute.PRODUCT_ID: @"12345",
// semantic attribute value (not provided by sdk)
@"name": @"PlasticHammer",
},
],
// semantic attribute (not provided by sdk)
@"totalQuantity": @(1),
}, customAttributes:@{
// custom attribute
@"promotion": @"FirstPurchasePromotion",
}];
AirBridge.setDeviceAlias
related functions replaced with AirBridge.setDeviceAlias related functions.
import Airbridge
...
Airbridge.setDeviceAlias(key: "string", value: "string")
Airbridge.removeDeviceAlias(key: "string")
Airbridge.clearDeviceAlias()
#import <Airbridge/Airbridge.h>
...
BOOL isHandled = [Airbridge impressionWithTrackingLink:url onSuccess:^{
// when url is tracking link and succeed
} onFailure:^(NSError * _Nonnull) {
// when url is tracking link and failed
}];
if (!isHandled) {
// when url is not tracking link
}
AirBridge.state().setUser
related functions have been replaced with Airbridge.setUser related functions. The setuser function that sets user information at once is not supported.
import Airbridge
...
// identifier
Airbridge.setUserID("string")
Airbridge.clearUserID()
// addtional identifier
Airbridge.setUserAlias(key: "string", value: "string")
Airbridge.removeUserAlias(key: "string")
Airbridge.clearUserAlias()
...
// email, phone
Airbridge.setUserEmail("string")
Airbridge.clearUserEmail()
Airbridge.setUserPhone("string")
Airbridge.clearUserPhone()
// addtional attribute
Airbridge.setUserAttribute(key: "string", value: "string")
Airbridge.setUserAttribute(key: "number", value: 1000)
Airbridge.removeUserAttribute(key: "string")
Airbridge.clearUserAttributes()
#import <Airbridge/Airbridge.h>
...
// identifier
[Airbridge setUserID:@"string"];
[Airbridge clearUserID];
// additional identifier
[Airbridge setUserAliasWithKey:@"string" value:@"string"];
[Airbridge removeUserAliasWithKey:@"string"];
[Airbridge clearUserAlias];
...
// email, phone
[Airbridge setUserEmail:@"string"];
[Airbridge clearUserEmail];
[Airbridge setUserPhone:@"string"];
[Airbridge clearUserPhone];
// addtional attribute
[Airbridge setUserAttributeWithKey:@"string" value:@"string"];
[Airbridge setUserAttributeWithKey:@"number" value:@(1000)];
[Airbridge removeUserAttributeWithKey:@"string"];
[Airbridge clearUserAttributes];
The AirBridge.placement().click
function and the AirBridge.placement().impression
function have been replaced with the Airbridge.click
function and the Airbridge.impression
function.
import Airbridge
...
let isHandled = Airbridge.click(trackingLink: url) {
// when url is tracking link and succeed
} onFailure: { error in
// when url is tracking link and failed
// example: url is another app's tracking link, internet is not connected
}
if !isHandled {
// when url is not tracking link
}
...
let isHandled = Airbridge.impression(trackingLink: url) {
// when url is tracking link and succeed
} onFailure: { error in
// when url is tracking link and failed
}
if !isHandled {
// when url is not tracking link
}
#import <Airbridge/Airbridge.h>
...
BOOL isHandled = [Airbridge clickWithTrackingLink:url onSuccess:^{
// when url is tracking link and succeed
} onFailure:^(NSError * _Nonnull) {
// when url is tracking link and failed
// example: url is another app's tracking link, internet is not connected
}];
if (!isHandled) {
// when url is not tracking link
}
...
BOOL isHandled = [Airbridge impressionWithTrackingLink:url onSuccess:^{
// when url is tracking link and succeed
} onFailure:^(NSError * _Nonnull) {
// when url is tracking link and failed
}];
if (!isHandled) {
// when url is not tracking link
}
AirBridge.webInterface().inject
function has been replaced by Airbridge.setWebInterface
function.
import Airbridge
...
Airbridge.setWebInterface(
controller: controller,
webToken: "YOUR_WEB_TOKEN"
)
#import <Airbridge/Airbridge.h>
...
[Airbridge setWebInterfaceWithController:controller webToken:@"YOUR_WEB_TOKEN"];
See the major changes in each version of the iOS SDK.
Airbridge apps created on or after 4 September 2023 resolved an issue where the deeplink URL provided in the deeplink callback would be decoded twice to provide what was entered in the Airbridge Dashboard.This issue occurred in iOS SDK 1.34.0 to 1.35.1.
Airbridge apps created on or after 4 September 2023 will not append airbridge_referrer to the deep link URL provided in the deeplink callback and will instead pass it to the information entered in the Airbridge Dashboard.
Clients using Airbridge apps created before 4 September 2023 who require this feature should contact their Airbridge CSM.
support for SKAdNetwork 4.0, we changed the way conversion values are calculated. When a user updates from an app with iOS SDK 1.33.0 or lower to an app with version 1.33.0 or higher, the last calculated conversion value will be finalized.
The default setting for trackingAuthorizeTimeout was changed from 0 seconds to 30 seconds.
Was this page helpful?