SDK 설치


iOS SDKiOS SDK

패키지 설치

Cocoapods

  1. 아래와 같은 명령어로 Podfile 파일을 생성해주세요.
cd path/to/project
touch Podfile
  1. Podfile 파일 내용을 아래와 같이 채워주세요.
target '[프로젝트 이름]' do
    pod 'AirBridge', '1.15.2'
end
  1. 터미널을 여시고 아래와 같은 명령어를 입력해주세요.
cd path/to/project
pod install --repo-update

pod 명령어가 없을 경우, cocoapods 를 설치해주세요.
sudo gem install cocoapods

직접 설치

AirBridge.framework : 다운로드

  1. 위 파일을 다운받아 AirBridge.framework 파일을 Xcode > Project 파일 > General > Frameworks, Libraries, and Embedded Content 에 추가 해주세요.
  2. 아래와 같이 5개의 framework 들을 프로젝트에 추가해주세요.
1. Xcode > Project 파일 > General > Frameworks, Libraries, and Embedded Content.
2. `+` 버튼을 누르고 `[Framework 이름].framework` 를 눌러주세요.
3. `Add` 버튼을 눌러주세요.

Framework

설명

AdSupport.framework

IDFA 를 수집하는데 사용합니다.

iAd.framework

Apple Search Ads Attribution 정보를 수집하는데 사용합니다.

CoreTelephony.framework

통신사 정보를 수집하는데 사용합니다.

StoreKit.framework

SKAdNetwork 정보를 수집하는데 사용합니다.

AppTrackingTransparency.framework

Tracking 허용 상태정보를 수집하는데 사용합니다.

프로젝트 설정

초기화

AppDelegate 파일 application:didFinishLaunchingWithOptions: 메소드의 최상단에 다음 코드를 추가해 SDK 를 초기화 해주세요.

#import <AirBridge/AirBridge.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
    [AirBridge getInstance:@"YOUR_APP_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
    ...
}
import AirBridge

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    AirBridge.getInstance("YOUR_APP_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)
    ...
}

YOUR_APP_NAME 은 대시보드의 Settings > Tokens > 앱 이름 에서 확인할 수 있습니다.
YOUR_APP_TOKEN 은 대시보드의 Settings > Tokens > 앱 SDK 토큰 에서 확인할 수 있습니다.

IDFA 이용약관 동의

SDK 를 사용하기 위해서는 앱스토어에 앱을 게시할 때 IDFA 이용약관 동의가 필요합니다.

  1. 'Yes' 항목에 체크해 주세요.
  2. 아래 사진과 같은 화면이 나옵니다.
  3. 'Attribute this app installation to a previously served advertisement.' 항목을 체크해 주세요.
  4. 'Attribute an action taken within this app to a previously served advertisement' 항목을 체크해 주세요.
  5. 'Limit Ad Tracking Setting in iOS' 항목을 체크해 주세요.

SDK 설치 확인

앱을 설치하고 실행 했을때 Install 이벤트가 전송되는지 확인해주세요.

대시보드로 확인

SDK 에서 발생한 Event 들은 에어브릿지 대시보드 > Raw Data > App Real-time Logs 에 출력됩니다.

  1. 에어브릿지 대시보드 > Raw Data > App Real-time Logs 항목을 클릭해 주세요.
  2. 검색어 입력iOS IDFA 를 입력해 주세요.
  • 로그 노출은 최대 5분 가량 지연될 수 있습니다.

로그로 확인

SDK 를 초기화하는 코드 상단에 다음 코드를 입력하면 SDK 로그가 출력됩니다.

[AirBridge setLogLevel:AB_LOG_ALL];
[AirBridge getInstance:@"YOUR_APP_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
AirBridge.setLogLevel(.LOG_ALL)
AirBridge.getInstance("YOUR_APP_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)

딥링크 설정


대시보드 설정

에어브릿지 대시보드 > Tracking Link > Deep Link 에 아래 2가지 정보가 필요합니다.

  • iOS URI Scheme
  • iOS App ID

iOS URI Scheme

사용하기 원하는 scheme 을 에어브릿지 대시보드의 iOS URI Scheme 영역에 :// 을 붙여 입력해주세요.

예) example://

iOS App ID

  1. https://developer.apple.com/account/resources 의 Identifiers 로 이동해 주세요.
  2. Tracking 하고자하는 앱의 Identifier 를 클릭해 주세요.
  3. 해당 Identifier 의 App ID Prefix + . + Bundle ID 를 에어브릿지 대시보드의 iOS App ID 영역에 입력해 주세요.

예) 9JA89QQLNQ.com.apple.wwdc

