SDK 삽입

1. 필수 설정

SDK 설치

Cocoapod 환경ì—서 SDK 다운로드 방법

XCode 프로ì íЏ 파ì¼ì¤‘ Podfile 파ì¼ì— 다ìŒê³¼ ê°™ì´ SDK를 추가합니다
pod 'RW'
ê¸°ì¡´ì— SDK를 한번 설치한 경우ì—는 설치할SDK ë²„ì „ì„ í‘œì‹œí•´ì•¼ 하는 ê²½ìš°ë„ ìžˆìŠµë‹ˆë‹¤. 아래와 ê°™ì´ ì„¤ì¹˜í•  SDKë²„ì „ì„ ëª…ì‹œì ìœ¼ë¡œ 표시하면 ë©ë‹ˆë‹¤.
pod 'RW', '~> 1.1.38'
Podfile ì— í•´ë‹¹ë¼ì¸ì„ 추가한 후 Terminal í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰í•˜ì—¬ 다ìŒì˜ ëª…ë ¹ì„ ìˆ˜í–‰í•©ë‹ˆë‹¤
pod install
SDK 버전 ì—…ë°ì´íŠ¸ì˜ ê²½ìš° 다ìŒì˜ ëª…ë ¹ì„ ìˆ˜í–‰í•©ë‹ˆë‹¤.
pod update
ì •ìƒì ìœ¼ë¡œ 설치가 ë˜ë©´ 아래와 ê°™ì€ í´ë” 구조를 확ì¸í•  수 있습니다.

SDK 설치 - Cocoapod 사용하지 ì•Šì„ ê²½ìš°

SDK 파ì¼ì„ https://github.com/WisetrackerTechteam/RW-iOS-SDK ì—서 다운로드 합니다.
ë‹¤ìš´ëœ íŒŒì¼ì„ ì••ì¶• 해제하면 다ìŒê³¼ ê°™ì€ íŒŒì¼ì´ í™•ì¸ ê°€ëŠ¥í•˜ê³  ì´ì¤‘ ì•„ëž˜ì— ì„ íƒëœ 3ê°œì˜ íŒŒì¼ì„ ë¶„ì„ ëŒ€ìƒ ì•± 프로ì íŠ¸ì— ì¶”ê°€í•©ë‹ˆë‹¤.
프로ì íЏ ì„ íƒí›„ 마우스 ìš°í´ë¦­, Add Files to 메뉴를 ì„ íƒí•©ë‹ˆë‹¤.
​
​
앞ì—서 다운로드 받고, ì••ì¶• 해제한 í´ë”ì— ë“¤ì–´ê°€ì„œ 아래와 ê°™ì´ ì¶”ê°€ ëŒ€ìƒ íŒŒì¼ì„ ì„ íƒí•˜ê³ , 화면 아래쪽 ì„¤ì •ì€ ì¡´ìž¬í•˜ëŠ” 모든 targetì— í¬í•¨ë˜ì—ˆëŠ”ì§€ 확ì¸í›„ 추가 하면 ë©ë‹ˆë‹¤.
BuildSetting ì— ì•„ëž˜ì™€ ê°™ì´ ì„¤ì •ì„ ì¶”ê°€í•©ë‹ˆë‹¤.
xcode ê°€ 12.3 ì´í›„ 버전ì´ê³  빌드 과정ì—서 아래와 유사한 오류가 ë°œìƒí•˜ëŠ” 경우가 있으며,
ìœ„ì˜ ê²½ìš°ì—는 아래와 ê°™ì´ ì„¤ì •ì„ í•˜ê³ , 빌드를 하면ë©ë‹ˆë‹¤.
마지막으로, SDK ê°€ Dependencies 로 사용하는 Couchbase-Lite framework 를 ì•„ëž˜ì˜ ì£¼ì†Œì—서 다운로드 합니다. 그리고 위와 ë™ì¼í•œ 방법으로 ëŒ€ìƒ í”„ë¡œì íŠ¸ì— ì¶”ê°€í•˜ì—¬ ì¤ë‹ˆë‹¤. ì•„ëž˜ì˜ íŒŒì¼ì€ 다운로드 편ì˜ë¥¼ 위해서 zip 파ì¼ë¡œ 압축하였습니다. 다운로드 ë°›ì€ íŒŒì¼ì„ ì••ì¶• 해제하시고, CouchbaseLite.xcframework í´ë”를 프로ì íŠ¸ì— framework 로 추가합니다. https://wisetracker-public.s3.ap-northeast-2.amazonaws.com/CouchbaseLite.xcframework.zip​

