안드로이드 SDK 가이드

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

Android app에 적용하기 위해 아래와 같은 사양이 필요합니다.
  • API level 9 이상
  • Android support library v4 22.2이상

1. SDK 적용하기

1) Android에 UserHabit SDK 적용하기

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

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

2. 해당 jar파일을 안드로이드 프로젝트 폴더 밑 libs 추가합니다. (app/libs/)

3. 해당 파일을 Java Build Path에 추가합니다.

app/build.gradle 에 적용하세요.
아래 소스와 같이 maven주소와 SDK를 추가합니다.

repositories {
  maven { url 'https://repo.userhabit.io/content/groups/public'}
}

android {
  compileSdkVersion 23
  buildToolsVersion "23.0.1"

  defaultConfig {
      applicationId "io.userhabit.myapplication.app"
      minSdkVersion 9
      targetSdkVersion 23
      versionCode 1
      versionName "1.0"
  }

  buildTypes {
      release {
          minifyEnabled false
          proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
      }
  }
}

dependencies {
  compile fileTree(dir: 'libs', include: ['*.jar'])
  compile 'com.android.support:appcompat-v7:23.1.1'
  compile 'io.userhabit.service:userhabitsdk:1.0.15'

}
2) 앱 권한 추가하기

UserHabit 서비스에서는 아래와 같은 권한이 필요합니다.
AndroidManifest.xml 에 해당 권한을 추가하세요

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="io.userhabit.myapplication2.app" >

  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

  <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
      <activity
          android:name=".MainActivity"
          android:label="@string/app_name" >
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />

              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
      </activity>

      <meta-data android:name="userhabitApiKey" android:value="API KEY" />
      <service android:name="io.userhabit.service.main.service.UserhabitService" />
      
  </application>

</manifest>
3) API Key 입력하기

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

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="io.userhabit.myapplication2.app" >

  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

  
  <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
      <activity
          android:name=".MainActivity"
          android:label="@string/app_name" >
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />

              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
      </activity>
      <meta-data android:name="userhabitApiKey" android:value="API KEY"/> 

      <service android:name="io.userhabit.service.main.service.UserhabitService" />

      
  </application>

</manifest>
4) 서비스 등록하기

UserHabit에서는 데이터 전송을 위해서 서비스 기능을 활용합니다.
AndroidManifest.xml 파일에서 아래의 부분에 다음의 코드를 삽입하세요.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="io.userhabit.myapplication2.app" >

  <uses-permission android:name="android.permission.INTERNET"/>
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

  
  <application
      android:allowBackup="true"
      android:icon="@mipmap/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >
      <activity
          android:name=".MainActivity"
          android:label="@string/app_name" >
          <intent-filter>
              <action android:name="android.intent.action.MAIN" />

              <category android:name="android.intent.category.LAUNCHER" />
          </intent-filter>
      </activity>

      <meta-data android:name="userhabitApiKey" android:value="API KEY"/>
      
      <service android:name="io.userhabit.service.main.service.UserhabitService"/>


  </application>

</manifest>
5) 안드로이드 소스코드 수정하기

앱이 처음 시작하는 Activity에 아래와 같이 코드를 삽입하세요.

1. API 14이상
package io.userhabit.myapplication2.app;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import io.userhabit.service.Userhabit;

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      Userhabit.start(this);
  }

}

2. API 9이상

API 14 이하 버전에 안드로이드 기기를 모두 추적할 경우 모든 Activity의 OnStart와 OnStop에 Userhabit.activityStart(), Userhabit.activityStop()을 각각 입력하시면 됩니다.

package io.userhabit.myapplication2.app;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import io.userhabit.service.Userhabit;
import io.userhabit.service.main.service.UserhabitService;

public class MainActivity extends AppCompatActivity {


  @Override
  protected void onStart() {
      super.onStart();
      Userhabit.activityStart(this);
  }

  @Override
  protected void onStop() {
      super.onStop();
      Userhabit.activityStop(this);

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
  }
}

