SDK 삽입

1. 필수 설정

SDK 설치

Cocoapod 환경에서 SDK 다운로드 방법

XCode 프로젝트 파일중 Podfile 파일에 다음과 같이 SDK를 추가합니다
pod 'RW'
기존에 SDK를 한번 설치한 경우에는 설치할SDK 버전을 표시해야 하는 경우도 있습니다. 아래와 같이 설치할 SDK버전을 명시적으로 표시하면 됩니다.
pod 'RW', '~> 1.1.29'
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를 사용하지 않는 경우를 참조하세요.

SceneDelegatesceneDidBecomeActive함수에 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
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
...
if (webView.isLoading) {
return;
}
DOT.setJavascriptInjectionIn(webView)
...
}
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 didFinishNavigation:(WKNavigation *)navigation {
if(webView.isLoading) {
return;
}
[DOT setJavascriptInjectionInWkWebView:webView];
}
- (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

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];
}
Copy link
Outline
1. 필수 설정
SDK 설치
SDK 설치 - Cocoapod 사용하지 않을 경우
dotAuthorizationKey 등록
HTTP 통신 허용
초기화
Hybrid App을 위한 설정
이벤트 설정
2. 고급 설정
Universal Link 설정
딥링크 설정
wisetracker://wisetracker.co.kr
딥링크 예외 처리
Facebook 광고 성과 측정
앱 설치 경로 측정
4. iOS 14 개인정보방침 변경 관련 가이드
3.1 info.plist파일에 NSUserTrackingUsageDescription 설정 추가
3.2 App Tracking Transparency 동의 System Alert 노출 & API 호출