프로젝트 설정

Scheme

  1. Xcode > Project 파일 > Info > URL Types 로 이동해주세요.
  2. URL Schemes 에 에어브릿지 대시보드에 입력한 iOS URI Scheme 을 입력해주세요.

:// 값을 없애고 넣어주세요.

Universal Link

  1. Xcode > Project 파일 > Signing & Capabilities 로 이동해주세요.
  2. + Capability 를 눌러 Associated Domains 를 추가해주세요.
  3. Associated Domainsapplinks:YOUR_APP_NAME.airbridge.io 를 추가해주세요.
  4. Associated Domainsapplinks:YOUR_APP_NAME.deeplink.page 를 추가해주세요.

YOUR_APP_NAME 은 대시보드의 Settings > Tokens > 앱 이름 에서 확인할 수 있습니다.

Autofill 기능을 사용하는 경우, Troubleshooting > Webcredentials 를 참조해주세요.

SDK 에 Deeplink 정보 전달

  1. ios/[프로젝트 이름]/AppDelegate 파일을 열어주세요.
  2. 아래 함수의 최상단에서 handleURLSchemeDeeplink 함수를 호출해 App 이 Scheme 으로 열였을 때, SDK 에 Deeplink 정보를 전달해주세요.
- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey, id>*)options
{
    [AirBridge.deeplink handleURLSchemeDeeplink:url];

    return YES;
}
func application(_ app: UIApplication,
                 open url: URL,
                 options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool
{
    AirBridge.deeplink()?.handleURLSchemeDeeplink(url)
    
    return true
}
  1. iOS 8.x 또는 그 이전 버전을 target 한다면, 아래 함수의 최상단에서도 handleURLSchemeDeeplink 함수를 호출해 App 이 Scheme 으로 열였을 때, SDK 에 Deeplink 정보를 전달해주세요.
- (BOOL)application:(UIApplication*)application
            openURL:(NSURL*)url
  sourceApplication:(NSString*)sourceApplication 
         annotation:(id)annotation
{
    [AirBridge.deeplink handleURLSchemeDeeplink:url];

    return YES;
}
func application(_ application: UIApplication,
                 open url: URL,
                 sourceApplication: String?,
                 annotation: Any) -> Bool
{
    AirBridge.deeplink()?.handleURLSchemeDeeplink(url)
    
    return true;
}
  1. 아래 함수의 최상단에서 handleUniversalLink 함수를 호출해 App 이 Universal Link 로 열였을 때, SDK 에 Deeplink 정보를 전달해주세요.
-  (BOOL)application:(UIApplication*)application
continueUserActivity:(NSUserActivity*)userActivity
  restorationHandler:(void (^)(NSArray* _Nullable))restorationHandler
{
    [AirBridge.deeplink handleUniversalLink:userActivity.webpageURL];

    return YES;
}
func application(_ application: UIApplication,
                 continue userActivity: NSUserActivity,
                 restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool
{
    if let webpageURL = userActivity.webpageURL {      
        AirBridge.deeplink()?.handleUniversalLink(webpageURL)
    }
    
    return true
}

Deeplink Callback 설정

  1. ios/[프로젝트 이름]/AppDelegate 파일을 열어주세요.
  2. setDeeplinkCallback 함수를 사용해서 Deeplink 로 App 이 열였을 때, 호출 될 Callback 을 입력해주세요.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
    [AirBridge getInstance:@"YOUR_APP_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];

    [AirBridge.deeplink setDeeplinkCallback:^(NSString* deeplink) {
        // 딥링크로 앱이 열리는 경우 작동할 코드
        // Airbridge 를 통한 Deeplink = YOUR_SCHEME://...
        NSLog(@"DeeplinkCallback : %@", deeplink);
    }];
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey:
Any]?) -> Bool {
    AirBridge.getInstance("YOUR_APP_TOKEN", appName: "YOUR_APP_NAME", withLaunchOptions: launchOptions)
    
    AirBridge.deeplink()?.setDeeplinkCallback({ (deeplink) in
        // 딥링크로 앱이 열리는 경우 작동할 코드
        // Airbridge 를 통한 Deeplink = YOUR_SCHEME://...
        NSLog("DeeplinkCallback : %@", deeplink)
    })
    
    return true
}

App 을 여는 모든 Deeplink 들은 Deeplink Callback 에 전달됩니다.
그리고 그 Deeplink 들 중, Airbridge 를 통한 Deeplink 는 Airbridge 대시보드의 iOS URI Scheme 에 입력한 YOUR_SCHEME://... 형태로 전달됩니다.


Airbridge iOS SDK, 1.10.0 ~ 1.10.9 를 사용하는 경우
Airbridge Deeplinkhttps://YOUR_APP_NAME.airbridge.io/... 형태로 전달됩니다.

Airbridge iOS SDK, ~ 1.9.10 를 사용하는 경우
Airbridge Deeplinkhttps://YOUR_APP_NAME.airbridge.io/... 또는 YOUR_SCHEME://... 형태로 전달됩니다.

Custom Domain 설정 (옵션)

Airbridge Tracking Link 에 Custom Domain 을 사용한다면 example.com 부분에 설정한 커스텀 도메인을 넣어 아래와 같이 설정해주세요.

  1. Xcode > Project 파일 > Signing & Capabilities > Associated Domains 로 이동해주세요.
  2. + 버튼을 눌러 applinks:example.com 를 추가해주세요.
  3. info.plist 를 열어주세요.
  4. 다음 값을 추가해주세요.

딥링크 설정 확인

Airbridge 대시보드의 iOS URI Scheme 에 입력한 YOUR_SCHEME://... 형태의 딥링크를 클릭하였을 때, 앱이 열리고 Deeplink 이벤트가 전송되는지 확인해주세요.

예) example://

  1. 딥링크를 클릭해주세요.
  2. Airbridge 대시보드 > Raw Data > App Real-time Logs 에서 Deeplink 이벤트가 존재하는지 확인해주세요.