2. 추가 화면 구성하기

기본적으로 UserHabit 서비스는 Activity를 하나의 화면으로 정의합니다.
하지만 상황에 따라서 추가적으로 하나의 Activity를 더 많은 화면 단위로 정의하여 분석하는 경우가 발생합니다.

1) ViewPager로 구성된 화면 분석하기

하나의 Activity를 ViewPager를 통하여 여러 화면을 구성할 경우 이를 위한 별도의 함수를 제공하고 있습니다.

public class MainActivity extends AppCompatActivity {

  private ViewPager mViewPager;
  private MyPagerAdapter mAdpater;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      mViewPager = (ViewPager) findViewById(R.id.vpPager);
      mAdpater = new MyPagerAdapter(getSupportFragmentManager());
      mViewPager.setAdapter(mAdpater);
      Userhabit.setViewPager(mViewPager);
  } 
…
2) 사용자 정의를 통하여 추가 화면 정의하기

사용자 정의에 따라서 하나의 Activity 안에서 추가적으로 화면 정의가 가능합니다.
새롭게 정의 하려는 화면이 실제 기기 화면에 노출되는 시점에 아래 함수를 입력하세요.

public class MainActivity extends AppCompatActivity {

  private ViewPager mViewPager;
  private MyPagerAdapter mAdpater;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      Button btn = findViewById(R.id.button);
      btn.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              TestFragment signIn = new TestFragment();
              signIn.show(getSupportFragmentManager(), "");
              Userhabit.setScreen(this, "테스트 화면");
          }
      });


  }
…

* 추가 화면을 정의를 할 경우 해당 Activity에 종속되어 화면을 구분하게 됩니다.
예를들어, A-Activity에서 Userhabit.setScreen(this, "테스트 화면");와 같이 지정하고 B-Activity에서 Userhabit.setScreen(this, "테스트 화면");와 같이 지정하게 되면 해당 사용자 정의 화면은 다른 화면으로 구분하게 됩니다.
만약 이를 같은 화면으로 정의하고 싶은 경우 Userhabit.setScreen(this, "테스트 화면", true); 와 같이 마지막 요소에 true 값을 지정해주시면 Activity와 상관없이 동일한 화면으로 인식하게 됩니다.

3) 다이얼로그 추가화면 정의하기

Android에서 제공하는 Dialog 객체로 구현된 다이얼로그 화면에 대하여 정의가 가능합니다.
아래와 같이 show(); 함수 호출 이후에 아래 함수를 입력하세요.

public void setDialog() {
    Dialog dialog = new Dialog(this);
    dialog.show();

    Userhabit.setScreen(dialog, "다이얼로그_화면");
  }

'첫번째_다이얼로그’ 라는 이름으로 해당 dialog를 화면으로 수집하고 싶으시다면 아래와 같이 입력하시면 됩니다.
Userhabit.setScreen(dialog, "첫번째_다이얼로그”);


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

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

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      server.getNetworkData(mNoticeListener);
  }

  OnResponseListener mNoticeListener = new OnResponseListener() {
      @Override
      public void onSuccessed(int statusCode, JSONObject response) {
          //데이터 처리
          Userhabit.takeScreenshot();
      }
  };

}
…

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

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

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      Userhabit.start(this);
      Userhabit.setSessionEndTime(10);
  }

}
…

5.동적으로 API KEY 입력하기

기본적으로 UserHabit의 API 키는 AndroidManifest.xml 에 기록된 API 키를 기준으로 최초 실행될때 지정하게 됩니다.
이러한 키를 AndroidManifest.xml이 아닌 코드상으로 정의하고 싶은 경우 해당 함수를 통하여 입력하시면 됩니다.

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      Userhabit.start(this, "API KEY");
  }

}
…

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

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

@Override
public void onStart() {
   // TODO Auto-generated method stub
   super.onStart();
   Userhabit.addSecretView(button1);
}

7. 유입 경로 추적하기