dotAuthorizationKey 등ë¡

info.plist 파ì¼ì„ Open As Source Code ë°©ì‹ìœ¼ë¡œ 오픈한 후, 아래 코드를 추가합니다.
XML
<key>dotAuthorizationKey</key>
<dict>
<key>serviceNumber</key>
<string>xxxxx</string>
<key>expireDate</key>
<string>14</string>
<key>isDebug</key>
<string>true</string>
<key>isInstallRetention</key>
<string>true</string>
<key>isFingerPrint</key>
<string>true</string>
<key>accessToken</key>
<string></string>
<key>useMode</key>
<string>2</string>
</dict>
추가한 코드 중 serviceNumberì˜ value를 올바른 값으로 변경해야 합니다. 와ì´ì¦ˆíŠ¸ëž˜ì»¤ì— ë¡œê·¸ì¸í•˜ì—¬ 화면 ìƒë‹¨ì˜ Service ë¶€ë¶„ì„ ì„ íƒí•˜ë©´ 앱 ì´ë¦„ê³¼ 함께 올바른 Service Number ê°€ 나타납니다. Service No. ì˜†ì˜ ìˆ«ìžë¥¼ 복사하여 serviceNumberì˜ value로 입력해주세요.

HTTP 통신 허용

httpí†µì‹ ì„ í—ˆìš©í•˜ê¸° 위해 NSAppTransportSecurity 를 아래와 ê°™ì´ ì¶”ê°€í•©ë‹ˆë‹¤.
ì´ì „ê³¼ 마찬가지로 info.plist 파ì¼ì„ Open As Source Code ë°©ì‹ìœ¼ë¡œ 오픈한 후, 아래 코드를 추가합니다.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

초기화

  • 초기화 ë°©ë²•ì€ SceneDelegate ê°€ ì„¤ì •ëœ ê²½ìš°ì™€ 설정ë˜ì§€ ì•Šì€ ê²½ìš°ì— ë”°ë¼ ë‹¬ë¼ì§‘니다.
  • SceneDelegate를 사용하지 않으면 AppDelegateì—서 ì´ˆê¸°í™”ìž‘ì—…ì„ í•˜ê³ , 그렇지 않고 SceneDelegate를 사용하면 SceneDelegateì—서 ì´ ìž‘ì—…ì„ í•´ì•¼ 합니다.

1. iOS13 미만 (SceneDelegate ì—†ìŒ)

AppDelegateì˜ didFinishLaunchingWithOptions í•¨ìˆ˜ì— SDK를 Initialization하기 위한 코드를 다ìŒê³¼ ê°™ì´ ì ìš©í•©ë‹ˆë‹¤. SDKê°€ ì •ìƒì ìœ¼ë¡œ 초기화 ë˜ì—ˆì„ 때 아래와 ê°™ì€ ê¸°ë³¸ ë¶„ì„ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤.
  • 앱 실행 ë° ë°©ë¬¸ìˆ˜, ì¼/주/월순수방문수 등 방문과 ê´€ë ¨ëœ ì§€í‘œ
  • 통신사, 단ë§ê¸°, êµ­ê°€ 등 방문ìžì˜ 단ë§ê¸° 환경으로 부터 ì¶”ì¶œë  ìˆ˜ 있는 지표