사용자 설정


사용자 식별자 설정

SDK 에 사용자 식별자 정보를 전달하여 이후 수집되는 모든 이벤트에 입력되도록 할 수 있습니다.

[AirBridge.state setUserID:@"testID"];
[AirBridge.state setUserEmail:@"[email protected]"];
[AirBridge.state setUserPhone:@"000-0000-0000"];

// 입력된 dictionary 로 user attributes 가 교체됩니다.
[AirBridge.state setUserAttributes:@{@"key": @"value"}];
// 기존의 user attributes 에 해당 key, value 가 추가됩니다.
[AirBridge.state addUserAttributesWithKey:@"key" value:@"value"];

// 입력된 dictionary 로 user alias 가 교체됩니다.
[AirBridge.state setUserAlias:@{@"key": @"value"}];
// 기존의 user alias 에 해당 key, value 가 추가됩니다.
[AirBridge.state addUserAliasWithKey:@"key" value:@"value"];
AirBridge.state()?.setUserID("testID")
AirBridge.state()?.setUserEmail("[email protected]")
AirBridge.state()?.setUserPhone("000-0000-0000")

// 입력된 dictionary 로 user attributes 가 교체됩니다.
AirBridge.state()?.setUserAttributes(["key": "value" as NSObject])
// 기존의 user attributes 에 해당 key, value 가 추가됩니다.
AirBridge.state()?.addUserAttributes(withKey: "key", value: "value" as NSObject)

// 입력된 dictionary 로 user alias 가 교체됩니다.
AirBridge.state()?.setUserAlias(["key": "value"])
// 기존의 user alias 에 해당 key, value 가 추가됩니다.
AirBridge.state()?.addUserAlias(withKey: "key", value: "value")

이름

설명

제한

id

사용자 ID

email

사용자 Email

자동으로 SHA256 으로 Hash 됨 (옵션으로 해제가능)

phone

사용자 전화번호

자동으로 SHA256 으로 Hash 됨 (옵션으로 해제가능)

attributes

사용자 속성

  • 최대 100개 입니다.
  • key 는 NSString 타입이며, 최대 128자 입니다.
  • key 는 ^[a-z_][a-z0-9_]*$ 정규식을 만족해야 합니다.
  • value 는 NSString 또는 NSNumber 타입입니다.
  • value 는 NSString 타입일 경우 최대 1024자 입니다.

