iOS SDK

iOS SDK

IDFA 이용약관 동의link

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' 항목을 체크해 주세요.

ios idfa agreement

설치link

1. Cocoapodslink

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

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

sudo gem install cocoapods

Cocoapods 를 사용할 수 없는 환경인 경우, 고급 - SDK 직접 설치 를 확인해 주세요.

2. Swift Bridge Headerlink

Swift 를 사용하시고 계신다면 아래와 같은 단계를 수행해 주세요.

  1. [File > New > File...] > iOS - Source > Header File 을 클릭합니다.
  2. <YOUR_PROJECT_NAME>-Bridging-Header.h의 이름으로 저장합니다.
  3. 헤더파일 안에 #import <AirBridge/AirBridge.h> 을 추가합니다.
  4. Build SettingsObjective-C Bridging Header 속성안에 /PATH/TO/<YOUR_PROJECT_NAME>-Bridging-Header.h 를 추가합니다.

3. AppDelegate.hlink

AppDelegate.h 파일의 import 부분에 아래와 같은 코드를 추가해주세요.

#import <AirBridge/AirBridge.h>

Swift 프로젝트인 경우 <YOUR_PROJECT_NAME>-Bridging-Header.h 파일에 추가해 주세요.

4. AppDelegate.mlink

AppDelegate.m 파일의 application:didFinishLaunchingWithOptions: 메소드에 다음 코드를 추가해 주세요.

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

'앱 이름' 은 대시보드의 'App Setting > 앱 기본정보' 에서 확인할 수 있습니다.
'앱 토큰' 은 대시보드의 'App Setting > 토큰 관리' 에서 확인할 수 있습니다.

Swift 프로젝트인 경우 AppDelegate.swift 파일에 추가해 주세요.

설치 - 딥링크 - 등록link

딥링크 기능을 사용하기 위해 앱의 정보들을 에어브릿지 대시보드에 등록합니다.
대시보드에 접속하시고 사이드바의 Deeplinks 메뉴를 클릭하면 아래와 같은 화면이 나옵니다.

deeplinks

Schemelink

  1. 사용하기 원하는 scheme 를 딥링크 등록 부분 사진의 iOS URI scheme 영역에 "://" 을 붙여 입력해주세요.

예) scheme://

  1. 아래 링크에 접속합니다.

  2. 프로젝트의 앱 이름을 누릅니다.

  3. 아래 사진의 Prefix 와 ID 영역의 문자열을 복사하여 Prefix + "." + ID 인 문자열을 딥링크 등록 부분 사진의 iOS App ID 영역에 입력합니다.

예) 9JA89QQLNQ.com.apple.wwdc

ios app id

설치 - 딥링크 - Xcodelink

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

YOUR_APP_NAME 은 대시보드의 'App Setting > 앱 기본정보' 에서 확인할 수 있습니다.

Schemelink

  1. Xcode > Project 파일 > Info > URL Types 로 이동해주세요.
  2. identifier 와 URL Schemes 에 대시보드에서 설정한 scheme 값 을 넣어주세요.

ios url scheme

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

설치 - 딥링크 - codelink

  1. ios/[프로젝트 이름]/AppDelegate.m 파일을 열어주세요.
  2. 아래 코드를 추가해주세요.
- (BOOL)application:(UIApplication*)application
continueUserActivity:(NSUserActivity*)userActivity
restorationHandler:(void (^)(NSArray* _Nullable))restorationHandler
{
NSLog(@"continueUserActivity : %@", url);
[AirBridge.deeplink handleUniversalLink:userActivity.webpageURL];
return YES;
}

Schemelink

  1. ios/[프로젝트 이름]/AppDelegate.m 파일을 열어주세요.
  2. 아래 코드를 추가해주세요.
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
options:(NSDictionary<UIApplicationOpenURLOptionsKey, id>*)options
{
NSLog(@"openURL : %@", url);
[AirBridge.deeplink handleURLSchemeDeeplink:url
withSourceBundle:options[UIApplicationOpenURLOptionsSourceApplicationKey]];
return YES;
}
  1. iOS 8.x 또는 그 이전 버전을 target 한다면 아래와 같은 코드를 추가로 적어주세요.
- (BOOL)application:(UIApplication*)application
openURL:(NSURL*)url
sourceApplication:(NSString*)sourceApplication
annotation:(id)annotation
{
NSLog(@"openURL : %@", url);
[AirBridge.deeplink handleURLSchemeDeeplink:url
withSourceBundle:sourceApplication];
return YES;
}
  1. ios/[프로젝트 이름]/AppDelegate.m 파일을 열어주세요.
  2. 아래 코드를 추가해주세요.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