텐핑 서비스를 활용하고 계실 경우 유저해빗을 통해 어뷰징을 막을 수 있는 장점이 있습니다.
단, 아래와 같이 추가적인 작업이 필요합니다.
(안드로이드에서는 하나의 앱에서 하나의 리시버만 설정할 수 있습니다.)

1) 유저해빗 인스톨 리시버를 한 개만 활용할 경우

AndroidManifest.xml 파일에 다음과 같이 입력합니다.

<receiver
   android:name="io.userhabit.service.main.UserhabitInstallReceiver"
   android:exported="true">
 <intent-filter>
   <action android:name="com.android.vending.INSTALL_REFERRER" />
 </intent-filter>
</receiver>
2) 인스톨 리시버를 두 개 이상 활용할 경우

하나의 리시버를 직접 구현하고 해당 리시버에서 다른 리시버들을 호출 합니다. 아래와 같이 하나의 인스톨 리시버를 생성합니다.

public class MultiInstallReceiver extends BroadcastReceiver {
   @Override
   public void onReceiver(Context context, Intent intent) {
    UserhabitInstallReceiver userhabitReceiver = new UserhabitInstallReceiver();
    userhabitReceiver.onReceive(context, intent);
    
    //다른 서비스의 리시버들을 동일한 방식으로 호출합니다.
   }
}

위와 같이 작성한 리시버를 AndroidManifext.xml 에 등록합니다.

 <receiver
       android:name="com.yourpackage.MultiInstallReceiver"
       android:exported="true">
    <intent-filter>
        <action android:name="com.android.vending.INSTALL_REFERRER" />
    </intent-filter>
 </receiver>
3) 인스톨 리시버 확인 방법

인스톨 리시버로부터 오는 데이터일 경우 실제 플레이스토어에서 설치 시에 데이터를 넘겨주기 때문에 테스트에 어려움이 있습니다. adb shell을 이용하여 인스톨 리시버를 호출하여 설정이 올바르게 되었는지 테스트합니다.

1. 먼저 안드로이드 기기를 PC와 연결 하고, adb 실행 파일을 찾습니다.

2. adb 파일은 안드로이드가 설치되어 있는 경로 안에 있습니다.
안드로이드 설치 경로를 기준으로 platform-tools 디렉토리 안에 adb 파일이 있습니다.

Android/sdk/platform-tools

3. adb shell을 실행합니다.

#)adb shell

4. 앱을 실행한 상태에서 알맞은 패키지명과 인스톨 리시버클래스 경로를 입력합니다.

am broadcast -a com.android.vending.INSTALL_REFERRER 
  -n <패키지명>/<인스톨 리시버 클래스 경로> --es "referrer" "Parameter"

ex) 유저해빗 리시버를 이용할 경우

am broadcast -a com.android.vending.INSTALL_REFERRER 
  -n <패키지명>/io.userhabit.service.main.UserhabitInstallReceiver --es "referrer" "Parameter"

ex) 여러개 리시버를 사용하기 위해서 별도의 인스톨 리시버를 만든 경우

am broadcast -a com.android.vending.INSTALL_REFERRER 
  -n <패키지명>/<직접 생성한 인스톨 리시버 클래스> --es "referrer" "Parameter"


올바르게 설정 되었다면 해당 명령어를 입력한 다음 안드로이드 로그 창에
태그명이 "UserhabitLog""referrer : Parameter" 와 같이 입력한 값이 출력됩니다.


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

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

package io.userhabit.myapplication2.app;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import io.userhabit.service.Userhabit;

public class MainActivity extends AppCompatActivity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
       Userhabit.enableDeviceRandomID();
       Userhabit.start(this);
  }

}
유의사항
해당 함수는 반드시, Userhabit.start(this); 함수 이전에 실행하셔야 적용됩니다.
기존 디바이스 아이디를 수집한 상태에서 해당 함수를 적용할 경우 이전 디바이스와 매칭이 되지 않는 점 유의하세요.
(이로 인해, Unique User Count의 정보가 부정확해질 수 있습니다.)

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