Swift
Objective-C
import DOT
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// S: Wisetracker SDK init
DOT.initialization(launchOptions, application: application)
#if DEBUG
DOT.checkDebugMode(true)
#else
DOT.checkDebugMode(false)
#endif
// E: Wisetracker SDK init
}
#import <DOT/DOT.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// S: Wisetracker SDK init
[DOT initialization:launchOptions application:application];
#ifdef DEBUG
[DOT checkDebugMode:true]
#else
[DOT checkDebugMode:false]
#endif
// E: Wisetracker SDK init
}
DOTê°€ 사용ë˜ëŠ” ê³³ì—서는 import DOTì„ í†µí•´ importê°€ 필요합니다. ì´í•˜ ì ìš© 예시ì—서는 import하는 ë¶€ë¶„ì´ ìƒëžµë˜ì–´ 있습니다.

2. iOS13 ì´ìƒ (SceneDelegate 사용)

👉 iOS13 ì´ìƒì´ì–´ë„ SceneDelegate를 사용하지 ì•Šì„ ìˆ˜ë„ ìžˆì–´ìš”, ì´ ë•Œì—는 ìœ„ì˜ SceneDelegate를 사용하지 않는 경우를 참조하세요.

SceneDelegateì˜ sceneDidBecomeActiveí•¨ìˆ˜ì— SDK를 Initialization하기 위한 코드를 다ìŒê³¼ ê°™ì´ ì ìš©í•©ë‹ˆë‹¤. SDKê°€ ì •ìƒì ìœ¼ë¡œ 초기화 ë˜ì—ˆì„ 때 아래와 ê°™ì€ ê¸°ë³¸ ë¶„ì„ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤.
  • 앱 실행 ë° ë°©ë¬¸ìˆ˜, ì¼/주/월순수방문수 등 방문과 ê´€ë ¨ëœ ì§€í‘œ
  • 통신사, 단ë§ê¸°, êµ­ê°€ 등 방문ìžì˜ 단ë§ê¸° 환경으로 부터 ì¶”ì¶œë  ìˆ˜ 있는 지표
Swift
Objective-C
import DOT
​
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
...
func sceneDidBecomeActive(_ scene: UIScene) {
// S: Wisetracker SDK init
DOT.initialization(nil, application: UIApplication.shared)
#if DEBUG
DOT.checkDebugMode(true)
#else
DOT.checkDebugMode(false)
#endif
// E: Wisetracker SDK init
}
...
}
#import <DOT/DOT.h>
​
@implementation SceneDelegate
...
- (void)sceneDidBecomeActive:(UIScene *)scene {
// S: Wisetracker SDK init
[DOT initialization:nil application:[UIApplication sharedApplication]];
#ifdef DEBUG
[DOT checkDebugMode:true]
#else
[DOT checkDebugMode:false]
#endif
// E: Wisetracker SDK init
}
...
@end

Hybrid Appì„ ìœ„í•œ 설정