[AirBridge getInstance:@"YOUR_APP_TOKEN(앱 토큰)" appName:@"YOUR_APP_NAME(앱 이름)" withLaunchOptions:launchOptions];
[AirBridge.deeplink setDeeplinkCallback:^(NSString* deeplink) {
// 딥링크시에 작동할 코드
// deeplink = https://appname.airbridge.io/...
NSLog(@"DeeplinkCallback : %@", deeplink);
}];
}

설치 - 딥링크 - 커스텀 (옵션)link

트래킹링크 커스텀 도메인을 설정했다면 다음과 같이 설정해주세요.

  1. info.plist 를 열어주세요.
  2. 다음 값을 추가해주세요.
KeyTypeValue
co.ab180.airbridge.trackingLink.customDomainsArray(1 item)
- Item 0Stringexample.com

ios trackinglink custom domain

example.com 부분에 설정한 커스텀 도메인을 넣어주세요.

DeeplinkCallback 에 발생하는 딥링크의 형태를 변경할 수 있습니다.

  1. info.plist 를 열어주세요.
  2. 다음 값을 추가해주세요.
KeyTypeValue
co.ab180.airbridge.deeplink.schemeStringexample
co.ab180.airbridge.deeplink.hostStringexample.com

ios deeplink custom domain

위와 같이 설정하면, DeeplinkCallback 의
deeplink 가 https://appname.airbridge.io/... 형태로 발생하던 것이
deeplink 가 example://example.com/... 형태로 발생하게 변경됩니다.

Deeplink - Custom DomainTracking Link - Custom Domain 은 서로 동일하면 안됩니다.

설치 확인link

  1. 테스트 디바이스에서 앱을 삭제해주세요.
  2. 앱을 빌드하여 해당 테스트 디바이스에서 앱을 설치 및 실행을 해주세요.
  3. 에어브릿지 대시보드 → 앱 선택 → 'Log Data' 아래의 'Realtime Log' 항목을 클릭해 주세요.
  4. 'Device UUID 입력' 에 iOS IDFA 를 입력해 주세요.
  • 디바이스 UUID (iOS IDFA) 노출이 확인되지 않는다면 설치 에 안내된 대로 설치되었는지 다시 확인해 주세요.
  • 로그 노출은 최대 5분 가량 지연될 수 있습니다.

인앱 이벤트link

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

회원, 커머스 관련 9가지의 기본이벤트가 제공되고, 커스텀 이벤트를 정의하여 사용하실 수 있습니다.

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

인앱 이벤트 - 회원link

회원 인앱 이벤트는 크로스 플랫폼 사용자 매칭 의 구성요소입니다.
가능하면 하나이상의 유저 정보를 포함하여 전송해 주시기 바랍니다.

회원가입 및 로그인 이벤트가 발생한 경우,
다음 로그아웃 이벤트 발생까지 모든 이벤트가 해당 유저에서 발생한 것으로 기록됩니다.

로그아웃 이벤트가 발생한 경우,
다음 회원가입 및 로그인 이벤트 발생까지 모든 이벤트가 유저 없이 발생한 것으로 기록됩니다.

사용자 정보는 모두 Hash (SHA256) 되어 전송됩니다.

ABUser 클래스link

유저 정보를 담는 클래스 입니다.

생성자link

이름파라미터설명
init-비어있는 ABUser 객체 생성

Propertylink

이름타입설명
IDNSString유저 아이디
emailNSString유저 이메일
phoneNSString유저 휴대전화 번호
attributesNSDictionary<NSString, NSObject>유저 속성
aliasNSDictionary<NSString, NSString>유저 alias

User Attributes 의 개수는 최대 100개 입니다.
User Attributes 의 key 길이는 최대 128자 입니다.
User Attributes 의 value 는 NSNumber 이거나 NSString 이여야 합니다.
User Attributes 의 value 가 NSString 이면, 길이는 최대 1024자 입니다.
User Attributes 의 key 는 ^[a-z][a-z0-9_]*$ 정규식을 만족해야 합니다.

User Alias 의 개수는 최대 10개 입니다.
User Alias 의 key 길이는 최대 128자 입니다.
User Alias 의 value 길이는 최대 128자 입니다.
User Alias 의 key 는 ^[a-z_][a-z0-9_]*$ 정규식을 만족해야 합니다.

ABUserEvent 클래스link

유저 이벤트를 전송하기 위한 클래스 입니다.

생성자link