alias

사용자의 또 다른 ID

  • 최대 10개 입니다.
  • key 는 NSString 타입이며, 최대 128자 입니다.
  • key 는 ^[a-z_][a-z0-9_]*$ 정규식을 만족해야 합니다.
  • value 는 NSString 타입이며, 최대 1024자 입니다.

사용자 설정 확인

사용자 설정을 완료한 후, SDK 를 통해 Event 를 전송하고, 해당 Event 에 설정한 사용자 정보가 있는지 확인해주세요.

  1. 사용자 설정을 해주세요.
  2. SDK 를 통해 Event 를 전송해주세요.
  3. Airbridge 대시보드 > Raw Data > App Real-time Logs 에서 전송한 Event 를 클릭하여 JSON 속 user 부분에 설정한 사용자 정보가 있는지 확인해주세요.

이벤트 설정


사용자의 중요한 행동들이 발생할 때, 인앱 이벤트를 전송해 유입 경로별 성과를 측정할 수 있습니다.

모든 이벤트의 파라미터는 선택적으로 추가할 수 있습니다.
그러나 이벤트에 대한 많은 정보는 정확한 통계 제공에 도움이 됨으로 추가하는 것을 권장합니다.

커스텀 이벤트 전송

SDK 를 통해 커스텀 이벤트를 전송할 수 있습니다.

setCategory 함수는 이벤트 전송을 위해 필수적으로 호출되어야만 합니다.

#import <AirBridge/ABInAppEvent.h>

ABInAppEvent* event = [[ABInAppEvent alloc] init];

[event setCategory:@"category"];
[event setAction:@"action"];
[event setLabel:@"label"];
[event setValue:@(123)];
[event setCustoms:@{@"key": @"value"}];

// Semantic Attributes Option 1
ABSemanticAttributes* semanticAttributes = [[ABSemanticAttributes alloc] init];
semanticAttributes.transactionID = @"transaction_123";
[event setSemanticAttributes:semanticAttributes];

// Semantic Attributes Option 2
// For more details, please check following page
// https://developers.airbridge.io/docs/event-structure#semantic-attributes
[event setSemantics:@{@"transactionID": @"transaction_123"}];

[event send];
let event = ABInAppEvent()

event?.setCategory("category")
event?.setAction("action")
event?.setLabel("label")
event?.setValue(123)
event?.setCustoms(["key": "value"])

// Semantic Attributes Option 1
let semanticAttributes = ABSemanticAttributes()
semanticAttributes?.transactionID = "transaction_123"
event?.setSemanticAttributes(semanticAttributes)

// Semantic Attributes Option 2
// For more details, please check following page
// https://developers.airbridge.io/docs/event-structure#semantic-attributes
event?.setSemantics(["transactionID": "transaction_123"])

event?.send()

파라미터

설명

setCategory

이벤트 이름 (required)

setAction

이벤트 하위 분류 1

setLabel

이벤트 하위 분류 2

setValue

이벤트 커스텀 값

setCustoms

이벤트 커스텀 정보

setSemantics

이벤트 시맨틱 정보 (Map)

setSemanticAttributes

이벤트 시맨틱 정보 (Class)

사용자 이벤트 전송

SDK 를 통해 사용자 관련 이벤트를 전송할 수 있습니다.

사용자 이벤트에서도 setAction, setLabel, setValue, setCustoms, setSemantics, setSemanticAttributes 함수 사용이 가능합니다.

회원가입

회원가입 이벤트 전송시, 사용자 식별자가 입력된 정보로 설정됩니다.

#import <AirBridge/ABUser.h>
#import <AirBridge/ABUserEvent.h>

ABUser* user = [[ABUser alloc] init];
user.ID = @"testID";
user.email = @"[email protected]";
user.phone = @"000-0000-0000";
user.alias = @{
    @"key": @"value",
};
user.attributes = @{
    @"key": @"value",
};

ABUserEvent* event = [[ABUserEvent alloc] initWithUser:user];
[event sendSignup];
let user = ABUser()
user.ID = "testID"
user.email = "[email protected]"
user.phone = "000-0000-0000"
user.attributes = [
    "key": "value" as NSObject,
]
user.alias = [
    "key": "value",
]

let event = ABUserEvent(user: user)
event?.sendSignup()

