您可以查看更新 Airbridge iOS SDK 过程中需要注意的内容。建议查看当前版本至目标更新版本之间的所有更新详情。
如果您将 Airbridge iOS SDK 更新至 v4.0,请查看以下内容。
iOS SDK 的名称已从 AirBridge 更改为 Airbridge,AirBridge 类已更名为 Airbridge。部分函数和选项名称已更改。
AirBridge | AirbridgeOptionBuilder | What's Changed |
---|---|---|
- | AirbridgeOptionBuilder(name: String, token: String) | The option has been changed to be set through the Builder. |
- | build() | The option has been changed to be non-modifiable after the 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 available 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 is fixed to the default value 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 | What's Changed |
---|---|---|
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 | What's Changed |
---|---|---|
setCategory(String) | trackEvent(category: String, semanticAttributes: [String: Any], customAttributes: [String: Any]) | Enter AirbridgeCategory or String in the category parameter. |
setAction(String) | trackEvent(category: String, semanticAttributes: [String: Any], customAttributes: [String: Any]) | Enter into the semanticAttributes parameter using AirbridgeAttribute.ACTION as the key. |
setLabel(String) | trackEvent(category: String, semanticAttributes: [String: Any], customAttributes: [String: Any]) | Enter into the semanticAttributes parameter using AirbridgeAttribute.LABEL as the key. |
setValue(NSNumber) | trackEvent(category: String, semanticAttributes: [String: Any], customAttributes: [String: Any]) | Enter into the semanticAttributes parameter using AirbridgeAttribute.VALUE as the key. |
setSemantics([String: Any]) | trackEvent(category: String, semanticAttributes: [String: Any], customAttributes: [String: Any]) | Use AirbridgeAttribute for keys using ABSemanticsKey, and input keys using String directly into the semanticAttributes parameter. For the value of products, 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]) | Enter the key and value directly into customAttributes. |
ABCategory | AirbridgeCategory | What's Changed |
---|---|---|
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 | What's Changed |
---|---|---|
- | ACTION | New features have been added. |
- | LABEL | New features have been added. |
- | VALUE | New features have been added. |
totalValue | - | The feature has been removed. 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 | What's Changed |
---|---|---|
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. |
CocoaPods 包名、SwiftPackageManager Git 地址及直接安装的下载 URL 均已更改。请先删除现有的 iOS SDK,然后按照 本指南 重新安装。
用于 SDK 初始化的 AirBridge.getInstance
函数已更改为 Airbridge.initializeSDK
函数。此外,选项设置函数已更改为 AirbridgeOption
、AirbridgeOptionBuilder
类。SDK 选项不再支持运行时更改。
请参考下方映射,更新 SDK 初始化代码。
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];
AirBridge.setDeeplinkCallback
函数已被 Airbridge.handleDeeplink
和 handleDeferredDeeplink
函数替代。
需将原 AirBridge.setDeeplinkCallback
函数拆分为处理 Airbridge 面板中注册的 URI Scheme 深度链接的函数和处理其他深度链接的函数。请参考下方 DeeplinkHandler 类:
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
(或 handleUniversalLink
)和 AirBridge.deeplink().handleURLSchemeDeeplink
函数已被 Airbridge.trackDeeplink
函数替代。
1. 根据系统方式,请删除调用 AirBridge.deeplink().handle
(或 handleUniversalLink
)以及 AirBridge.deeplink().handleURLSchemeDeeplink
函数的代码。
2. 请调用 Airbridge.trackDeeplink
和 Airbridge.handleDeeplink
函数。
Airbridge.handleDeeplink
函数在输入 Airbridge 深度链接时,会返回 true 并通过回调提供 URI Scheme 深度链接。如果不是 Airbridge 深度链接,则返回 false,且不提供回调。
3. 请在 onSuccess
回调中,调用处理由 Airbridge 触发的 URI Scheme 深度链接的函数。
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
函数在输入 Airbridge 深度链接时返回 true,并将其转换为 URI Scheme 深度链接传递至onSuccess
。如果输入的 URL 不是 Airbridge 深度链接,或 SDK 尚未初始化,则返回 false,且不提供回调。
请在 SDK 初始化部分调用 Airbridge.handleDeferredDeeplink
函数,并在 onSuccess
回调中调用处理由 Airbridge 触发的 URI Scheme 深度链接的函数。
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];
}
}];
Airbridge.handleDeferredDeeplink
函数在输入 Airbridge 深度链接时,会返回 true,并等待获取 Airbridge 深度链接,将其转换为 URI Scheme 深度链接后传递给 onSuccess
。您可以使用该 URI Scheme 深度链接将用户发送至预设目标页面。
如果没有保存的 Airbridge 深度链接,则会传递 nil。如果 SDK 尚未初始化,或 Airbridge.handleDeferredDeeplink
函数并非首次调用,则会返回 false。
品牌域名的注册方式已更改。
此前,需在 Info.plist 的 co.ab180.airbridge.trackingLink.customDomains
键中添加品牌域名为值。
现更改为在 SDK 初始化阶段调用 setTrackingLinkCustomDomains
函数进行添加。
请在 SDK 初始化代码调用 setTrackingLinkCustomDomains
函数。
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];
注意
请使用
AirbridgeAttribute.VALUE
代替原totalValue
进行赋值。从 iOS SDK v4 起,setSemantics 的
totalValue
覆盖setValue
赋值的逻辑已被删除。
ABInAppEvent 类已被 Airbridge.trackEvent
函数替代。
请按照以下指南,将 ABInAppEvent 类及 setAction、setLabel、setValue、setSemantics、setCustoms 更改为 Airbridge.trackEvent
函数。
setCategory:如果使用 ABCategory,请改用 AirbridgeCategory。如果使用 String,可直接输入至 category 参数。
setAction:请输入至 semanticAttributes 参数的 AirbridgeAttribute.ACTION 键中。
setLabel:请输入至 semanticAttributes 参数的 AirbridgeAttribute.LABEL 键中。
setValue:请输入至 semanticAttributes 参数的 AirbridgeAttribute.VALUE 键中。
setSemantics:如果 semanticAttributes 参数的键使用 ABSemanticsKey,请改用 AirbridgeAttribute。如果使用 String,可直接输入。值可直接输入,与键无关。
setCustoms:请将键和值直接输入至 customAttributes 参数。
请参考下方的 AirbridgeCategory、AirbridgeAttribute 映射以及 Airbridge.trackEvent 函数。
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
相关函数已被 Airbridge.setDeviceAlias 相关函数替代。
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
相关函数已被 Airbridge.setUser 相关函数替代。不再支持一次性设置用户信息的 setUser
函数。
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];
AirBridge.placement().click
和 AirBridge.placement().impression
函数已被 Airbridge.click
和 Airbridge.impression
函数替代。
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
函数已被 Airbridge.setWebInterface
函数替代。
import Airbridge
...
Airbridge.setWebInterface(
controller: controller,
webToken: "YOUR_WEB_TOKEN"
)
#import <Airbridge/Airbridge.h>
...
[Airbridge setWebInterfaceWithController:controller webToken:@"YOUR_WEB_TOKEN"];
请参考各 iOS SDK 版本的主要变更内容。
修复了 iOS SDK v.1.34.0~v.1.35.1 中出现的,2023-09-04 或以后创建的 Airbridge App 在深度链接回调中提供的深度链接 URL 被解码两次的问题。
对于 2023-09-04 或以后创建的 Airbridge App,在深度链接回调中提供的深度链接 URL 将不再附加 airbridge_referrer
,而是直接按照 Airbridge 面板中输入的信息传递。
仍在使用 2023-09-04 以前创建的 Airbridge App 并需要该功能的客户,请联系您的 CSM。如果没有指定的 CSM,请通过 [帮助] 提交请求。
随着 SKAN(SKAdNetwork)4.0 支持,转化值计算方式已更改。当用户从安装了 iOS SDK v1.33.0 以下版本的 App 更新至 v1.33.0 或以上版本时,最后计算的转化值将确认为最终值。
trackingAuthorizeTimeout
的默认值已从 0 秒更改为 30 秒。
Was this page helpful?
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
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 "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
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];
}
}];
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];
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.setDeviceAlias(key: "string", value: "string")
Airbridge.removeDeviceAlias(key: "string")
Airbridge.clearDeviceAlias()
#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",
}];
#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
}
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];
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
}
import Airbridge
...
Airbridge.setWebInterface(
controller: controller,
webToken: "YOUR_WEB_TOKEN"
)
#import <Airbridge/Airbridge.h>
...
[Airbridge setWebInterfaceWithController:controller webToken:@"YOUR_WEB_TOKEN"];
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 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
}
}