이름파라미터설명
init-비어있는 ABUserEvent 객체 생성
initWithUserABUser* user
이벤트를 전송할 때 넣을 유저 정보
유저정보가 담긴 ABUserEvent 객체 생성

메서드link

이름파라미터설명
sendSignup-회원가입 이벤트 전송
sendSignin-로그인 이벤트 전송
expireUser-로그아웃 이벤트 전송

회원가입link

사용자가 회원가입을 하는 경우, ABUserEvent 객체를 생성하여 sendSignup 함수를 실행해 주세요.

코드 예시link

#import <AirBridge/ABUser.h>
#import <AirBridge/ABUserEvent.h>
ABUser* user = [[ABUser alloc] init];
user.ID = @"testID";
user.email = @"testID@ab180.co";
user.phone = @"000-0000-0000";
user.attributes = @{
@"one": @"value",
@"two": @2
};
ABUserEvent* event = [[ABUserEvent alloc] initWithUser:user];
[event sendSignup];

로그인link

사용자가 로그인을 하는 경우, ABUserEvent 객체를 생성하여 sendSignin 함수를 실행해 주세요.

코드 예시link

#import <AirBridge/ABUser.h>
#import <AirBridge/ABUserEvent.h>
ABUser* user = [[ABUser alloc] init];
user.ID = @"testID";
user.email = @"testID@ab180.co";
user.phone = @"000-0000-0000";
user.attributes = @{
@"one": @"value",
@"two": @2
};
ABUserEvent* event = [[ABUserEvent alloc] initWithUser:user];
[event sendSignin];

로그아웃link

사용자가 로그아웃을 하는 경우, ABUserEvent 객체를 생성하여 expireUser 함수를 실행해 주세요.

코드 예시link

#import <AirBridge/ABUserEvent.h>
ABUserEvent* event = [[ABUserEvent alloc] init];
[event expireUser];

인앱 이벤트 - 커머스link

사용자의 커머스 관련 행동을 추적합니다.

ABProduct 클래스link

상품 정보를 담는 클래스 입니다.

생성자link

이름파라미터설명
init-비어있는 ABUser 객체 생성

Propertylink

이름타입설명
idxNSString*상품 고유 ID
nameNSString*상품 이름
priceNSNumber*상품 가격
currencyNSString*상품 통화
ISO 4217 standard에 따름
orderPositionNSNumber*리스트 중 상품 위치
quantityNSNumber*

ABEcommerceEvent 클래스link

커머스 이벤트를 전송하기 위한 클래스 입니다.

생성자link

이름파라미터설명
init-비어있는
ABEcommerceEvent 객체 생성
initWithProductsNSArray<ABProduct>* products
상품 리스트
상품 리스트가 담긴
ABEcommerceEvent 객체 생성

Propertylink

이름타입설명
productsNSArray*상품 리스트
productListIDNSString*상품 리스트 고유 아이디
queryNSString*검색어
cartIDNSString*장바구니 고유 아이디
transactionIDNSString*거래 아이디
eventValueNSNumber*상품 리스트 총 가격
currencyNSString*상품 통화
ISO 4217 standard에 따름
isInAppPurchaseBOOL인앱 결제 여부

메서드link

이름파라미터설명
sendViewHome-홈 화면 조회 이벤트 전송
sendViewProductList-상품 리스트 조회 이벤트 전송
sendViewSearchResult-검색결과 조회 이벤트 전송
sendViewProductDetail-상품 상세페이지 조회 이벤트 전송
sendAddProductToCart-장바구니 담기 이벤트 전송
sendCompleteOrder-결제 이벤트 전송

홈 화면 조회link

사용자가 앱의 홈 화면으로 이동하는 경우
ABEcommerceEvent 객체를 생성하여 sendViewHome 함수를 실행해 주세요.

코드 예시link

#import <AirBridge/ABEcommerceEvent.h>
ABEcommerceEvent* event = [[ABEcommerceEvent alloc] init];
[event sendViewHome];

상품 리스트 조회link

사용자가 상품 리스트를 조회할 경우
ABEcommerceEvent 객체를 생성하여 sendViewProductList 함수를 실행해 주세요.

코드 예시link

#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;
ABProduct* product2 = [[ABProduct alloc] init];
product2.idx = @"idx2";
product2.name = @"name2";
product2.price = @200;
product2.currency = @"USD";
product2.orderPosition = @2;
ABEcommerceEvent* event = [[ABEcommerceEvent alloc] initWithProducts:@[product1, product2]];
event.productListID = @"listID";
[event sendViewProductList];
  • 사용자가 리스트를 스크롤하여 새로운 정보를 로드할 경우
    추가적으로 로드된 상품 정보로 해당 이벤트를 별도로 생성하여 전송하시는 것을 권장합니다.

