iOS SDK 가이드 (Objective-C)

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

1. SDK 적용하기

1) 라이브러리 추가하기

개발환경에 맞게 아래 탭을 선택하여 적용하세요. 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 에 추가합니다.


2) 소스 코드 추가하기

서비스 사용을 위해 권한, API KEY 등록, 서비스 등록이 필요합니다.
(로그인 후 UserHabit 콘솔에서 앱을 등록하면 API KEY를 발급 받을 수 있습니다.)

1. 로그인 후 UserHabit 콘솔에서 앱을 등록하고 개발자 API KEY와 제품 API KEY를 발급 받습니다.

2. AppDelegate 파일에서 아래의 부분에 알맞은 API KEY 를 입력하여 코드를 삽입합니다. Window가 할당된 이후에 코드가 삽입되어야 정상적인 액션 수집이 가능합니다.

#import <UserHabit/UserHabit.h>

@interface AppDelegate ()
@end
@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  [UserHabit SessionStart:@"YOUR-API-KEY" withAutoTracking:true];
  return YES;
}

2. 추가 화면 구성하기

1) 사용자 정의를 통해 추가 화면 정의하기

ViewController 내에서 다양한 화면 구성을 통해 하나 이상의 화면을 표현하는 경우가 있습니다.
이 경우, 화면이 변경될 때마다 아래 메소드를 호출하시면 각각의 화면으로 분류하여 분석합니다.

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [UserHabit setScreen:self withName:@"ScreenName"];

  }
2) 특정 화면 제외하기

setScreen 을 사용하여 화면을 분류해 분석하는 경우, ViewController가 사실상 화면으로서의 가치가 없어지는 경우가 발생합니다. 이 경우, 해당 ViewController가 자동으로 화면으로 정의되지 않도록 다음과 같이 추가합니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [UserHabit SessionStart:@"YOUR-API-KEY" withAutoTracking:YES];

    NSArray *excluding = @[@"CustomNavigationController”, 
                           @“TabBarController”, 
                           @“UserhabitViewController"];

    [UserHabit excludeClasses:excluding];
    return YES;
}
3) 자동 수집 해제하기

모든 ViewController에서 자동으로 화면을 인식하고 싶지 않다면 아래 기능을 활용합니다.
(이 때, 모든 화면을 setScreen으로 직접 정의하셔야 합니다.)

#import <UserHabit/UserHabit.h>

@interface AppDelegate ()
@end
@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [UserHabit SessionStart:@"YOUR-API-KEY" withAutoTracking:true];
    return YES;
}
4) UIAlert 화면 추적하기

UIAlert으로 정의한 화면에 대해서도 추적이 가능합니다.
아래와 같이 UIAlert 호출 한 다음, 함수를 호출하여 사용합니다.

- (IBAction)testAlertButtonAction:(UIButton *)sender {

    UIAlertController* alert = [UIAlertController alertControllerWithTitle:@"My Alert"
                                   message:@"This is an alert."
                                   preferredStyle:UIAlertControllerStyleAlert];
    UIAlertAction* defaultAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault
   handler:^(UIAlertAction * action) {}];
    [alert addAction:defaultAction];
    [self presentViewController:alert animated:YES completion:nil];
    [UserHabit setScreen:self withName:@“UserHabit Alert"];
}

3. 스크롤 데이터 추적하기

iOS에서 제공하는 ScrollView와 TableView에 대해서 스크롤 분석이 가능합니다.
아래 예시코드와 같이 해당하는 뷰를 등록하면 됩니다. (한 화면당 하나의 스크롤만 분석이 가능합니다.)
또한, 스크롤 분석에 필요한 스크린샷은 반드시 직접 수집해야 합니다.

1) 스크롤 스크린샷 취득하기

스크롤 스크린샷을 취득하기 위해서는 8. 스크린샷 취득하기에서 2)수동 스크린샷 수집 모드 활용 기능을 활용해야 합니다.

1. 먼저, 수동 스크린샷 수집 모드를 활성화 합니다.

2. 스크롤 화면에서 스크롤 화면 수집 버튼을 누르면 자동으로 스크린샷을 수집합니다.
(최대 1분의 시간이 소요되며, 스크린샷이 수집되는 동안 앱을 터치할 수 없습니다. 전원 버튼을 누르거나 앱을 종료하지 마세요. 동작이 완료되면 다시 앱이 활성화 됩니다.)

주의 디바이스 해상도 width가 750px이 아닌 경우, 일부 데이터가 부정확하게 보일 수 있습니다.

2) 스크롤 추적을 위한 코드 적용
-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [UserHabit addScrollView:@“scroll view" scrollView:mainTableView rootViewController:self];
}

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