로그인

로그인 이벤트 전송시, 사용자 식별자가 입력된 정보로 설정됩니다.

#import <AirBridge/ABUser.h>
#import <AirBridge/ABUserEvent.h>

ABUser* user = [[ABUser alloc] init];
user.ID = @"testID";
user.email = @"[email protected]";
user.phone = @"000-0000-0000";
user.alias = @{
    @"key": @"value",
};
user.attributes = @{
    @"key": @"value",
};

ABUserEvent* event = [[ABUserEvent alloc] initWithUser:user];
[event sendSignin];
let user = ABUser()
user.ID = "testID"
user.email = "[email protected]"
user.phone = "000-0000-0000"
user.attributes = [
    "key": "value" as NSObject,
]
user.alias = [
    "key": "value",
]

let event = ABUserEvent(user: user)
event?.sendSignin()

로그아웃

로그아웃 이벤트 전송시, 사용자 식별자가 초기화됩니다.

#import <AirBridge/ABUserEvent.h>

ABUserEvent* event = [[ABUserEvent alloc] init];
[event expireUser];
let event = ABUserEvent()
event?.expireUser()

이커머스 이벤트 전송

SDK 를 통해 이커머스 관련 이벤트를 전송할 수 있습니다.

이커머스 이벤트에서setAction, setLabel, setValue, setCustoms, setSemanticAttributes 함수 사용이 가능합니다.

홈 화면 조회

#import <AirBridge/ABEcommerceEvent.h>

ABEcommerceEvent* event = [[ABEcommerceEvent alloc] init];

[event sendViewHome];
let event = ABEcommerceEvent()

event?.sendViewHome()

상품 상세 조회

#import <AirBridge/ABProduct.h>
#import <AirBridge/ABEcommerceEvent.h>

ABProduct* product1 = [[ABProduct alloc] init];
product1.idx = @"idx1";
product1.name = @"name1";
product1.price = @100;
product1.currency = @"USD";
product1.orderPosition = @1;
product1.quantity = @1;

ABEcommerceEvent* event = [[ABEcommerceEvent alloc] initWithProducts:@[product1]];

[event sendViewProductDetail];
let product1 = ABProduct()
product1.idx = "idx1"
product1.name = "name1"
product1.price = 100
product1.currency = "USD"
product1.orderPosition = 1
product1.quantity = 1

let event = ABEcommerceEvent(products: [product1])

event?.sendViewProductDetail()

상품 리스트 조회

#import <AirBridge/ABProduct.h>
#import <AirBridge/ABEcommerceEvent.h>

ABProduct* product1 = [[ABProduct alloc] init];
product1.idx = @"idx1";
product1.name = @"name1";
product1.price = @100;
product1.currency = @"USD";
product1.orderPosition = @1;
product1.quantity = @1;

ABProduct* product2 = [[ABProduct alloc] init];
product2.idx = @"idx2";
product2.name = @"name2";
product2.price = @200;
product2.currency = @"USD";
product2.orderPosition = @2;
product2.quantity = @2;

ABEcommerceEvent* event = [[ABEcommerceEvent alloc] initWithProducts:@[product1, product2]];
event.productListID = @"listID";

[event sendViewProductList];
let product1 = ABProduct()
product1.idx = "idx1"
product1.name = "name1"
product1.price = 100
product1.currency = "USD"
product1.orderPosition = 1
product1.quantity = 1

let product2 = ABProduct()
product2.idx = "idx2"
product2.name = "name2"
product2.price = 200
product2.currency = "USD"
product2.orderPosition = 2
product2.quantity = 2

let event = ABEcommerceEvent(products: [product1, product2])
event?.productListID = "listID"

event?.sendViewProductList()

검색 결과 조회

#import <AirBridge/ABProduct.h>
#import <AirBridge/ABEcommerceEvent.h>

ABProduct* product1 = [[ABProduct alloc] init];
product1.idx = @"idx1";
product1.name = @"name1";
product1.price = @100;
product1.currency = @"USD";
product1.orderPosition = @1;
product1.quantity = @1;

ABProduct* product2 = [[ABProduct alloc] init];
product2.idx = @"idx2";
product2.name = @"name2";
product2.price = @200;
product2.currency = @"USD";
product2.orderPosition = @2;
product2.quantity = @2;