검색결과 조회link

사용자가 상품을 검색하는 경우
ABEcommerceEvent 객체를 생성하여 sendViewSearchResult 함수를 실행해 주세요.

코드 예시link

#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;
ABProduct* product2 = [[ABProduct alloc] init];
product2.idx = @"idx2";
product2.name = @"name2";
product2.price = @200;
product2.currency = @"USD";
product2.orderPosition = @2;
ABEcommerceEvent* event = [[ABEcommerceEvent alloc] initWithProducts:@[product1, product2]];
event.query = @"query";
[event sendViewSearchResult];

상품 상세페이지 조회link

사용자가 상품의 상세정보를 조회하는 경우
ABEcommerceEvent 객체를 생성하여 sendViewProductDetail 함수를 실행해 주세요.

코드 예시link

#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;
ABEcommerceEvent* event = [[ABEcommerceEvent alloc] initWithProducts:@[product1]];
[event sendViewProductDetail];

장바구니 담기link

사용자가 장바구니에 상품을 담는 경우
ABEcommerceEvent 객체를 생성하여 sendAddProductToCart 함수를 실행해 주세요.

코드 예시link

#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;
ABProduct* product2 = [[ABProduct alloc] init];
product2.idx = @"idx2";
product2.name = @"name2";
product2.price = @200;
product2.currency = @"USD";
product2.orderPosition = @2;
ABEcommerceEvent* event = [[ABEcommerceEvent alloc] initWithProducts:@[product1, product2]];
event.cartID = @"cartID";
event.currency = @"KRW";
event.eventValue = @300;
[event sendAddProductToCart];

결제link

사용자가 결제하는 경우
ABEcommerceEvent 객체를 생성하여 sendCompleteOrder 함수를 실행해 주세요.

코드 예시link

#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;
ABProduct* product2 = [[ABProduct alloc] init];
product2.idx = @"idx2";
product2.name = @"name2";
product2.price = @200;
product2.currency = @"USD";
product2.orderPosition = @2;
ABEcommerceEvent* event = [[ABEcommerceEvent alloc] initWithProducts:@[product1, product2]];
event.isInAppPurchase = YES;
event.eventValue = @300;
event.transactionID = @"transactionID";
event.currency = @"KRW";
[event sendCompleteOrder];

인앱 이벤트 - 커스텀link

인앱 이벤트를 커스텀 정의해서 사용할 수 있습니다.

ABInAppEvent 클래스link

메서드link

이름파라미터설명
setCategoryNSString* category
이벤트 이름
이벤트 이름 설정
setActionNSString* action
이벤트 하위 분류 1
이벤트 하위 분류 1 설정
setLabelNSString* category
이벤트 하위 분류 2
이벤트 하위 분류 2 설정
setValueNSNumber* value
이벤트 커스텀 값
이벤트 커스텀 값 설정
setCustomsNSDictionary* value
이벤트 커스텀 정보
이벤트 커스텀 정보 설정
send이벤트 전송

Category, Action, Label 에 대해서는, 인앱 이벤트 구분 항목을 참조하세요.

Code examplelink

#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"}];
[event send];

사용하지 않는 파라미터에는 nil 을 입력해 주세요.

설정link

세션 기간link

AirBridge getInstance... 코드 이전에 다음 메서드를 호출해 앱의 세션 기간을 설정할 수 있습니다.

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

#import <AirBridge/AirBridge.h>
[AirBridge setSessionTimeout:1000 * 60 * 5];
[AirBridge getInstance:@"YOUR_APP_TOKEN(앱 토큰)" appName:@"YOUR_APP_NAME(앱 이름)" withLaunchOptions:launchOptions];

세션 기간의 기본값은 1000 60 5 (5분) 입니다.

유저 정보 암호화 해제link

유저의 정보는 모두 Hash (SHA256) 되어 전송합니다.

만일 Hash 화를 원하지 않을 경우 아래 메서드를 활용하여 설정을 변경하실 수 있습니다.

#import <AirBridge/AirBridge.h>
// User 정보 Hash 화 해제
[AirBridge setIsUserInfoHashed:NO];
// User 정보 Hash 화 적용
[AirBridge setIsUserInfoHashed:YES];

인앱 이벤트 구분link

에어브릿지 대시보드는 Category, Action, Label 을 통해 이벤트들을 분리하여 통계를 표시합니다.