iOS SDK 가이드

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

언어 선택: Objective-C Swift


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에서 만든 파일명으로 브리지 헤더 설정을 추가합니다.

Sdk guide bridging header

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

Sdk guide bridging header2

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

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

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

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

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

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

#import "AppDelegate.h"
#import <UserHabit/UserHabit.h>

@interface AppDelegate ()
@end
@implementation AppDelegate

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

    // withAutoTracking:No를 입력합니다.
    [[UserHabit sharedInstance]SessionStart:@"Your API-KEY" withAutoTracking:NO];
    return YES;
}
import UIKit

@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()을 사용합니다.
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[UserHabit sharedInstance]setScreen:self withName:@"ScreenName"];
}
// viewWillAppear()를 override한 후 setScreen()을 사용합니다.
override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    UserHabit.sharedInstance().setScreen(self, withName: "ScreenName")
}
2-2) 화면 추적 자동화 하기

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

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

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

#import "AppDelegate.h"
#import <UserHabit/UserHabit.h>

@interface AppDelegate ()
@end
@implementation AppDelegate

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

    // withAutoTracking:YES를 입력합니다.
    [[UserHabit sharedInstance]SessionStart:@"Your API-Key" withAutoTracking:YES];
    return YES;
}
import UIKit

@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() 함수를 사용하여 중복되는 화면을 제거합니다.
예를 들어 CustomNavigationController 혹은 TabBarController등과 같이 UIViewController를 상속 받으면서 화면으로서 전혀 의미 없는 화면들은 분석 화면에서 제외합니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // withAutoTracking:YES를 입력합니다.
    [[UserHabit sharedInstance]SessionStart:@"Your API-Key" withAutoTracking:YES];

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

    [[UserHabit sharedInstance]excludeClasses:excluding];
    return YES;
}
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 에서 추가적인 화면 정의가 가능합니다.
새롭게 정의하려고 하는 부분이 실제 기기 화면에 노출되는 시점에 아래 함수를 입력하세요.

{
    ...
    [[UserHabit sharedInstance]setScreen:self withName: @"CustomScreen"];
    ...
  }
{
    ...
    UserHabit.sharedInstance().setScreen(self, withName: "CustomScreen")
    ...
}

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

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

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

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

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

#import "AppDelegate.h"
#import <UserHabit/UserHabit.h>
​
@interface AppDelegate ()
@end
@implementation AppDelegate
​
​
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    [[UserHabit sharedInstance]SessionStart:@"Your API-KEY"];
    //앱이 종료 혹은 백그라운드로 갔을 시, 10초 뒤에 세션을 종료합니다. 한번만 호출하시면 됩니다.
    [[UserHabit sharedInstance]setSessionDelayTime:15.0f];
​
    return YES;
}
import UIKit

@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. 디바이스 구분자 랜덤 생성 기능

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

#import "AppDelegate.h"
#import <UserHabit/UserHabit.h>
​
@interface AppDelegate ()
@end
@implementation AppDelegate
​
​
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
     // Override point for customization after application launch.
    [[UserHabit sharedInstance]enableDeviceRandomID];
    [[UserHabit sharedInstance]SessionStart:@"Your API-Key"];

    return YES;
}
import UIKit

@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() 함수 이전에 실행하셔야 적용됩니다.
기존 디바이스 아이디를 수집한 상태에서 해당 함수를 적용할 경우 이전 디바이스와 매칭이 되지 않는 점 유의하세요.
(이로 인해, Unique User Count의 정보가 부정확해질 수 있습니다.)

Warning!

xib를 사용하지 않는 경우
[[UserHabit sharedInstance]SessionStart:@"Your API-Key"];   함수는 self.window를 alloc 하신 후에 삽입 하셔야 합니다.
#import <UserHabit/UserHabit.h> 이 file not found 가 나오는 경우
Target -> Build Setting -> Frameworks Search Paths 에 UserHabit.framework 파일 경로를 등록 해주셔야 합니다.
xib를 사용하지 않는 경우
UserHabit.SessionStart("Your API-Key"); 함수는 self.window를 alloc 하신 후에 삽입 하셔야 합니다.

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

