iOS SDK 가이드 (Swift)

UserHabit을 시작하기 위해 SDK 적용이 필요합니다.
iOS 앱에 UserHabit SDK를 적용하려면 아래 설명을 참고해주세요.

1. SDK 적용하기

1) iOS project에 UserHabit SDK 적용하기

개발환경에 맞게 아래 탭을 선택하여 적용하세요. SDK 업데이트 히스토리

1. 아래 링크에서 iOS용 UserHabit SDK를 다운로드 합니다.

2. 아래의 예시와 같이 관련 Frameworks(UserHabit, CFNetwork, MobileCoreService, libz)들을 iOS 프로젝트 Linked Frameworks and Libraries 에 추가합니다.

Sdk guide ios


3. 해당 파일의 local 경로를 Project/Build Setting/Framework Search Paths 에 추가합니다.

Podfile에 pod 'Userhabit'을 추가하고 pod install을 실행해주세요.

해당 파일의 local 경로를 Project/Build Setting/Framework Search Paths 에 추가합니다.


1-1) 브리지 헤더 추가하기

Swift의 경우, Objective-C의 코드를 읽기 위한 브리지 헤더(Bridging Header)의 추가 작업이 필요합니다. 이미 사용중이시면 프레임워크를 import하는 코드만 추가하시면 됩니다.
추후 업데이트를 통해 브리지 헤더를 사용하지 않아도 빌드 되도록 개선할 예정입니다.

아래의 순서로 브리지 헤더를 추가하고 프로젝트에 설정합니다.

1. 프로젝트에 $(PROJECT_NAME)-Bridging-Header.h파일을 추가합니다.

2. Xcode의 Navigator >> TARGETS >> Build Settings >> "Objective-C Bridging Header"에 1에서 만든 파일명으로 브리지 헤더 설정 $(PROJECT_NAME)/$(PROJECT_NAME)-Bridging-Header.h을 추가합니다.

Sdk guide bridging header

3. 1에서 만든 ${Project Name}-Bridging-Header.h 파일에 import UserHabit을 추가해 UserHabit framework를 import 해주세요.

Sdk guide bridging header2

4. 문제없이 빌드 되는지 확인

2) API KEY 입력 및 화면 추적하기

정확한 데이터 수집을 위해 iOS SDK 연동 방식을 두 가지로 제공합니다.

참고! iOS SDK 1.0.3 이하를 사용 하셨던 기존 고객사의 경우 2-2) 화면 추적 자동화 하기 항목을 참고하시기 바랍니다.

2-1) 원하는 화면에 정확히 추적 코드 심기

1. 로그인 후 UserHabit 콘솔에서 앱을 등록하고 개발자 API KEY 와 제품 API KEY 를 발급 받습니다.
2. AppDelegate 파일에서 아래의 부분에 알맞은 API KEY 를 입력하여 코드를 삽입합니다. Window가 할당된 이후에 코드가 삽입되어야 정상적으로 인터렉션 수집이 가능합니다.

import UIKit
import UserHabit


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        // withAutoTracking:false를 입력합니다.
        UserHabit.sharedInstance().sessionStart("Your API-Key", withAutoTracking:false)
        return true
    }
    ...
}

3. 화면이 시작되는 시점에 setScreen() 메소드를 입력해 수집하고자 하는 화면을 정의 합니다.

// viewWillAppear()를 override한 후 setScreen()을 사용합니다.
override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    UserHabit.sharedInstance().setScreen(self, withName: "ScreenName")
}
2-2) 화면 추적 자동화 하기

자동 추적 방식은 모든 화면을 자동으로 수집할 수 있습니다.

주의 단, Wrapper class와 같은 구조적 특성상 화면이 중복으로 수집되어 데이터가 분산되는 경우가 발생하므로 자동 추적 방식을 사용할 경우 Test 모드에서 충분한 확인을 통해 의미 없는 화면을 제거 하시기를 권장합니다.

1. 로그인 후 UserHabit 콘솔에서 앱을 등록하고 개발자 API KEY 와 제품 API KEY 를 발급 받습니다.
2. AppDelegate 파일에서 아래의 부분에 알맞은 API KEY 를 입력하여 코드를 삽입합니다.

import UIKit
import UserHabit


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

        // withAutoTracking:true를 입력합니다.
        UserHabit.sharedInstance().sessionStart("Your API-Key", withAutoTracking:true)
        return true
    }
    ...
  }

3. SessionStart 직후 excludeClasses 메소드를 사용하여 중복되는 화면을 제거합니다.
예를 들어 UINavigationController 혹은 UITabBarController등과 같이 UIViewController를 상속 받으면서 화면으로서 전혀 의미 없는 화면들은 분석 화면에서 제외합니다.

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // withAutoTracking:true를 입력합니다.
    UserHabit.sharedInstance().sessionStart("Your API-Key", withAutoTracking:true)

    var excluding = [String]()
    excluding.append("CustomNavigationController")
    excluding.append("TabBarController")

    UserHabit.sharedInstance().excludeClasses(excluding)
    return true
}

2. 추가 화면 구성하기

사용자 정의에 따라서 하나의 UIViewController 에서 추가적인 화면 정의가 가능합니다.
UIAlert가 나오거나 UICollectionView에서 셀의 이동에 따라 화면을 정의할 수 있습니다.

{
    ...
    UserHabit.sharedInstance().setScreen(self, withName: "CustomScreen")
    ...
}