Hybrid ì•±ì˜ ê²½ìš° 앱 ë‚´ì—서 WebView 를 사용하여 웹 컨í…츠를 서비스 í•˜ê¸°ë„ í•©ë‹ˆë‹¤. ì´ì™€ ê°™ì´ Webview ì— ì˜í•´ì„œ 보여지는 웹 컨í…ì¸ ì˜ ê²½ìš°ì—는 위ì—서 ì„¤ëª…ëœ Native 화면과는 다른 ë°©ì‹ìœ¼ë¡œ ë™ìž‘하기 때문ì—, 별ë„ì˜ ë¶„ì„ ì½”ë“œ ì ìš©ì´ 필요합니다. ë¶„ì„ ëŒ€ìƒ ì•±ì´ ë§Œì•½ Hybrid ì•±ì¸ ê²½ìš°ì—는 ì•„ëž˜ì˜ ì½”ë“œë¥¼ 참고하여 웹 컨í…ì¸ ë„ ë¶„ì„í•  수 있ë„ë¡ ì ìš©ì„ 해야합니다.
앱내ì—서 사용할 WKWebViewì˜ Delegate í•¨ìˆ˜ì— ì•„ëž˜ì™€ ê°™ì´ ë¶„ì„코드를 ì ìš©í•©ë‹ˆë‹¤.
Swift
Objective-C
extension WebViewController: WKUIDelegate, WKNavigationDelegate {
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
DOT.injectSdk(toHtmlDocument: webView, withStartPage: true );
}
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
DOT.injectSdk(toHtmlDocument: webView, withStartPage: false);
}
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
DOT.injectJavascript(withDomSearch: webView, isOnPageFinished: true)
}
​
func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
...
if let url = navigationAction.request.url{
let absoluteString = url.absoluteString
if (absoluteString.hasPrefix("jscall-dot")) {
let request: URLRequest? = navigationAction.request
DOT.setWkWebView(webView, reqeust: request)
decisionHandler(.cancel)
return;
}
...
}
...
}
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation{
[DOT injectSdkToHtmlDocument:webView withStartPage:true];
}
​
- (void)webView:(WKWebView *)webView didCommitNavigation:(null_unspecified WKNavigation *)navigation {
[DOT injectSdkToHtmlDocument:webView withStartPage:false];
}
- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation {
NSLog(@"2. didFinishNavigation");
[DOT injectJavascriptWithDomSearch:webView isOnPageFinished:true];
}
​
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
if([@"jscall-dot" isEqualToString:navigationAction.request.URL.scheme]) {
NSURLRequest *request = navigationAction.request;
decisionHandler(WKNavigationActionPolicyCancel);
[DOT setWkWebView:webView reqeust:request];
return;
​
}
}
모바ì¼ì•±ë‚´ 웹뷰와 PC í˜¹ì€ ëª¨ë°”ì¼ì›¹ë·°ë¡œ ë™ì‹œì— 사용하는 í™”ë©´ì¸ ê²½ìš° 아래와 ê°™ì€ ì›¹í‚·ë·°ë¥¼ í¬í•¨í•œ viewControllerì˜ viewWillApeearì— ì•„ëž˜ì™€ ê°™ì´ ì ìš©í•´ì£¼ì„¸ìš”.
Swift
Objective-C
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
webView.evaluateJavaScript("navigator.userAgent") { (userAgent, error) in
if let ua = userAgent {
self.webView.customUserAgent = ua as! String + " RW2SDK"
}
}
}
-(void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[self webview] evaluateJavaScript:@"navigator.userAgent" completionHandler:^(id _Nullable userAgent, NSError * _Nullable error) {
NSString* addSuffix = [NSString stringWithFormat:@"%@ RW2SDK", userAgent];
if( @available(iOS 9.0,*)){
[self webview].customUserAgent = addSuffix;
}
else{
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:userAgent, @"UserAgent", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
}
}];
}

ì´ë²¤íЏ 설정

​
✅
화면전환 ë˜ëŠ” ì´ë²¤íЏ ë¶„ì„ì„ ìœ„í•œ ì ìš© ë°©ë²•ì€ í”ŒëŸ¬ê·¸ì¸ ì„¤ì • ë° ì´ˆê¸°í™” ì´í›„ì— ì•„ëž˜ ë§í¬ë¥¼ í´ë¦­í•˜ê±°ë‚˜, 좌측 IN-APP EVENT 메뉴를 통해 ê°€ì´ë“œë¥¼ 확ì¸í•˜ì‹¤ 수 있습니다.

2. 고급 설정

고급 설정ì´ëž€ 반드시 ì ìš©í•  필요는 없지만 와ì´ì¦ˆíŠ¸ëž˜ì»¤ì˜ í™•ìž¥ëœ ë¶„ì„ê¸°ëŠ¥ì„ í™œìš©í•˜ê¸° 위해 추가해야 하는 ì„¤ì •ì„ ë§í•©ë‹ˆë‹¤. í•„ìš”ì— ë”°ë¼ ì„ íƒì ìœ¼ë¡œ ì„¤ì •ì„ ì¶”ê°€í•´ì£¼ì‹œê¸° ë°”ëžë‹ˆë‹¤.
유니버셜 ë§í¬ 설정 ê°€ì´ë“œëŠ” 별ë„ì˜ ë¬¸ì„œì— ì •ë¦¬ë˜ì–´ 있습니다.
continueUserActivity ë¶€ë¶„ì— ì•„ëž˜ì™€ ê°™ì´ ì ìš©ì´ ë˜ë©´ 유니버셜 ë§í¬ë¥¼ 통한 ê´‘ê³ ë¶„ì„ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤.
Swift
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
if let uniLink = userActivity.webpageURL?.absoluteString {
DOT.setDeepLink(uniLink)
}
return false;
}