Category 는 이벤트의 이름 입니다.
Action 은 이벤트의 하위 분류 1 입니다.
Label 은 이벤트의 하위 분류 2 입니다.

모든 인앱 이벤트는 Action 과 Label 을 수정할 수 있습니다.
커스텀 인앱 이벤트는 Category 지정이 가능하고 기본제공 인앱 이벤트는 Category 지정이 불가능합니다.

코드 예시link

#import <AirBridge/AirBridge.h>
ABUserEvent* userEvent1 = [[ABUserEvent alloc] init];
[userEvent1 setAction:@"서울"];
[userEvent1 setLabel:@"10대"];
ABUserEvent* userEvent2 = [[ABUserEvent alloc] init];
[userEvent2 setAction:@"서울"];
[userEvent2 setLabel:@"20대"];
ABUserEvent* userEvent3 = [[ABUserEvent alloc] init];
[userEvent3 setAction:@"부산"];
[userEvent3 setLabel:@"10대"];
ABEcommerceEvent* ecommerceEvent1 = [[ABEcommerceEvent alloc] init];
[ecommerceEvent1 setAction:@"간편결제 사용"];
[ecommerceEvent1 setLabel:@"카카오페이 사용"];
ABEcommerceEvent* ecommerceEvent2 = [[ABEcommerceEvent alloc] init];
[ecommerceEvent2 setAction:@"간편결제 사용"];
[ecommerceEvent2 setLabel:@"토스 사용"];
ABInAppEvent* customEvent1 = [[ABInAppEvent alloc] init];
[customEvent1 setCategory:@"구독"];
[customEvent1 setAction:@"일반"];
ABInAppEvent* customEvent2 = [[ABInAppEvent alloc] init];
[customEvent2 setCategory:@"구독"];
[customEvent2 setAction:@"프리미엄"];
for(int i=0; i<10; i++) {
[userEvent1 sendSignup];
}
for(int i=0; i<20; i++) {
[userEvent2 sendSignup];
}
for(int i=0; i<15; i++) {
[userEvent3 sendSignup];
}
for(int i=0; i<8; i++) {
[ecommerceEvent1 sendCompleteOrder];
}
for(int i=0; i<7; i++) {
[ecommerceEvent2 sendCompleteOrder];
}
for(int i=0; i<10; i++) {
[customEvent1 send];
}
for(int i=0; i<5; i++) {
[customEvent2 send];
}

에어브릿지 대시보드에서 Category 를 기준으로 각 이벤트의 개수 통계를 볼 수 있습니다.
Action 으로 같은 Category 의 이벤트들을 분리하고
Label 을 통해 분리된 것을 또 분리하여 통계를 볼 수 있습니다.

결과적으로 대시에보드에 아래와 같은 결과물을 얻을 수 있습니다.

CategoryActionLabelCount
회원가입서울30대10
회원가입서울40대20
회원가입부산30대15
결제간편결제 사용카카오페이 사용8
결제간편결제 사용토스 사용7
구독일반10
구독프리미엄5

추가 수집link

선택적으로 더 많은 정보를 수집할 수 있습니다.

App 에서 딥링크 실행 및 추적link

아래와 같은 코드를 사용해서 App 에서 딥링크 동작을 수행하고, 그 동작을 추적할 수 있습니다.

#import <AirBridge/AirBridge.h>
[AirBridge.placement click:@"https://abr.ge/~~~" deeplink:@"ablog://main" fallback:@"https://airbridge.io"];
[AirBridge.placement impression:@"https://abr.ge/~~~"];

clicklink

click 함수는 해당 트래킹링크 의 click 통계를 1개 추가하고 설정된 App, Web 또는 Fallback 으로 이동합니다.
해당 트래킹링크 가 클릭되었을 때, 호출해 주세요.

click 함수에서 deeplink, fallback 은 인터넷 연결이 없을 때 사용하는 백업 링크 입니다.
deeplink 파라미터는 Custom URL Scheme 형식의 딥링크만 사용가능 합니다. (모두 optional 파라미터 입니다.)

impressionlink

impression 함수는 해당 트래킹링크 의 impression 통계를 1개 추가합니다.
해당 트래킹링크 가 UI 에 표시되었을 때, 호출해 주세요.

커스텀 도메인 을 사용하는 중 이라면, 커스텀 Short ID 를 사용한 트래킹링크 는 사용할 수 없습니다.
example: http://deeplink.ab180.co/custom -> 사용불가
example: http://deeplink.ab180.co/a3b1c2 -> 사용가능
example: https://abr.ge/a3b1c2 -> 사용가능

고급 - Web Applink