3. 화면 정보 취득 시점 변경하기

UserHabit 서비스는 화면이 그려지는 시점에서 1초 뒤에 화면 정보와 함께 스크린샷을 수집하게 됩니다. (오브젝트 역시 동일합니다.) 그래서 일부 네트워크를 통해서 들어오는 데이터에 따라 화면이 늦게 그려지는 경우가 있습니다.
이러한 경우를 위해서 사용자가 원하는 시점에 takeScreenShot 메소드를 통해서 화면 정보를 취득하게 됩니다.

func dataLoaded(){
     // 정확한 스크린샷 취득을 위해 모든 UI가 로드된 후 사용하시길 권장합니다.
     // viewWillAppear에 setScreen 메소드를 사용하셨다면 이 메소드를 사용하는 것을 권장합니다.
    UserHabit.sharedInstance().takeScreenShot(self)
}

4. 세션 종료 시간 설정하기

사용자가 앱을 백그라운드로 넘긴 후에 일정시간이 흐르거나 앱을 메모리에서 제거할 경우 '앱종료'로 판단하고 하나의 세션으로 정의합니다.
앱을 백그라운드로 넘긴 후 앱종료까지의 시간은 기본적으로 10초로 지정되어 있습니다. 앱종료 시간을 변경하고 싶으시면 아래와 같이 수정해주세요.

import UIKit
import UserHabit


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        UserHabit.sharedInstance().sessionStart("Your API-Key")
        UserHabit.sharedInstance().setSessionDelayTime(15.0) 
        self.window!.makeKeyAndVisible()
        return true
    }
    ...
}

5. 사용자 터치 수집 제외하기

보안 등의 이유로 사용자의 터치 정보 수집을 원하지 않는 경우를 위해 해당기능을 제공합니다.
수집을 하고 싶지 않은 뷰를 지정하여 사용자가 해당 영역을 터치 할 경우 자세한 터치 정보를 수집하지 않습니다.
아래와 같이 View를 지정하시면 됩니다


override func viewWillAppear(_ animated: Bool){

  super.viewWillAppear(animated)
  UserHabit.sharedInstance().addSecretView(self.view);

}

6. 디바이스 구분자 랜덤 생성 기능

유저해빗에서는 각각의 디바이스를 구분하기 위하여 iOS에서 제공하는 identifierForVendor(UUID) 값을 사용합니다.
해당 identifierForVendor(UUID) 사용에 관하여 정책에 따라 해당 값을 수집하지 않기 위해서 아래와 같은 메소드를 통해서 임의로 지정된 값으로 대체 가능합니다.

import UIKit
import UserHabit


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        // Override point for customization after application launch.
        UserHabit.sharedInstance().enableDeviceRandomID()
        UserHabit.sharedInstance().sessionStart("Your API-Key")
        self.window!.makeKeyAndVisible()
        return true
    }
    ...
}

유의사항
해당 메소드는 반드시, UserHabit.sharedInstance().sessionStart("Your API-Key", withAutoTracking:false) 메소드 이전에 실행하셔야 적용됩니다. 기존 디바이스 아이디를 수집한 상태에서 해당 메소드를 적용할 경우 이전 디바이스와 매칭이 되지 않는 점 유의하세요.
(이로 인해, Unique User Count의 정보가 부정확해질 수 있습니다.)

Warning!

xib를 사용하지 않는 경우
UserHabit.sessionStart("Your API-Key"); 메소드는 self.window를 alloc 하신 후에 삽입 하셔야 합니다.

7. 수동 세션 종료

앱이 백그라운드로 들어가고 일정 시간이 지나기 전에 바로 앱을 종료하는 경우 데이터를 처리할 수가 없습니다. 이 때, 세션을 정상적으로 처리하기 위해 -sessionCloseWithUploadData:complatehandler:을 사용해 수동으로 세션을 종료해야만 합니다.
세션을 종료할 때 uploadData 파라미터 세션을 이용해 데이터를 서버로 전송하고 종료할 것인지 선택할 수 있습니다. 서버에 전송하지 않고 종료할 경우, 다음 세션이 시작될 때 데이터를 보냅니다.

UserHabit.sharedInstance().sessionClose(withUploadData: true) {
            print("force exit")
            exit(0);
}

8. 오브젝트 아이디 설정

화면에 수집되는 오브젝트 아이디를 수동으로 지정하거나 자동으로 생성합니다. 아이디 생성의 우선 순위는 다음과 같습니다.

우선 순위
설명
결과물
1. paccessibilityIdentifier를 설정한 경우
애플에서 제공하는 오브젝트의 유니크한 키값을 지정할 수 있습니다. 해당 값이 그대로 오브젝트 아이디로 사용됩니다.
[애플 가이드 문서]
TestObjectId
2. 오브젝트에 이벤트가 설정된 경우
1번에 해당 하지 않는 경우 오브젝트의 Target을 이용해 아이디가 생성됩니다.
[UIViewController::target(layerIndex)]
FirstViewController::backButtonAction(4)
3. 오브젝트에 이벤트가 설정되지 않은 경우
1번과 2번에 모두 해당하지 않는 경우 오브젝트의 클래스 명을 이용해 아이디가 생성됩니다.
[UIViewController::NSObject(layerIndex)]
FirstViewController::UIButton(4)


더 궁금한 사항은 help@userhabit.io으로 연락해주시면 신속히 답변해드리겠습니다.