딥ë§í¬ 설정

  • 딥ë§í¬ê°€ ì„¤ì •ëœ url ì„ í†µí•´ì„œ ì˜¤í”ˆëœ ì´ë²¤íŠ¸ë¥¼ ë¶„ì„합니다. ë¶„ì„ì„ í•˜ê¸° 위해서는 ì•±ì— custom url scheme 설정해야 합니다.
​
✔
와ì´ì¦ˆíŠ¸ëž˜ì»¤ 대시보드ì—서 ìƒì„±í•œ 어트리뷰션ë§í¬ë¥¼ 통해 테스트 ë° ê´‘ê³ ì§‘í–‰ì„ ì§„í–‰í•˜ë©°, 딥ë§í¬ í´ë¦­ 시 와ì´ì¦ˆíŠ¸ëž˜ì»¤ 서버가 ì•±ì˜ ì„¤ì¹˜ 여부를 íŒë‹¨í•˜ì—¬ ë™ìž‘합니다. 다ìŒê³¼ ê°™ì€ í˜•íƒœì˜ "https://xxxx.page.link" ë§í¬ë¥¼ í´ë¦­í•˜ê²Œ ë˜ë©´ 해당 URLì´ ê°€ë¥´í‚¤ëŠ” 웹으로 ì´ë™í•¨ìœ¼ë¡œì¨ 와ì´ì¦ˆíŠ¸ëž˜ì»¤ê°€ 수집하여야 하는 광고파ë¼ë¯¸í„°ê°’ì´ ìœ ì‹¤ë  ìˆ˜ 있어, 앱으로 바로 ì´ë™ 가능한 다ìŒê³¼ ê°™ì€ í˜•íƒœì˜ Unique 한 커스텀스키마가 필요합니다.
ì´ë¯¸ 만들어진 유니버셜ë§í¬ê°€ 존재 한다면 와ì´ì¦ˆíŠ¸ëž˜ì»¤ì—서 사용할 딥ë§í¬ ì§„ìž… 스키마 ì„¤ì •ì„ '추가' í•´ 주세요. (딥ë§í¬ìŠ¤í‚¤ë§ˆ 설정 추가시 다른 ë§í¬ì— 어떠한 ì˜í–¥ë„ 주지 않습니다.)
​
위와 ê°™ì´ ì„¤ì •ì„ ë§ˆì¹˜ì‹œê²Œ ë˜ì‹œë©´ 예를들어 다ìŒê³¼ ê°™ í˜•íƒœì˜ ì»¤ìŠ¤í…€ 스키마가 ìƒì„±ë©ë‹ˆë‹¤.

wisetracker://wisetracker.co.kr

여기서 wisetracker:// 부분ì´Scheme(í˜¹ì€ í”„ë¡œí† ì½œ) 입니다. 개발ìžê°€ ì•±ì— ì´ Scheme를 쓸 것ì´ë¼ê³  결정하는 것ì´ë©°, 해당 Schemeë§Œ ì„¤ì •ì„ í•˜ì…”ë„ ë©ë‹ˆë‹¤.
ì´ì–´ì„œ wisetracker.co.kr ë¶€ë¶„ì€ íŠ¹ì • 페ì´ì§€ì— ë„달하ë„ë¡ ë§Œë“¤ê¸° 위한 host(í˜¹ì€ path or ë„ë©”ì¸) 입니다.
그리고 wisetracker://wisetracker.co.kr?product=1 ì´ëŸ¬í•œ 형태로 만드는 경우는 특정 페ì´ì§€ë¡œ ì´ë™í•˜ê¸° 위한 parameter ê°’ì„ ì§€ì •í•˜ëŠ” 것ì´ë©° 해당 ë¶€ë¶„ì€ ì™€ì´ì¦ˆíŠ¸ëž˜ì»¤ì˜ SDKê°€ 아닌 ê³ ê°ì‚¬ì¸¡ì—서 ì§ì ‘ 설정해주셔야 하는 ê°’ì´ë©°, 특정 페ì´ì§€ë¡œ ì´ë™í•  필요가 없다면 parameter ê°’ì€ ê¼­ 설정하지 ì•Šì•„ë„ ë©ë‹ˆë‹¤.