Web App 의 경우, 다음과 같이 인앱이벤트를 전송할 수 있습니다.

Native 에서 Event 전송 (옵션 1)link

Web 에서 ios app 일 때, Native 함수를 호출해 Airbridge iOS SDK 를 호출하면, Mobile Event 를 전송합니다.
Web 에서 browser 일 때, Airbridge Web SDK 를 호출하면, Web Event 를 전송합니다.

코드 예시 - Javascriptlink

if (check iOS app) {
// When ios app, send event with Airbridge iOS SDK
webkit.messageHandlers.goal.postMessage({
'category': 'category',
'label': 'label',
'action': 'action',
'value': 123.0,
'customAttributes': {
'custom1': 123,
'custom2': 'abc'
}
});
} else {
// When browser, send event with Airbridge Web SDK
airbridge.events.send('category', {
'label': 'label',
'action': 'action',
'value': 123.0,
'customAttributes': {
'custom1': 123,
'custom2': 'abc'
}
});
}

코드 예시 - ViewControllerlink

@import WebKit;
#import <AirBridge/AirBridge.h>
#import "ViewController.h"
@interface ViewController () <WKUIDelegate, WKScriptMessageHandler>
@end
@implementation ViewController {
WKWebView* web;
}
- (void)loadView {
WKUserContentController* controller = [[WKUserContentController alloc] init];
[controller addScriptMessageHandler:self name:@"goal"];
WKWebViewConfiguration* conf = [[WKWebViewConfiguration alloc] init];
conf.userContentController = controller;
web = [[WKWebView alloc] initWithFrame:CGRectZero configuration:conf];
self.view = web;
}
- (void)viewDidLoad {
[super viewDidLoad];
[web loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://~~~"]]];
}
- (void)userContentController:(WKUserContentController *)userContentController
didReceiveScriptMessage:(WKScriptMessage *)message
{
NSDictionary* body = message.body;
if([message.name isEqualToString:@"goal"]) {
[AirBridge.instance goalWithCategory:body[@"category"]
action:body[@"body"]
label:body[@"label"]
value:body[@"value"]
customAttributes:body[@"customAttributes"]];
}
}
@end

addScriptMessageHandler:name: 의 name 이 @"temp" 이면, 아래와 같이 호출해야 합니다.
webkit.messageHandlers.temp.postMessage(body);

Web 에서 Event 전송 (옵션 2)link

Web 에서 ios app 일 때, Airbridge Web SDK 에서 mobileApp 을 넣어 init 하면, Mobile Event 를 전송합니다.
Web 에서 browser 일 때, Airbridge Web SDK 에서 init 하면, Web Event 를 전송합니다.

코드 예시 - Javascriptlink

(function(a_,i_,r_,_b,_r,_i,_d,_g,_e){if(!a_[_b]||!a_[_b].queue){_g=i_.getElementsByTagName(r_)[0];a_[_b]={queue:[]};_d={};for(_i=0;_i<_r.length;_d={$jscomp$loop$prop$m$2:_d.$jscomp$loop$prop$m$2},_i++)_d.$jscomp$loop$prop$m$2=_r[_i],~_d.$jscomp$loop$prop$m$2.indexOf(".")&&(_e=_d.$jscomp$loop$prop$m$2.split(".")[0],a_[_b][_e]=a_[_b][_e]||{},a_[_b][_e][_d.$jscomp$loop$prop$m$2.split(".")[1]]=function(_d){return function(){a_[_b].queue.push([_d.$jscomp$loop$prop$m$2,arguments])}}(_d)),a_[_b][_d.$jscomp$loop$prop$m$2]=function(_d){return function(){a_[_b].queue.push([_d.$jscomp$loop$prop$m$2,arguments])}}(_d);_d=i_.createElement(r_);_d.async=1;_d.src="//static.airbridge.io/sdk/latest/airbridge.min.js";_g.parentNode.insertBefore(_d,_g)}})(window,document,"script","airbridge","init setBanner setDownload setDeeplinks sendSMS sendWeb setUserAgent setUserAlias addUserAlias setMobileAppData setUserId setUserEmail setUserPhone setUserAttributes setDeviceIFV setDeviceIFA setDeviceGAID events.send events.signIn events.signUp events.signOut events.purchased events.addedToCart events.productDetailsViewEvent events.homeViewEvent events.productListViewEvent events.searchResultViewEvent".split(" "));
var deviceUUID = undefined;
var packageName = undefined;
var isLimitAdTracking = undefined;
try {
deviceUUID = window.AirbridgeDeviceInfo.getDeviceUUID();
packageName = window.AirbridgeDeviceInfo.getPackageName();
isLimitAdTracking = window.AirbridgeDeviceInfo.isLimitAdTracking();
} catch {}
if (typeof deviceUUID === 'string'
&& typeof packageName === 'string'
&& typeof isLimitAdTracking === 'boolean')
{
// when ios app
airbridge.init({
app: 'ablog',
webToken: '8ec37a00b37a4576a7f8bdf8d5164dd5',
mobileApp: {
deviceUUID: deviceUUID,
packageName: packageName,
limitAdTracking: isLimitAdTracking,
}
});
} else {
// when browser
airbridge.init({
app: 'ablog',
webToken: '8ec37a00b37a4576a7f8bdf8d5164dd5'
});
}
// when ios app, send web event
// when browser, send mobile event
airbridge.events.send('category', {
'label': 'label',
'action': 'action',
'value': 123.0,
'customAttributes': {
'custom1': 123,
'custom2': 'abc'
}
});

코드 예시 - ViewControllerlink

#import "ViewController.h"
#import <WebKit/WebKit.h>
#import <AirBridge/AirBridge.h>
@interface ViewController ()
@end
@implementation ViewController {
WKWebView* webView;
}
- (void)viewDidLoad {
[super viewDidLoad];
NSString* insertDeviceInfoSource
= [NSString stringWithFormat:
@"window.AirbridgeDeviceInfo = {};"
@"window.AirbridgeDeviceInfo.getDeviceUUID = function () {"
@" return \'%@\';"
@"};"
@"window.AirbridgeDeviceInfo.getPackageName = function () {"
@" return \'%@\';"
@"};"
@"window.AirbridgeDeviceInfo.isLimitAdTracking = function () {"
@" return %@;"
@"};",
AirBridge.deviceUUID,
NSBundle.mainBundle.bundleIdentifier,
AirBridge.isLimitADTracking ? @"true" : @"false"];
WKUserScript* insertDeviceInfoScript
= [[WKUserScript alloc] initWithSource:insertDeviceInfoSource
injectionTime:WKUserScriptInjectionTimeAtDocumentStart
forMainFrameOnly:NO];
WKUserContentController* controller = [[WKUserContentController alloc] init];
[controller addUserScript:insertDeviceInfoScript];
WKWebViewConfiguration* configuration = [[WKWebViewConfiguration alloc] init];
configuration.userContentController = controller;
webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration];
self.view = webView;
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://..."]]];
}
@end