ABEcommerceEvent* event = [[ABEcommerceEvent alloc] initWithProducts:@[product1, product2]];
event.query = @"query";

[event sendViewSearchResult];
let product1 = ABProduct()
product1.idx = "idx1"
product1.name = "name1"
product1.price = 100
product1.currency = "USD"
product1.orderPosition = 1
product1.quantity = 1

let product2 = ABProduct()
product2.idx = "idx2"
product2.name = "name2"
product2.price = 200
product2.currency = "USD"
product2.orderPosition = 2
product2.quantity = 2

let event = ABEcommerceEvent(products: [product1, product2])
event?.query = "query"

event?.sendViewSearchResult()

장바구니 담기

#import <AirBridge/ABProduct.h>
#import <AirBridge/ABEcommerceEvent.h>

ABProduct* product1 = [[ABProduct alloc] init];
product1.idx = @"idx1";
product1.name = @"name1";
product1.price = @100;
product1.currency = @"USD";
product1.orderPosition = @1;
product1.quantity = @1;

ABProduct* product2 = [[ABProduct alloc] init];
product2.idx = @"idx2";
product2.name = @"name2";
product2.price = @200;
product2.currency = @"USD";
product2.orderPosition = @2;
product2.quantity = @2;

ABEcommerceEvent* event = [[ABEcommerceEvent alloc] initWithProducts:@[product1, product2]];
event.cartID = @"cartID";
event.currency = @"KRW";
event.eventValue = @300;

[event sendAddProductToCart];
let product1 = ABProduct()
product1.idx = "idx1"
product1.name = "name1"
product1.price = 100
product1.currency = "USD"
product1.orderPosition = 1
product1.quantity = 1;

let product2 = ABProduct()
product2.idx = "idx2"
product2.name = "name2"
product2.price = 200
product2.currency = "USD"
product2.orderPosition = 2
product2.quantity = 2;

let event = ABEcommerceEvent(products: [product1, product2])
event?.cartID = "cartID"
event?.currency = "KRW"
event?.eventValue = 300

event?.sendAddProductToCart()

결제

#import <AirBridge/ABProduct.h>
#import <AirBridge/ABEcommerceEvent.h>

ABProduct* product1 = [[ABProduct alloc] init];
product1.idx = @"idx1";
product1.name = @"name1";
product1.price = @100;
product1.currency = @"USD";
product1.orderPosition = @1;
product1.quantity = @1;

ABProduct* product2 = [[ABProduct alloc] init];
product2.idx = @"idx2";
product2.name = @"name2";
product2.price = @200;
product2.currency = @"USD";
product2.orderPosition = @2;
product2.quantity = @2;

ABEcommerceEvent* event = [[ABEcommerceEvent alloc] initWithProducts:@[product1, product2]];
event.isInAppPurchase = YES;
event.eventValue = @300;
event.transactionID = @"transactionID";
event.currency = @"KRW";

[event sendCompleteOrder];
let product1 = ABProduct()
product1.idx = "idx1"
product1.name = "name1"
product1.price = 100
product1.currency = "USD"
product1.orderPosition = 1
product1.quantity = 1

let product2 = ABProduct()
product2.idx = "idx2"
product2.name = "name2"
product2.price = 200
product2.currency = "USD"
product2.orderPosition = 2
product2.quantity = 2

let event = ABEcommerceEvent(products: [product1, product2])
event?.isInAppPurchase = true;
event?.eventValue = @300;
event?.transactionID = @"transactionID";
event?.currency = @"KRW";

event?.sendCompleteOrder()

이벤트 전송 확인

SDK 를 통해 Event 를 전송하고, 에어브릿지 대시보드에 해당 Event 가 존재하는지 확인해주세요.

  1. SDK 를 통해 Event 를 전송해주세요.
  2. Airbridge 대시보드 > Raw Data > App Real-time Logs 에서 전송한 Event 가 존재하는지 확인해주세요.

고급 설정


세션 타임아웃 설정

SDK 를 초기화하는 코드 상단에 setSessionTimeout 함수를 호출해 세션 타임아웃을 설정할 수 있습니다.

세션 타임아웃은 millisecond 단위이며, 0 이상 604800000 (7일) 이하 인 값이어야 합니다.

세션 타임아웃의 기본값은 1000 * 60 * 5 (5분) 입니다.

[AirBridge setSessionTimeout:1000 * 60 * 5];