유저해빗에서는 앱이 백그라운드로 넘어간 이후 특정 시간동안 앱을 활성화하지 않을 경우 세션을 종료합니다.
(세션에 대한 정의는 용어집에서 확인하세요.)
기본 세션 종료시간은 10초로 설정되어 있습니다. 해당값은 아래와 같은 방법으로 수정이 가능합니다.

#import <UserHabit/UserHabit.h>
@implementation AppDelegate
    - (BOOL)application:(UIApplication *)application
        didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
    [UserHabit SessionStart:@"YOUR-API-KEY"];
    [UserHabit setSessionDelayTime:15.0f];
    return YES;
}

5. 웹뷰 오브젝트 추적하기 - BETA

아래와 같이 코드를 적용하시면, 웹뷰 내에서 오브젝트를 터치할 경우 해당 오브젝트의 정보가 수집됩니다.

- (void)viewDidAppear {
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
    [webView loadRequest:request];
    [UserHabit addWebView:webView];
 }

웹뷰의 오브젝트 이미지는 8. 수동 스크린샷 수집 모드 활용2)수동 스크린샷 수집 기능을 통해서만 수집할 수 있습니다.

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

보안상의 이유로 특정 뷰 영역에 대한 터치를 수집하고 싶지 않다면 아래와 같이 등록하세요.

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [UserHabit addSecretView:self.view];
}

7. 디버그 모드 활성화 하기

디버그 모드를 활성화 하면 유저해빗 수집 과정에 대한 로그 및 스크린샷 수집 모드를 활용하실 수 있습니다.
(스크린샷 수집 모드는 현재 베타 서비스 중이며, Production 모드에서는 활성화되지 않습니다. 자세한 내용은 8. 스크린샷 취득하기에서 2) 수동 스크린샷 수집 모드 활용을 확인하세요.)

#import <UserHabit/UserHabit.h>

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [UserHabit SessionStart:@"YOUR-API-KEY" withAutoTracking:true];
    [UserHabit setDebug:YES];
    return YES;
}

8. 스크린샷 취득하기

UserHabit에서는 화면을 인식하기 위해 스크린샷을 Test 모드에서 실행된 앱에서 직접 취득합니다. 앱을 실행하면 화면이 로드된 후 약 1초 내 스크린샷 정보를 자동으로 취득합니다. 하지만, 네트워크를 통한 데이터 처리시 등 일부 화면이 다 출력되기 전에 해당 기능이 동작해 스크린샷이 제대로 수집되지 않는 경우가 있습니다.
이러한 경우를 대비해 아래 2가지의 스크린샷 수집 방법을 추가로 제공하고 있습니다. (화면 해상도가 다른 일부 기기에서는 스크린샷 수집이 제한적일 수 있습니다.)

1) 코드를 통한 수집

화면 출력이 완료되는 시점에 해당 함수를 적용해주세요. 함수가 호출되는 순간에 스크린샷이 수집됩니다.
(스크린샷 수집은 Test 모드에서만 유효하며 한 세션당 한 번의 함수 호출만이 유효합니다.)


-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    [UserHabit takeScreenShot:self];
}
2) 수동 스린샷 수집 모드 활용 - BETA

7. 디버그 모드 활성화 하기 함수를 활성하고 회전잠금을 풀어주세요.
앱이 실행된 기기를 후면 카메라가 보이도록 뒤집고 1초 뒤에 다시 화면이 보이도록 뒤집으면 스크린샷 수집을 위한 화면이 표시됩니다.

Screen help 01

위의 이미지와 같이 정상적으로 실행이 되면 앱 화면에 + 버튼이 나옵니다.

  • 화면 수집 관련 도움 뷰 : '정보 off' 버튼을 클릭하면 상단에 현재 화면 명칭과 스크린샷 수집 현황 정보가 출력됩니다.
  • 일반 화면 수집 : 현재 화면의 스크린샷을 수집합니다.
  • 스크롤 화면 수집 : 해당 화면에 스크롤이 등록되어 있는 경우 활성화 되며, 스크롤에 해당하는 스크린샷을 수집합니다.

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

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

#import <UserHabit/UserHabit.h>

@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    [UserHabit enableDeviceRandomID];
    [UserHabit SessionStart:@"YOUR-API-KEY"];

    return YES;
}

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

Warning!

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

10. 수동 세션 종료

세션을 종료할 때 uploadData 파라미터 세션을 이용해 데이터를 서버로 전송하고 종료할 것인지 선택할 수 있습니다. 서버에 전송하지 않고 종료할 경우, 다음 세션이 시작될 때 데이터를 보냅니다.

[UserHabit sessionCloseWithUploadData:YES complateHandler:^{
        NSLog(@"force exit");
        exit(0);
}];

11. 오브젝트 아이디 설정

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

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


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