고급link

SDK 직접 설치link

Framework : 다운로드

위 파일을 다운받아 AirBridge.framework 파일을 프로젝트안에 Drag-and-Drop 해주세요.

ios framework add

로그 기능link

SDK 동작 로그를 출력합니다.

#import <AirBridge/AirBridge.h>
[AirBridge setLogLevel:AB_LOG_ALL];

유저 정보 수동 설정link

회원가입, 로그인, 로그아웃 이벤트 외에도 유저 정보를 수동으로 설정할 수 있습니다.

설정하면 다음 설정이나 sendSignup, sendSignin, expireUser 함수를 통한 유저 이벤트 전송까지
모든 이벤트가 설정된 유저에서 발생한 것으로 기록됩니다.

#import <AirBridge/AirBridge.h>
[AirBridge.state setUserID:@"testID"];
[AirBridge.state setUserEmail:@"testID@ab180.co"];
[AirBridge.state setUserPhone:@"000-0000-0000"];
[AirBridge.state setUserAttributes:@{@"key": @"value"}];
[AirBridge.state addUserAttributesWithKey:@"key" value:@"value"];
[AirBridge.state setUserAlias:@{@"key": @"value"}];
[AirBridge.state addUserAliasWithKey:@"key" value:@"value"];

User Attributes 의 개수는 최대 100개 입니다.
User Attributes 의 key 길이는 최대 128자 입니다.
User Attributes 의 value 는 NSNumber 이거나 NSString 이여야 합니다.
User Attributes 의 value 가 NSString 이면, 길이는 최대 1024자 입니다.
User Attributes 의 key 는 ^[a-z][a-z0-9_]*$ 정규식을 만족해야 합니다.

User Alias 의 개수는 최대 10개 입니다.
User Alias 의 key 길이는 최대 128자 입니다.
User Alias 의 value 길이는 최대 128자 입니다.
User Alias 의 key 는 ^[a-z_][a-z0-9_]*$ 정규식을 만족해야 합니다.

디바이스 정보 수동 설정link

추가 디바이스 정보를 입력합니다.