딥ë§í¬ ë¶„ì„

  • ì•±ì´ ì„¤ì¹˜ëœ ì´í›„ DeepLink를 통해서 ì•±ì´ ì‹¤í–‰ë˜ëŠ” 경로 ë¶„ì„ì´ í•„ìš”í•œ 경우 아래와 ê°™ì´ setDeepLink 함수를 사용하면 ë¶„ì„ì´ ê°€ëŠ¥í•©ë‹ˆë‹¤.
Swift
Objective-C
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
DOT.setDeepLink(url.absoluteString)
return true
}
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options {
[DOT setDeepLink:[url absoluteString]];
return YES;
}
​
와ì´ì¦ˆíŠ¸ëž˜ì»¤ SDK를 ì ìš©í•˜ê³ , ê´‘ê³  ë¶„ì„ì„ í•˜ê³ ìž í•˜ëŠ” 경우, 와ì´ì¦ˆíŠ¸ëž˜ì»¤ 시스템ì—서 ë°œê¸‰ëœ ê´‘ê³  ë¶„ì„ ë§í¬ì— ì˜í•´ì„œ ì•±ì„ ì‹¤í–‰í•˜ëŠ” 딥ë§í¬ URLì— ë‹¤ìŒê³¼ ê°™ì´ ê´‘ê³  ë¶„ì„ ëª©ì ì˜ 파ë¼ë¯¸í„°ê°€ ì¶”ê°€ë  ìˆ˜ 있습니다.
특히 ì›¹ì•±ì˜ ê²½ìš° url ì´ë¼ëŠ” 파ë¼ë¯¸í„°ë¥¼ 사용하여 ì›¹ë·°ì— ë¡œë”©ë˜ì–´ì§ˆ 웹페ì´ì§€ urlì„ ì „ë‹¬í•˜ëŠ” 경우가 ë§Žì€ë°, ì´ì™€ 관련하여 ì•„ëž˜ì˜ ì¼€ì´ìФì—ë„ ë¬¸ì œê°€ 없는지 반드시 확ì¸í•˜ì‹œê¸° ë°”ëžë‹ˆë‹¤.
// ê¸°ì¡´ì˜ deeplink ì— ê´‘ê³  ë¶„ì„ íŒŒë¼ë¯¸í„°ê°€ ì¶”ê°€ëœ ì˜ˆì‹œë¥¼ 보여주고 있습니다.
YOUR_SCHEMA://YOUR_HOST?url={YOUR_WEB_PAGE_URL}&trackId=M00200881641977334670
&w_start=h&_wtno=102&_wts=P1641977288745
... 중간 ìƒëžµ ...
&w_end=h
SDKë°ì´í„°ê²€ì¦ ê°€ì´ë“œë¶.pdf
8MB
PDF
딥ë§í¬ 설정 후 테스트시 ê°€ì´ë“œë¶ì„ 참고해 주세요.

Facebook 광고 성과 측정

Facebook 앱ì—서 유입ë˜ëŠ” 설치수를 ë¶„ì„하기 위해서는 Facebookì—서 제공하는 SDKê°€ ë¶„ì„ ëŒ€ìƒ ì•±ì— ì„¤ì¹˜ê°€ ì„ í–‰ë˜ì–´ì•¼ 합니다.

FBSDK 다운로드 방법