[AirBridge getInstance:@"YOUR_APP_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
AirBridge.setSessionTimeout(1000 * 60 * 5)

AirBridge.getInstance("YOUR_APP_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)

사용자 정보 해시화 설정

유저의 정보 중 email, phone 정보는 자동으로 SHA256 으로 Hash 되어 전송합니다.
SDK 를 초기화하는 코드 상단에 setIsUserInfoHashed 함수를 호출해 설정을 변경하실 수 있습니다.

// User 정보 Hash 화 해제
[AirBridge setIsUserInfoHashed:NO];

[AirBridge getInstance:@"YOUR_APP_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
// User 정보 Hash 화 해제
AirBridge.setIsUserInfoHashed(false) 

AirBridge.getInstance("YOUR_APP_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)

페이스북 디퍼드 앱링크 설정

아래 설정을 통해 Facebook 의 Deferred App Link 를 SDK 에서 수집할 수 있습니다.

  1. https://developers.facebook.com/docs/ios/getting-started 링크를 통해 Facebook SDK 를 설치해주세요.
  2. ios/[프로젝트 이름]/AppDelegate 파일을 열어주세요.
  3. SDK 초기화 코드 이전에 setIsFacebookDeferredAppLinkEnabled 함수를 호출해주세요.

isFacebookDeferredAppLinkEnabled 값이 YES 이고, Facebook SDK 가 설치되어 있을 때, SDK 가 Facebook Deferred App Link 를 수집합니다.

[AirBridge setIsFacebookDeferredAppLinkEnabled:YES];

[AirBridge getInstance:@"YOUR_APP_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
AirBridge.setIsFacebookDeferredAppLinkEnabled(true)

AirBridge.getInstance("YOUR_APP_TOKEN", appName: "YOUR_APP_NAME", withLaunchOptions: launchOptions)

Airbridge 링크만 추적 설정

SDK 는 딥링크로 앱이 열렸을 때, 언제나 딥링크 이벤트를 전송합니다.

SDK 를 초기화하는 코드 상단에 setIsTrackAirbridgeDeeplinkOnly 함수를 호출해 true 로 설정하면, Airbridge 를 통한 딥링크 로 앱이 열린 경우에만 딥링크 이벤트를 전송할 수 있습니다.

// Airbridge 를 통한 딥링크 로 앱이 열린 경우에만 딥링크 이벤트를 전송
[AirBridge setIsTrackAirbridgeDeeplinkOnly:YES];

[AirBridge getInstance:@"YOUR_APP_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];
// Airbridge 를 통한 딥링크 로 앱이 열린 경우에만 딥링크 이벤트를 전송
AirBridge.setIsTrackAirbridgeDeeplinkOnly(true)

AirBridge.getInstance("YOUR_APP_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)

푸시 알림 딥링크 추적 설정

푸시 알림이 클릭되었을 때, handleURLSchemeDeeplink 함수를 호출해 푸시 알림 페이로드의 딥링크를 SDK 에 전달해주세요.

- (void)         application:(UIApplication *)application 
didReceiveRemoteNotification:(NSDictionary *)userInfo 
      fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
{
    if (UIApplication.sharedApplication.applicationState == UIApplicationStateInactive) {
        NSURL* url = // 푸시 알림 페이로드의 딥링크
        
        [AirBridge.deeplink handleURLSchemeDeeplink:url];
    }
}

- (void)userNotificationCenter:(UNUserNotificationCenter *)center 
didReceiveNotificationResponse:(UNNotificationResponse *)response 
         withCompletionHandler:(void (^)(void))completionHandler API_AVAILABLE(ios(10.0)) 
{
    if (UIApplication.sharedApplication.applicationState == UIApplicationStateInactive
        && [response.actionIdentifier isEqual:UNNotificationDefaultActionIdentifier])
    {
        NSURL* url = // 푸시 알림 페이로드의 딥링크
        
        [AirBridge.deeplink handleURLSchemeDeeplink:url];
    }
}
func application(_ application: UIApplication, 
                 didReceiveRemoteNotification userInfo: [AnyHashable : Any], 
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) 
{
    if UIApplication.shared.applicationState == .inactive {
        let url = // 푸시 알림 페이로드의 딥링크
            
        AirBridge.deeplink()?.handleURLSchemeDeeplink(url)
    }
}

@available(iOS 10.0, *)
func userNotificationCenter(_ center: UNUserNotificationCenter, 
                            didReceive response: UNNotificationResponse, withCompletionHandler 
                            completionHandler: @escaping () -> Void) 
{
    if UIApplication.shared.applicationState == .inactive,
       response.actionIdentifier == UNNotificationDefaultActionIdentifier
    {
        let url = // 푸시 알림 페이로드의 딥링크
            
        AirBridge.deeplink()?.handleURLSchemeDeeplink(url)
    }
}

앱 삭제 추적 설정

앱 삭제 추적 설정은 해당 페이지를 참조해 주세요.

Opt-out 설정

SDK 초기화 코드 이전에 autoStartTrackingEnabled 를 false 로 설정하면, SDK 는 startTracking 함수가 호출 될 때 까지 이벤트를 전송하지 않습니다.

AirBridge.autoStartTrackingEnabled = NO;

[AirBridge getInstance:@"YOUR_APP_TOKEN" appName:@"YOUR_APP_NAME" withLaunchOptions:launchOptions];

[AirBridge startTracking];
AirBridge.setAutoStartTrackingEnabled(false)

AirBridge.getInstance("YOUR_APP_TOKEN", appName:"YOUR_APP_NAME", withLaunchOptions:launchOptions)

AirBridge.startTracking()

디바이스 정보 수동 설정

SDK 에 디바이스의 또 다른 ID 를 입력할 수 있습니다.

[AirBridge.state setDeviceAlias:@{@"key": @"value"}];
[AirBridge.state addDeviceAliasWithKey:@"key" value:@"value"];
AirBridge.state()?.setDeviceAlias(["key": "value"])
AirBridge.state()?.addDeviceAlias(withKey: "key", value: "value")

Device Alias 의 개수는 최대 10개 입니다.
Device Alias 의 key 길이는 최대 128 입니다.
Device Alias 의 value 길이는 최대 128 입니다.
Device Alias 의 key 는 [a-z_][a-z0-9_]* 조건을 만족해야 합니다.

하이브리드 앱 설정


WebView 환경 이벤트 전송

WebView 의 웹사이트에 설치된 Web SDK 가 전송하는 Event 를 iOS SDK 가 대신 전송할 수 있습니다.

아래와 같이 WebView 의 configuration 의 controller 에 airbridge web interface 를 주입해주세요.

WKWebViewConfiguration* configuration = [[WKWebViewConfiguration alloc] init];

WKUserContentController* controller = [[WKUserContentController alloc] init];
[AirBridge.webInterface injectTo:controller withWebToken:@"YOUR_WEB_TOKEN"];

configuration.userContentController = controller;
    
WKWebView* webview = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
let configuration = WKWebViewConfiguration()
        
let controller = WKUserContentController()
AirBridge.webInterface()?.inject(to: controller, withWebToken: "YOUR_WEB_TOKEN")
        
configuration.userContentController = controller
        
webView = WKWebView(frame: .zero, configuration: configuration)

YOUR_WEB_TOKEN 은 대시보드의 Settings > Tokens > 웹 SDK 토큰 에서 확인할 수 있습니다.

Troubleshooting


Webcredentials

App 에서 Autofill 기능을 사용해 비밀번호를 저장하는 경우 webcredentials:... 설정이 되어 있지 않으면 비밀번호가 applinks:YOUR_APP_NAME.airbridge.io 또는 applinks:YOUR_APP_NAME.deeplink.page 의 도메인에 저장됩니다.

비밀번호가 저장되는 도메인을 변경하고 싶다면, example.com설정할 도메인 으로 변경해서 아래와 같이 설정해주세요.

  1. https://example.com/.well-known/apple-app-site-association 주소에서 아래내용을 호스팅해야 합니다.
{
    "webcredentials": {
        "apps": ["TEAM_ID.APP_BUNDLE_ID"]
    }
}

예) 9JA89QQLNQ.com.apple.wwdc

  1. Xcode > Project 파일 > Signing & Capabilities > Associated Domains 로 이동해주세요.
  2. + 버튼을 눌러 webcredentials:example.com 을 추가해주세요.

Updated 17 days ago

iOS SDK


Suggested Edits are limited on API Reference Pages

You can only suggest edits to Markdown body content, but not to the API spec.