#import <AirBridge/AirBridge.h>
[AirBridge.state setDeviceAlias:@{@"key": @"value"}];
[AirBridge.state addDeviceAliasWithKey:@"key" value:@"value"];

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

푸시 알림의 딥링크 트래킹link

푸시 알림을 클릭해서 Deeplink 화면을 이동해야 할 때, 다음 코드를 실행해주세요.

// 푸시 알림의 payload 에서 획득한 deeplink
NSURL* deeplink = [NSURL URLWithString:...];
if ([deeplink.scheme isEqualToString:@"https"] || [deeplink.scheme isEqualToString:@"http"]) {
[AirBridge.deeplink handleUniversalLink:deeplink];
} else {
// withSourceBundle 은 무조건 nil
[AirBridge.deeplink handleURLSchemeDeeplink:deeplink withSourceBundle:nil];
}

WebView 에서 인앱 이벤트 전송 (WK)link

Javascript 를 통해 SDK 함수를 호출하여 인앱 이벤트를 전송할 수 있습니다.

코드 예시 - Javascriptlink

let body = {
category: "category!!",
action: "action!!",
label: "label!!",
value: 12345,
attributes: {
key: "value!!"
}
};
webkit.messageHandlers.goal.postMessage(body);

코드 예시 - ViewControllerlink

@import WebKit;
#import <AirBridge/AirBridge.h>
#import "ViewController.h"
@interface ViewController () <WKUIDelegate, WKScriptMessageHandler>
@end
@implementation ViewController {
WKWebView* web;
}
- (void)loadView {
WKUserContentController* controller = [[WKUserContentController alloc] init];
[controller addScriptMessageHandler:self name:@"goal"];
WKWebViewConfiguration* conf = [[WKWebViewConfiguration alloc] init];
conf.userContentController = controller;
web = [[WKWebView alloc] initWithFrame:CGRectZero configuration:conf];
self.view = web;
}
- (void)viewDidLoad {
[super viewDidLoad];
[web loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://~~~"]]];
}
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
NSDictionary* body = message.body;
if([message.name isEqualToString:@"goal"]) {
[AirBridge.instance goalWithCategory:body[@"category"] action:body[@"body"] label:body[@"label"] value:body[@"value"] customAttributes:body[@"attributes"]];
}
}
@end

addScriptMessageHandler:name: 의 name 이 @"temp" 이면, 아래와 같이 호출해야 합니다.
webkit.messageHandlers.temp.postMessage(body);

WebView 에서 인앱 이벤트 전송 (UI)link

Javascript 를 통해 SDK 함수를 호출하여 인앱 이벤트를 전송할 수 있습니다.

코드 예시 - Javascriptlink

window.location="jscall://goal?category=custom";

scheme 는 jscall 로, host 는 이름, ? 이후에는 파라미터 값을 GET 형식으로 적어주세요.

코드 예시 - ViewController (UIWebView)link

#import <AirBridge/AirBridge.h>
#import "ViewController.h"
@interface ViewController () <UIWebViewDelegate>
@end
@implementation ViewController {
UIWebView* web;
}
- (void)loadView {
web = [[UIWebView alloc] initWithFrame:CGRectZero];
web.delegate = self;
self.view = web;
}
- (void)viewDidLoad {
[super viewDidLoad];
[web loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://~~~"]]];
}
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
NSURL* URL = request.URL;
if([URL.scheme isEqualToString:@"jscall"]) {
if([URL.host isEqualToString:@"goal"]) {
NSDictionary* querys = [self getDictionaryWith:URL.query];
[AirBridge.instance goalWithCategory:querys[@"category"]];
}
}
return YES;
}
- (NSDictionary*)getDictionaryWith:(NSString*)query {
NSArray* querys = [query componentsSeparatedByString:@"&"];
NSMutableDictionary* result = [[NSMutableDictionary alloc] init];
for (NSString* query in querys) {
NSArray* pair = [query componentsSeparatedByString:@"="];
if (pair.count > 1) {
result[pair[0]] = [pair[1] stringByRemovingPercentEncoding];
}
}
return result;
}
@end

UUID 정보획득link

DeviceUUID 가져오기link

DeviceUUID를 가져옵니다.

AirBridge.deviceUUID;

ADID 허용 여부 가져오기link

ADID 허용 여부를 가져옵니다.

AirBridge.isLimitADTracking;

추적 중지 (Opt-out)link

SDK 에서 이벤트를 전송하는 기능을 중지할 수 있습니다.

AirBridge.isLimitTracking = true;

true : 추적 중지
false : 추적