SDK 업데이트 히스토리

분석의 정확성을 높이기 위해 UserHabit SDK을 주기적으로 개선합니다.
주요 업데이트를 확인하시고 가능한 최신 SDK 버전을 유지하시기를 권장해 드립니다.


안드로이드

1.0.15버전 (2017-03-13 업데이트)

- 일부 다이얼로그 화면 추적 기능 추가

1.0.14버전 (2017-01-23 업데이트)

- Touch event 관련 정확도 향상
- 세션 수집 알고리즘 개선

1.0.13버전 (2017-01-11 업데이트)

- 콘솔에서 스크린샷 기능 사용 제어 가능

1.0.12버전 (2017-01-06 업데이트)

- 개발자모드에서 스크린샷 취득 On/Off 모드 API 추가 : - setScreenshotCaptureMode(boolean isCapture);

1.0.11버전 (2017-01-06 업데이트)

- 개발자모드에서 스크린샷 취득 On/Off 모드 API 추가 : - setScreenshotCaptureMode(boolean isCapture);

1.0.10버전 (2016-12-15 업데이트)

1.0.9버전 (2016-11-22 업데이트)

1.0.8버전 (2016-10-05 업데이트)

- 디바이스 구분자 랜덤 생성 모드를 켜는 메소드 추가
- 기존 SDK 사용자가 추가된 메소드를 사용하여 앱을 배포할 때, 모든 앱 사용자들이 앱을 업데이트할 때까지 Unique User Count의 정보가 일부분 부정확해질 수 있습니다.

1.0.6버전 (2016-07-07 업데이트)

1.0.5버전 (2016-06-13 업데이트)

1.0.4버전 (2016-05-27 업데이트)

1.0.3버전 (2016-05-16 업데이트)

1.0.2버전 (2016-04-26 업데이트)

- 오브젝트 터치 관련 정확성 보완
- 일부 내부 구조 변경
- 기타 버그 수정

1.0.1버전 (2016-03-11 업데이트)

1.0.0버전 (2016-03-03 업데이트)



iOS

1.0.13 버전 (2017-01-11 업데이트)

- 콘솔에서 스크린샷 기능 사용 제어 가능

1.0.12 버전 (2017-01-06 업데이트)

- 통신 모듈 개선
- 개발자모드에서 스크린샷 취득 On/Off 모드 API 추가 : -(void)setScreenshotCaptureMode:(BOOL)mode;

1.0.11 버전 (2016-12-11 업데이트)

- 특정 상황에서 탭과 스와이프 데이터가 잘 못 수집되는 문제 해결
- 특정앱에서 크래시가 수집 되지 않는 문제 해결
- 안정성 강화

1.0.10 버전 (2016-10-10 업데이트)

- 디바이스 ID 랜덤 생성 모드를 켜는 메소드 추가
- 기존 SDK 사용자가 추가된 메소드를 사용하여 앱을 배포할 때, 모든 앱 사용자들이 앱을 업데이트 할 때까지 Unique User Count의 정보가 일부분 부정확해질 수 있습니다.
- 디바이스 ID 랜덤 생성모드를 사용하지 않는 경우는 업데이트 하지 않아도 문제없습니다.

1.0.9 버전 (2016-09-03 업데이트)

1.0.7 버전 (2016-07-11 업데이트)

1.0.5 버전 (2016-06-02 업데이트)

1.0.4 버전 (2016-04-27 업데이트)

1.0.3 버전 (2016-04-06 업데이트)

1.0.2 버전 (2016-03-25 업데이트)

1.0.1 버전 (2016-03-10 업데이트)

1.0.0 버전 (2016-03-03 업데이트)

  • UserHabit 1.0.0 is finally out~!
  • Try out and enjoy exploring UserHabit~!


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