1) XCode 프로ì íЏ 파ì¼ì¤‘ Podfile 파ì¼ì— 다ìŒê³¼ ê°™ì´ SDK를 추가합니다
pod 'FacebookSDK'
2) Podfile ì— dependency 를 추가한 ë’¤ì—는 Terminal í”„ë¡œê·¸ëž¨ì„ ì‹¤í–‰í•˜ì—¬ 다ìŒì˜ ëª…ë ¹ì„ ìˆ˜í–‰í•©ë‹ˆë‹¤
cmd> pod install

FBSDK 설치 방법

1) info.plist 파ì¼ì„ source로 보기 로 오픈합니다
2) ì´ë¦„ ì†ì„± ì•„ëž˜ì— í¬í•¨ëœ 내용중 [APP_ID] 와 [APP_NAME] ë¶€ë¶„ì„ Facebook Developer Site ì—서 제공하는 값으로 치환후 info.plist 파ì¼ì— 저장합니다
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array>
<string>fb[APP_ID]</string>
</array>
</dict>
</array>
<key>FacebookAppID</key>
<string>[APP_ID]</string>
<key>FacebookDisplayName</key>
<string>[APP_NAME]</string>

FBSDK 로부터 Install Referrer를 수신하고, SDKì— ì „ë‹¬í•˜ëŠ” 방법

사용ìžê°€ Facebookì— ë…¸ì¶œëœ ê´‘ê³ ë¥¼ í´ë¦­í•˜ê³  ì•±ì„ ì„¤ì¹˜í•œ 경우 ì„¤ì¹˜ëœ ì•±ì—서는 FBSDK를 통해서 AppLinkData를 ìˆ˜ì‹ ë°›ì„ ìˆ˜ 있습니다. ì•„ëž˜ì˜ ì½”ë“œì—서 FBSDK로부터 AppLinkData를 수신 받고, 수신 ë°›ì€ AppLinkData 를 SDK로 전달하는 ë°©ë²•ì„ í™•ì¸í•  수 있습니다. ì´ í•¨ìˆ˜ëŠ” appDelegateì˜ didFinishLaunchingWithOptions í•¨ìˆ˜ì— ì ìš©í•˜ì„¸ìš”. SDK 초기화 API initialization 호출 ì „ì— ì ìš©í•´ì£¼ì„¸ìš”.
Swift
Objective-C
import FBSDKCoreKit
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
AppLinkUtility.fetchDeferredAppLink({ url, error in
if error != nil {
if let anError = error {
print("Received error while fetching deferred app link \(anError)")
}
}
if let unwrappedUrl = url {
DOT.setFacebookreferrerData(unwrappedUrl)
}
})
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[FBSDKAppLinkUtility fetchDeferredAppLink:^(NSURL *url, NSError *error) {
if(error) {
NSLog(@"Received error while fetching deferred app link %@", error);
}
if(url) {
[DOT setFacebookreferrerData:url];
}
}];
}
Facebook SDK와 관련하여 보다 ìžì„¸í•œ 설치 ë°©ë²•ì€ ì•„ëž˜ì˜ ë§í¬ì—서 확ì¸ì´ 가능합니다.

앱 설치 경로 측정

ì•±ì´ ì„¤ì¹˜ëœ ê²½ë¡œë¥¼ ë¶„ì„하는 시ì ì€ 앱 설치 후 ì²˜ìŒ ì‹¤í–‰ë  ë•Œ 설치 경로를 íšë“하게 ë©ë‹ˆë‹¤. ì´ì— 대한 처리는 기본ì ìœ¼ë¡œ 위ì—서 ì„¤ëª…ëœ SDK 필수 ì ìš© ì‚¬í•­ì´ ì ìš©ëœ ìƒíƒœì—서는 ìžë™ìœ¼ë¡œ 처리가 ë˜ê¸° ë•Œë¬¸ì— ë³„ë„ì˜ ë¶„ì„코드 ì ìš©ì´ 필요하지 않습니다. 다만 ì•±ì˜ íŠ¹ë³„í•œ ìƒí™©ì— ì˜í•´ì„œ 앱ì—서 ìˆ˜ì‹ ëœ ì„¤ì¹˜ 경로 정보를 SDKì— ì§ì ‘ ì„¤ì •í•˜ê³ ìž í•˜ëŠ” 경우ì—는 다ìŒì˜ 코드를 사용하세요.
AppDelegate ì •ì˜ í•­ëª©ì¤‘ didFinishLaunchingWithOptions 함수 ì •ì˜ì—서 파ë¼ë¯¸í„°ë¡œ ì „ë‹¬ë°›ì€ launchOptions 로 부터 설치 경로를 ì§ì ‘ íšë“ 후 ìˆ˜ì‹ ëœ ê°’ì„ setInstallReferrer 함수를 사용해서 SDK로 전달할 수 있습니다. 다만 주ì˜í•  ì‚¬í•­ì€ ì•„ëž˜ì™€ ê°™ì´ ì§ì ‘ 앱 설치 경로를 SDKì— ì„¤ì •í•˜ëŠ” 경우 해당 코드가 매 실행 시ì ë§ˆë‹¤ 반복해서 실행ë˜ì§€ 않고 앱 설치 후 최초 1회만 ë™ìž‘하ë„ë¡ ì ìš©ë˜ì–´ì•¼ 합니다. ë˜í•œ ì•„ëž˜ì˜ ì½”ë“œëŠ” 반드시 SDK initialization() 함수 호출 ì´í›„ ì— ì ìš©ë˜ì–´ì•¼ 합니다.
Swift
Objective-C
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
if let referrer = launchOptions?[.url] as? URL {
let _installReferrer:Referrer = Referrer();
_installReferrer.referrer = referrer.absoluteString;
DOT.setInstallReferrer(_installReferrer);
}
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSURL *referrer = [launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
if (referrer){
Referrer *_installReferrer = [Referrer alloc];
_installReferrer.referrer = referrer.absoluteString;
[DOT setInstallReferrer:_installReferrer];
}
}

4. iOS 14 ê°œì¸ì •보방침 변경 관련 ê°€ì´ë“œ

  • iOS 14부터 IDFA를 íšë“하기 위해서는 사용ìžì˜ ë™ì˜ë¥¼ 얻어야 합니다.

3.1 info.plist파ì¼ì— NSUserTrackingUsageDescription 설정 추가

<key>NSUserTrackingUsageDescription</key>
<string>Your data will be used to deliver personalized ads to you.</string>

3.2 App Tracking Transparency ë™ì˜ System Alert 노출 & API 호출

  • IDFA íšë“ì„ ìœ„í•´ 앱 ì¶”ì  íˆ¬ëª…ì„± ë™ì˜ 요청 System Alert(대화 ìƒìž)ì„ ë„워야 합니다. ë™ì˜ 요청 System Alert(대화 ìƒìž) í™”ë©´ì— ë„우려면 requestTrackingAuthorizationWithCompletionHandler:를 호출합니다. completionHandlerì—서 ë™ì˜ 시 SDK API를 호출하ë„ë¡ ìœ„ì™€ ê°™ì´ êµ¬í˜„í•˜ì‹œë©´ ë©ë‹ˆë‹¤.
Swift
Objective-C
import AppTrackingTransparency
import AdSupport
if #available(iOS 14, *) {
ATTrackingManager.requestTrackingAuthorization { (AuthorizationStatus) in
if(AuthorizationStatus == .authorized) {
DOT.setIDFA(ASIdentifierManager.shared().advertisingIdentifier.uuidString)
}
}
} else {
DOT.setATTAuthorizationStatus(3)
}
#import <AppTrackingTransparency/ATTrackingManager.h>
#import <AdSupport/AdSupport.h>
if (@available(iOS 14, *)) {
[ATTrackingManager requestTrackingAuthorizationWithCompletionHandler:^(ATTrackingManagerAuthorizationStatus status) {
if(status == ATTrackingManagerAuthorizationStatusAuthorized) {
[DOT setIDFA:[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString]];
}
}];
} else {
[DOT setATTAuthorizationStatus:3];
}
​