/
BuzzScreen Migration SDK 연동

BuzzScreen Migration SDK 연동

Introduction

λ°˜λ“œμ‹œ λ²„μ¦ˆλΉŒ BD νŒ€κ³Ό ν˜‘μ˜ ν›„ 진행해야 ν•˜λ©°, κ°€μ΄λ“œλ₯Ό λ°˜μ˜ν•œ Mμ•±κ³Ό Lμ•±μ˜ APK νŒŒμΌμ„ λ§ˆμΌ“μ— μ—…λ‘œλ“œν•˜κΈ° 전에 λ²„μ¦ˆλΉŒ BD νŒ€μ— μ „λ‹¬ν•˜μ—¬ λ°˜λ“œμ‹œ 리뷰λ₯Ό 거쳐야 ν•©λ‹ˆλ‹€.

ꡬ글 μ •μ±… λŒ€μ‘μ„ μœ„ν•΄, κΈ°μ‘΄ λ²„μ¦ˆμŠ€ν¬λ¦°μ„ μ—°λ™ν•œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μž κΈˆν™”λ©΄μ„ μƒˆλ‘œμš΄ μž κΈˆν™”λ©΄ μ „μš© μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μž κΈˆν™”λ©΄μœΌλ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ ν•˜κΈ° μœ„ν•œ κ°€μ΄λ“œμž…λ‹ˆλ‹€. μ•„λž˜μ˜ 사항을 μˆ™μ§€ν•œ ν›„ 연동을 μ§„ν–‰ν•΄μ£Όμ„Έμš”.

  • μš©μ–΄ μ •μ˜

    • μ΄ν•˜ κΈ°μ‘΄ λ²„μ¦ˆμŠ€ν¬λ¦°μ„ μ—°λ™ν•œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ β€œM(Main) μ•±β€μœΌλ‘œ μ§€μΉ­ν•˜κ³ ,

    • μƒˆλ‘œμš΄ μž κΈˆν™”λ©΄ μ „μš© μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ β€œL(LockScreen) μ•±β€μœΌλ‘œ μ§€μΉ­ν•©λ‹ˆλ‹€.

  • μš”μ•½: 이 SDK 의 μ—°λ™μž‘μ—…μ„ 톡해, Mμ•±μ˜ λ²„μ¦ˆμŠ€ν¬λ¦° μ‚¬μš©μžλ₯Ό Lμ•±μ˜ λ²„μ¦ˆμŠ€ν¬λ¦° μ‚¬μš©μžλ‘œ μžμ—°μŠ€λŸ½κ²Œ & μ΅œμ†Œν•œμ˜ 연동 μ½”μŠ€νŠΈλ‘œ μ „ν™˜ κ°€λŠ₯ν•©λ‹ˆλ‹€.

    • μ‚¬μš© 상황: Lμ•± 내에 자체 둜그인 κΈ°λŠ₯ κ΅¬ν˜„μ΄ μ–΄λ ΅κ±°λ‚˜ / Mμ•±μ˜ 둜그인 관리λ₯Ό κ·ΈλŒ€λ‘œ Lμ•±μ—μ„œ μ‚¬μš©ν•˜κ³  싢은 경우

      • ν•„μš”ν•œ μœ μ € 정보(μœ μ €μ•„μ΄λ””, λ‚˜μ΄, 성별 λ“±) 및 μž κΈˆν™”λ©΄ ν™œμ„±ν™” λ™μ˜ μ—¬λΆ€λ₯Ό Mμ•±μ—μ„œ μˆ˜μ§‘ν•˜μ—¬ Lμ•±μœΌλ‘œ κ°€μ Έμ˜¬ 수 μžˆλ„λ‘ SDKμ—μ„œ μ§€μ›ν•©λ‹ˆλ‹€. λ”°λΌμ„œ Lμ•±μ˜ 자체 둜그인 μ‹œμŠ€ν…œμ΄ λΆˆν•„μš”ν•©λ‹ˆλ‹€.

    • λ³΄μ•ˆ: λ‹€λ₯Έ μ•±μ—μ„œμ˜ 접근을 막기 μœ„ν•΄ μ•ˆλ“œλ‘œμ΄λ“œμ˜ protectionLevel="signature" κΆŒν•œμ„ μ‚¬μš©ν•©λ‹ˆλ‹€.

    • μ°Έκ³ : Lμ•±μ˜ μ„€μΉ˜ (APK 파일 λ‹€μš΄λ‘œλ“œ & μ„€μΉ˜) λŠ” μœ μ €μ˜ μ•‘μ…˜ 없이 진행할 수 없기에 μžλ™ν™”κ°€ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

Migration SDK Workflow

Β 


Mμ•± λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ κ΅¬ν˜„

Basic Usage

  • λ²„μ¦ˆμŠ€ν¬λ¦° 연동에 ν•„μš”ν•œ μœ μ € ν”„λ‘œν•„ μ •λ³΄λŠ” 기쑴처럼 Mμ•±μ—μ„œ μˆ˜μ§‘ν•˜κ³ , λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ SDKλ₯Ό 톡해 Lμ•±μœΌλ‘œ μžλ™μœΌλ‘œ μ „λ‹¬λ©λ‹ˆλ‹€.

  • M앱은 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 이후에도 Lμ•±μ—μ„œ μž κΈˆν™”λ©΄ ν™œμ„±ν™”μ— ν•„μš”ν•œ 정보듀을 μ œκ³΅ν•΄μ£ΌλŠ” 역할을 ν•©λ‹ˆλ‹€.

  • L앱은 항상 μ‹€ν–‰ μ‹œμ— Mμ•±μ˜ μƒνƒœλ₯Ό μ²΄ν¬ν•˜μ—¬ Lμ•±μ˜ μž κΈˆν™”λ©΄ ν™œμ„±ν™” κ°€λŠ₯ μ—¬λΆ€λ₯Ό νŒλ‹¨ν•©λ‹ˆλ‹€.

1. build.gradle μ„€μ •

1) manifestPlaceholders μΆ”κ°€

android { defaultConfig { // my_app_key μ—λŠ” λ²„μ¦ˆμŠ€ν¬λ¦° 연동 μ‹œ λ°œκΈ‰λ°›μ€ μ•±ν‚€λ₯Ό μž…λ ₯ν•©λ‹ˆλ‹€. manifestPlaceholders = [buzzScreenAppKey:"my_app_key"] } }

2) dependencies 에 μΆ”κ°€

M앱을 μœ„ν•œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 라이브러리λ₯Ό μΆ”κ°€ν•˜κ³ , BuzzScreen SDK 버전 1.6.3 μ΄μƒμœΌλ‘œ μ—…λ°μ΄νŠΈν•΄μ•Ό ν•©λ‹ˆλ‹€.

κΈ°μ‘΄ λ²„μ¦ˆμŠ€ν¬λ¦° 연동

M앱을 μœ„ν•œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 라이브러리
repositories { maven { url "https://dl.buzzvil.com/public/maven" } } ... dependencies { // 라이브러리λͺ…이 Lμ•±κ³Ό 닀름에 주의! implementation 'com.buzzvil.buzzscreen.ext:migration-host:1.4.0' // (optional) migration SDKμ—μ„œ μ œκ³΅ν•˜λŠ” μ•”ν˜Έν™”λ₯Ό μ‚¬μš©ν•˜λŠ” 경우, μ•„λž˜μ˜ libraryλ₯Ό μΆ”κ°€ν•΄ μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€. // implementation 'com.github.joshjdevl.libsodiumjni:libsodium-jni-aar:1.0.8' }

Β 

2. Application Class 에 μ½”λ“œ μΆ”κ°€

κΈ°μ‘΄ λ²„μ¦ˆμŠ€ν¬λ¦° 연동을 μœ„ν•΄ μΆ”κ°€ν•œ BuzzScreen.init λ‹€μŒμ— MigrationHost.init을 ν˜ΈμΆœν•©λ‹ˆλ‹€.

  • MigrationHost.init(Context context, String lockScreenPackageName) : λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μœ„ν•œ Mμ•±μ˜ μ΄ˆκΈ°ν™” μ½”λ“œ

    • Parameters

      • context : Application context λ₯Ό this 둜 전달

      • lockScreenPackageName : Lμ•±μ˜ νŒ¨ν‚€μ§€λͺ…

    • μ‚¬μš© μ˜ˆμ‹œ

      public class App extends Application { @Override public void onCreate() { super.onCreate(); // κΈ°μ‘΄ λ²„μ¦ˆμŠ€ν¬λ¦° μ΄ˆκΈ°ν™” μ½”λ“œ. BuzzScreen.init("app_key", this, SimpleLockerActivity.class, R.drawable.image_on_fail); // λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μœ„ν•œ μ΄ˆκΈ°ν™” // Lμ•±μ˜ νŒ¨ν‚€μ§€λͺ…이 com.buzzvil.buzzscreen.sample_lock_light 인 경우 μ‚¬μš© μ˜ˆμ‹œ MigrationHost.init(this, "com.buzzvil.buzzscreen.sample_lock_light"); // Lμ•±μ—μ„œ λ²„μ¦ˆμŠ€ν¬λ¦°μ΄ ν™œμ„±ν™”λ˜μ–΄ Mμ•±μ—μ„œ μž κΈˆν™”λ©΄μ΄ λΉ„ν™œμ„±ν™” λ˜λŠ” 경우 ν˜ΈμΆœλ˜λŠ” λ¦¬μŠ€λ„ˆ 등둝 μ˜ˆμ‹œ MigrationHost.setOnDeactivatedByLockScreenAppListener(new MigrationHost.OnDeactivatedByLockScreenAppListener() { @Override public void onDeactivated() { Log.i("MainApp", "LockScreen is deactivated by LockScreen App"); } }); } }

3. μž κΈˆν™”λ©΄ ν™œμ„±ν™” ν™”λ©΄ λ³€κ²½

L앱은 Mμ•±μ˜ μœ μ € μ •λ³΄λ‘œ μž κΈˆν™”λ©΄μ„ ν™œμ„±ν™” ν•  뿐 직접 μœ μ €μ—κ²Œ μ •λ³΄λ‚˜ λ™μ˜λ₯Ό λ°›λŠ” 과정이 μ—†μŠ΅λ‹ˆλ‹€. 이 λ•Œλ¬Έμ— Lμ•±μ—μ„œλŠ” Mμ•±μ˜ μž κΈˆν™”λ©΄ ν™œμ„±ν™” ν™”λ©΄ (μœ μ € ν”„λ‘œν•„, μ‚¬μš©λ™μ˜, ν™œμ„±ν™”/λΉ„ν™œμ„±ν™” μ„€μ • ν™”λ©΄) 을 λ³€κ²½ν•˜μ—¬ μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

ν•­λͺ©

μ½”λ“œ

λ‚΄μš©

ν•­λͺ©

μ½”λ“œ

λ‚΄μš©

1

Mμ•±μ˜ μž κΈˆν™”λ©΄ ν™œμ„±ν™” ν™”λ©΄μœΌλ‘œ μ΄λ™ν•˜λŠ” λ”₯링크 μ„€μ •

-

  • Lμ•±μ—μ„œ μž κΈˆν™”λ©΄ ν™œμ„±ν™”μ— ν•„μš”ν•œ μ •λ³΄λ‚˜ μœ μ € μ‚¬μš© λ™μ˜κ°€ ν•„μš”ν•œ 경우 Mμ•±μ˜ μž κΈˆν™”λ©΄ ν™œμ„±ν™” ν™”λ©΄μœΌλ‘œ μ΄λ™μ‹œμΌœ 이 과정을 μ§„ν–‰ν•©λ‹ˆλ‹€.

  • λ§Œμ•½ ν•΄λ‹Ή λ”₯링크가 μ—†μœΌλ©΄ Mμ•±μ˜ μ΄ˆκΈ°ν™”λ©΄μ„ μ‹€ν–‰ν•©λ‹ˆλ‹€.

2

L앱을 톡해 μž κΈˆν™”λ©΄ ν™œμ„±ν™”

MigrationHost.requestActivationWithLaunch()

  • L앱이 μ„€μΉ˜λ˜μ§€ μ•Šμ€ 경우 λ§ˆμΌ“μ„ 톡해 μ„€μΉ˜ ν›„ μžλ™μœΌλ‘œ ν™œμ„±ν™”λ¨

  • L앱이 μ„€μΉ˜λœ 경우 L앱을 μ‹€ν–‰ν•˜λ©΄μ„œ μžλ™μœΌλ‘œ μž κΈˆν™”λ©΄μ΄ ν™œμ„±ν™”λ¨

μ•± λ‚΄μ˜ μž κΈˆν™”λ©΄ ν™œμ„±ν™” ν™”λ©΄μ—μ„œ ν™œμ„±ν™”/λΉ„ν™œμ„±ν™”λ₯Ό μ„€μ •ν•˜λŠ” μŠ€μœ„μΉ˜λ₯Ό λ°°λ„ˆ ν˜•νƒœλ‘œ λ³€κ²½ν•©λ‹ˆλ‹€. ν•΄λ‹Ή λ°°λ„ˆ 클릭 μ‹œ, ν˜Ήμ€ μž κΈˆν™”λ©΄ μ‚¬μš© λ™μ˜λ₯Ό λ°›κ³  μž κΈˆν™”λ©΄μ„ ν™œμ„±ν™” ν•˜λŠ” κ³³ (κΈ°μ‘΄ BuzzScreen.getInstance().activate() ν˜ΈμΆœν•˜λŠ” 지점과 동일) μ—μ„œ λ³Έ ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.

  • λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μ§€μ›ν•˜λŠ” Mμ•± λ²„μ „μ—μ„œλŠ” 이 λ°°λ„ˆκ°€ Lμ•±μœΌλ‘œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μˆ˜ν–‰ν•˜λŠ” ν•˜λ‚˜μ˜ 채널이 될 뿐만 μ•„λ‹ˆλΌ, Mμ•±μ—μ„œ μž κΈˆν™”λ©΄μ„ 처음으둜 μ‚¬μš©ν•˜λ €λŠ” μœ μ €λ₯Ό Lμ•±μœΌλ‘œ μœ λ„ν•˜λŠ” 채널이 λ˜κΈ°λ„ ν•©λ‹ˆλ‹€.

MigrationHost.requestActivationWithLaunch() 을 ν˜ΈμΆœν•˜κΈ° 전에도 이전 λ²„μ¦ˆμŠ€ν¬λ¦° μ—°λ™μ²˜λŸΌ BuzzScreen.getInstance().getUserProfile()λ₯Ό 톡해 μœ μ € 정보λ₯Ό μ„€μ •ν•˜λŠ” μ½”λ“œλŠ” 미리 ν˜ΈμΆœλ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. 이 정보λ₯Ό κ·ΈλŒ€λ‘œ Lμ•±μ—μ„œ ν™œμš©ν•˜μ—¬ μž κΈˆν™”λ©΄μ΄ ν™œμ„±ν™”λ©λ‹ˆλ‹€.

Lμ•± μž κΈˆν™”λ©΄ ν™œμ„±ν™” κ³Όμ •

Β 

4. λ‘œκ·Έμ•„μ›ƒ 처리

Mμ•±μ—μ„œ λ‘œκ·Έμ•„μ›ƒμ΄ μΌμ–΄λ‚˜λŠ” 경우 μ•„λž˜ 두 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.
Lμ•±μ—μ„œμ˜ μž κΈˆν™”λ©΄μ„ λΉ„ν™œμ„±ν™”ν•˜κ³ , λ‹€μŒ ν™œμ„±ν™” μ‹œμ— Lμ•±μ—μ„œ μƒˆλ‘œμš΄ μœ μ € 정보λ₯Ό Mμ•±μœΌλ‘œλΆ€ν„° μ œκ³΅λ°›κΈ° μœ„ν•¨μž…λ‹ˆλ‹€.

  • BuzzScreen.getInstance().logout() : Mμ•±μ—μ„œ μž κΈˆν™”λ©΄μ„ λΉ„ν™œμ„±ν™”ν•˜κ³ , μœ μ €μ •λ³΄λ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.

  • MigrationHost.requestDeactivation() : Lμ•±μ—μ„œ μž κΈˆν™”λ©΄μ΄ ν™œμ„±ν™”λ˜μ–΄ μžˆλŠ” 경우 ν•΄λ‹Ή μž κΈˆν™”λ©΄μ„ λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€.

+. λ²„μ¦ˆμŠ€ν¬λ¦° ν™œμ„±ν™”/λΉ„ν™œμ„±ν™” κ΄€λ ¨ μ½”λ“œ 제거 status:선택

Mμ•±μ—μ„œ Lμ•±μœΌλ‘œμ˜ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 이후 Mμ•±μ˜ μž κΈˆν™”λ©΄μ„ μ§€μ›ν•˜μ§€ μ•Šμ„ 경우, μž κΈˆν™”λ©΄ ν™œμ„±ν™”/λΉ„ν™œμ„±ν™”λ₯Ό μœ„ν•΄ μ‚½μž…ν–ˆλ˜ BuzzScreen.getInstance().activate(), BuzzScreen.getInstance().deactivate() μ½”λ“œλ₯Ό λͺ¨λ‘ μ œκ±°ν•©λ‹ˆλ‹€.

Β 

Advanced Usage

κ·Έ μ™Έ μœ μš©ν•œ ν•¨μˆ˜λ“€

ν•­λͺ©

μ½”λ“œ

λ‚΄μš©

ν•­λͺ©

μ½”λ“œ

λ‚΄μš©

Lμ•±μ˜ μž κΈˆν™”λ©΄ ν™œμ„±ν™” μ—¬λΆ€ 확인

MigrationHost.isLockScreenAppActivated()

  • Lμ•±μ—μ„œ μž κΈˆν™”λ©΄μ΄ ν™œμ„±ν™”λ˜μ–΄ 있으면 true

  • λΉ„ν™œμ„±ν™”λ˜μ–΄ 있으면 falseλ₯Ό 리턴

Mμ•±μ—μ„œ λ³€κ²½λœ μœ μ € 아이디λ₯Ό L앱에 동기화

MigrationHost.requestUserProfileSync(boolean encrypt)

κΈ°μ‘΄ Mμ•±μ—μ„œ 주기적으둜 μœ μ € 아이디가 λ³€κ²½λ˜λŠ” κ²½μš°μ—λŠ”, setUserId() 호좜 이후에 이 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ L앱에도 λ³€κ²½λœ μœ μ € μ •λ³΄κ°’μœΌλ‘œ 동기화λ₯Ό ν•©λ‹ˆλ‹€.

  • encrypt status:선택 : μœ μ € 정보값 동기화 μ‹œ L앱에 μ „λ‹¬ν•˜λŠ” μœ μ € 정보λ₯Ό μ•”ν˜Έν™”ν•˜κΈ° μœ„ν•œ μΈμžμž…λ‹ˆλ‹€. μ•”ν˜Έν™”ν•˜κ³ μž ν•˜λŠ” 경우 encrypt에 trueλ₯Ό μ „λ‹¬ν•˜μ—¬ ν˜ΈμΆœν•©λ‹ˆλ‹€.

    • v1.0.2.0 μ΄μƒμ—μ„œ μ‚¬μš© κ°€λŠ₯

이 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ§€ μ•ŠμœΌλ©΄ Lμ•±μ—μ„œλŠ” λ‹€μŒ checkAvailability 호좜 μ „κΉŒμ§€λŠ” λ³€κ²½λœ μœ μ € 정보가 λ°˜μ˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μ»€μŠ€ν…€ λ§ˆμΌ“ 링크 μ„€μ •

MigrationHost.setLockScreenAppMarketLink(String link)

  • 호좜 μœ„μΉ˜: requestActivationWithLaunch() 전에 μ„€μ •ν•΄μ•Ό 함

requestActivationWithLaunch() 톡해 Lμ•± μ„€μΉ˜ν•˜λŠ” 경우, νŒ¨ν‚€μ§€λͺ…μœΌλ‘œ μƒμ„±λœ κΈ°λ³Έ λ§ˆμΌ“ uri κ°€ μ•„λ‹Œ μœ μž… 경둜 뢄석을 μœ„ν•΄ μ»€μŠ€ν…€ 링크λ₯Ό μ μš©ν•˜κ³  μ‹ΆμœΌλ©΄ 이 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

  • Parameters

    • link : μ»€μŠ€ν…€ λ§ˆμΌ“ 링크

Lμ•±μ˜ μ‹€ν–‰ 없이 Lμ•±μ˜ μž κΈˆν™”λ©΄ ν™œμ„±ν™”

MigrationHost.requestActivation(OnRequestActivateResponseListener listener, boolean encrypt)

MigrationHost.requestActivationWithLaunch() 와 λ‹€λ₯Έ 점은 Lμ•±μ˜ 싀행없이 Lμ•±μ˜ μž κΈˆν™”λ©΄μ΄ ν™œμ„±ν™” λœλ‹€λŠ” μ μž…λ‹ˆλ‹€.

Mμ•±μ˜ MigrationHost 0.9.4 μ΄μƒμ—μ„œ ν˜ΈμΆœλ˜μ–΄μ•Ό ν•˜λ©°, Lμ•± μ—­μ‹œ MigrationClient 0.9.4 이상이 μ μš©λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

μž κΈˆν™”λ©΄μ„ ν™œμ„±ν™” ν• λ•ŒλŠ” Mμ•±μ—μ„œ μ„€μ •λœ μœ μ € 정보λ₯Ό μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

  • Parameters

    • OnRequestActivateResponseListener

      • onAlreadyActivated() : Lμ•±μ—μ„œ λ²„μ¦ˆμŠ€ν¬λ¦°μ΄ 이미 ν™œμ„±ν™”κ°€ λ˜μ–΄μžˆλŠ” 경우 ν˜ΈμΆœλ©λ‹ˆλ‹€.

      • onActivated() : Lμ•±μ—μ„œ λ²„μ¦ˆμŠ€ν¬λ¦°μ΄ ν™œμ„±ν™”κ°€ 된 경우 ν˜ΈμΆœλ©λ‹ˆλ‹€.

      • onError(RequestActivationError error) : Lμ•±μ˜ λ²„μ¦ˆμŠ€ν¬λ¦° ν™œμ„±ν™”μ— μ‹€νŒ¨ν•œ 경우 ν˜ΈμΆœλ©λ‹ˆλ‹€.

        • LOCKSCREEN_APP_NOT_INSTALLED : L앱이 μ„€μΉ˜λ˜μ§€ μ•Šμ•„ ν™œμ„±ν™”μ— μ‹€νŒ¨ν•œ 경우

        • LOCKSCREEN_APP_MIGRATION_NOT_SUPPORTED : Lμ•±μ—μ„œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 연동이 λ˜μ§€ μ•Šμ•„ ν™œμ„±ν™”μ— μ‹€νŒ¨ν•œ 경우

        • UNKNOWN_ERROR : 잘λͺ»λœ 연동 ν˜Ήμ€ μΌμ‹œμ μΈ μ—λŸ¬λ‘œ λ°œμƒν•œ 경우

    • encrypt status:선택: μž κΈˆν™”λ©΄ ν™œμ„±ν™” μ‹œ L앱에 μ „λ‹¬ν•˜λŠ” μœ μ € 정보λ₯Ό μ•”ν˜Έν™”ν•˜κΈ° μœ„ν•œ μΈμžμž…λ‹ˆλ‹€. μ•”ν˜Έν™”ν•˜κ³ μž ν•˜λŠ” 경우 encrypt에 trueλ₯Ό μ „λ‹¬ν•˜μ—¬ ν˜ΈμΆœν•©λ‹ˆλ‹€.

      • v1.0.2.0 μ΄μƒμ—μ„œ μ‚¬μš© κ°€λŠ₯

Β 


Β 

Lμ•± λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ κ΅¬ν˜„

ν•­λͺ©

λ‚΄μš©

ν•­λͺ©

λ‚΄μš©

1

μœ μ €μ •λ³΄ μ„€μ • 및 μ‚¬μš© λ™μ˜

  • Lμ•±μ˜ λ²„μ¦ˆμŠ€ν¬λ¦° μ—°λ™μ—μ„œ μœ μ € 정보 μ„€μ • 과정은 λ”°λ‘œ μ§„ν–‰ν•˜μ§€ μ•Šμ•„λ„ λ©λ‹ˆλ‹€.

    • λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ SDKλ₯Ό 톡해 Mμ•±μ—μ„œ μ„€μ •λœ λ²„μ¦ˆμŠ€ν¬λ¦° μœ μ € 정보λ₯Ό κ·ΈλŒ€λ‘œ κ°€μ Έμ™€μ„œ μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

  • L앱은 Mμ•±μœΌλ‘œλΆ€ν„° μž κΈˆν™”λ©΄μ— ν•„μš”ν•œ 정보와 μ‚¬μš©μž λ™μ˜λ₯Ό νšλ“ν•˜μ—¬ μž κΈˆν™”λ©΄μ„ ν™œμ„±ν™” ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 기쑴에 Mμ•±μ—μ„œ μž κΈˆν™”λ©΄μ„ μ‚¬μš©ν•˜κ³  있던 μœ μ €λŠ” 이미 μž κΈˆν™”λ©΄ μ‚¬μš© λ™μ˜κ°€ λ˜μ—ˆλ‹€κ³  κ°„μ£Όν•©λ‹ˆλ‹€.

2

ν™œμ„±ν™”/λΉ„ν™œμ„±ν™”

  • Lμ•± μž κΈˆν™”λ©΄ ν™œμ„±ν™”μ— ν•„μš”ν•œ 정보가 없을 경우 Mμ•±μ˜ μž κΈˆν™”λ©΄ ν™œμ„±ν™” 화면을 톡해 μž κΈˆν™”λ©΄μ„ ν™œμ„±ν™”ν•΄μ•Ό ν•œλ‹€κ³  μœ μ €μ—κ²Œ μ•Œλ €μ£Όκ²Œ λ©λ‹ˆλ‹€.

    • 이 κ³Όμ •μ—μ„œ Mμ•±μ˜ μž κΈˆν™”λ©΄ ν™œμ„±ν™” ν™”λ©΄μœΌλ‘œ μ—°κ²°λ˜λŠ” λ”₯링크가 있으면 μžμ—°μŠ€λŸ¬μš΄ μœ μ €κ²½ν—˜μ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

  • Mμ•±μ—μ„œ λ‘œκ·Έμ•„μ›ƒ μ‹œμ μ— MigrationHost.requestDeactivation() λ₯Ό ν˜ΈμΆœν•˜κ±°λ‚˜ M앱이 제거되면 μžλ™μœΌλ‘œ Lμ•±μ˜ μž κΈˆν™”λ©΄μ΄ λΉ„ν™œμ„±ν™”λ©λ‹ˆλ‹€.

3

Lμ•± κ΅¬ν˜„

  • Lμ•±μ˜ μƒ˜ν”Œμ„ ν™œμš©ν•˜μ—¬ μ†μ‰½κ²Œ L앱을 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. (μ•„λž˜ Appendix μ°Έκ³ )

  • λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ SDK 이외에도 톡신 λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜μ—¬ Mμ•±κ³Ό Lμ•± κ°„μ˜ 좔가적인 톡신을 κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (톡신 μœ ν‹Έλ¦¬ν‹°archived μ°Έκ³ )

    • 이λ₯Ό 톡해 Lμ•±μ—μ„œλŠ” Mμ•±μ˜ κΈ°λŠ₯μ΄λ‚˜ 데이터λ₯Ό ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Basic Usage

1. build.gradle μ„€μ •

1) manifestPlaceholders μΆ”κ°€

android { defaultConfig { // my_app_key μ—λŠ” λ²„μ¦ˆμŠ€ν¬λ¦° 연동 μ‹œ λ°œκΈ‰λ°›μ€ μ•±ν‚€λ₯Ό μž…λ ₯ν•©λ‹ˆλ‹€. manifestPlaceholders = [buzzScreenAppKey:"my_app_key"] } }

2) dependencies μΆ”κ°€

L앱을 μœ„ν•œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 라이브러리뿐만 μ•„λ‹ˆλΌ λ²„μ¦ˆμŠ€ν¬λ¦° λΌμ΄λΈŒλŸ¬λ¦¬λ„ μΆ”κ°€ν•©λ‹ˆλ‹€. BuzzScreen SDK 1.6.3 버전 이상이 ν•„μš”ν•©λ‹ˆλ‹€.

λ²„μ¦ˆμŠ€ν¬λ¦° 연동

L앱을 μœ„ν•œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 라이브러리
repositories { maven { url "https://dl.buzzvil.com/public/maven" } } ... dependencies { // migration-host 와 버전이 λ°˜λ“œμ‹œ μΌμΉ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. implementation 'com.buzzvil.buzzscreen.ext:migration-client:1.4.0' // (optional) migration SDKμ—μ„œ μ œκ³΅ν•˜λŠ” μ•”ν˜Έν™”λ₯Ό μ‚¬μš©ν•˜λŠ” 경우, μ•„λž˜μ˜ libraryλ₯Ό μΆ”κ°€ν•΄ μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€. // implementation 'com.github.joshjdevl.libsodiumjni:libsodium-jni-aar:1.0.8' }

2. AndroidManifest.xml λ³€κ²½

λ²„μ¦ˆμŠ€ν¬λ¦° 연동을 μœ„ν•΄ app_licenseλŠ” μƒˆλ‘œ λ°œκΈ‰ λ°›μ•„ L앱에 μ μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ²„μ¦ˆλΉŒ BD λ§€λ‹ˆμ €μ—κ²Œ λ¬Έμ˜ν•΄μ£Όμ„Έμš”.

<manifest> <application> ... <!-- Configuration for BuzzScreen--> <!-- <app_license> λ₯Ό κΈ°μ‘΄ Mμ•±κ³Ό λ‹€λ₯Έ μƒˆλ‘œμš΄ κ°’μœΌλ‘œ κ΅μ²΄ν•©λ‹ˆλ‹€. --> <meta-data android:name="app_license" android:value="<app_license>" /> <!-- BuzzScreen SDK 1.9.0.7 이상 μ‚¬μš© μ‹œ μ•„λž˜ plist κ΄€λ ¨ μ½”λ“œλŠ” λΆˆν•„μš” --> <!-- <plist> λ₯Ό κΈ°μ‘΄ Mμ•±κ³Ό λ‹€λ₯Έ μƒˆλ‘œμš΄ κ°’μœΌλ‘œ κ΅μ²΄ν•©λ‹ˆλ‹€. --> <meta-data android:name="com.buzzvil.locker.mediation.baidu.plist" android:value="<plist>" /> </application> </manifest>

Β 

3. Application Class 에 μ½”λ“œ μΆ”κ°€

λ²„μ¦ˆμŠ€ν¬λ¦° 연동을 μœ„ν•œ BuzzScreen.init 와 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ 연동을 μœ„ν•œ MigrationClient.initλ₯Ό μˆœμ„œλŒ€λ‘œ ν˜ΈμΆœν•©λ‹ˆλ‹€.

ν•­λͺ©

μ½”λ“œ & 호좜 μœ„μΉ˜

μ„ΈλΆ€λ‚΄μš©

ν•­λͺ©

μ½”λ“œ & 호좜 μœ„μΉ˜

μ„ΈλΆ€λ‚΄μš©

λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μœ„ν•œ Lμ•±μ˜ μ΄ˆκΈ°ν™” μ½”λ“œ status:ν•„μˆ˜

MigrationClient.init(Context context, String mainPackageName)

λ²„μ¦ˆμŠ€ν¬λ¦° 연동을 μœ„ν•œ BuzzScreen.init 뒀에 호좜

Parameters

  • context : Application context λ₯Ό this 둜 전달

  • mainPackageName : Mμ•±μ˜ νŒ¨ν‚€μ§€λͺ…

Lμ•±μ—μ„œμ˜ μž κΈˆν™”λ©΄μ΄ λΉ„ν™œμ„±ν™”λ˜λŠ” 경우의 λ¦¬μŠ€λ„ˆ 등둝 status:ν•„μˆ˜

MigrationClient.setOnDeactivatedByMainAppListener(OnDeactivatedByMainAppListener listener)

ν˜ΈμΆœλ˜λŠ” 경우

  • Mμ•±μ—μ„œ MigrationHost.requestDeactivation()λ₯Ό ν˜ΈμΆœν•œ 경우

  • M앱을 μ‚­μ œν•œ 경우

Parameters

  • OnDeactivatedByMainAppListener

    • onDeactivated : Lμ•±μ˜ μž κΈˆν™”λ©΄μ΄ λΉ„ν™œμ„±ν™” 될 λ•Œ 호좜됨

public class App extends Application { @Override public void onCreate() { super.onCreate(); // κΈ°μ‘΄ λ²„μ¦ˆμŠ€ν¬λ¦° μ΄ˆκΈ°ν™” μ½”λ“œ. BuzzScreen.init("app_key", this, SimpleLockerActivity.class, R.drawable.image_on_fail); // λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μœ„ν•œ μ½”λ“œ // Mμ•±μ˜ νŒ¨ν‚€μ§€λͺ…이 com.buzzvil.buzzscreen.sample_main_light 인 경우 μ‚¬μš© μ˜ˆμ‹œ MigrationClient.init(this, "com.buzzvil.buzzscreen.sample_main_light"); // M앱에 μ˜ν•΄ Lμ•±μ—μ„œμ˜ μž κΈˆν™”λ©΄μ΄ λΉ„ν™œμ„±ν™”λ˜λŠ” 경우 ν˜ΈμΆœλ˜λŠ” λ¦¬μŠ€λ„ˆλ₯Ό 등둝 μ˜ˆμ‹œ MigrationClient.setOnDeactivatedByMainAppListener(new MigrationClient.OnDeactivatedByMainAppListener() { @Override public void onDeactivated() { Toast.makeText(App.this, "Main App의 μƒνƒœκ°€ λ³€κ²½(μ•± μ‚­μ œ, λ‘œκ·Έμ•„μ›ƒ, νƒˆν‡΄ λ“±)λ˜μ–΄ μž κΈˆν™”λ©΄μ„ λΉ„ν™œμ„±ν™”ν•©λ‹ˆλ‹€.", Toast.LENGTH_LONG).show(); } }); } }

4. μž κΈˆν™”λ©΄ ν™œμ„±ν™”μ™€ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜

Lμ•±μ—μ„œμ˜ μž κΈˆν™”λ©΄ ν™œμ„±ν™”λŠ” 1) Mμ•±μ—μ„œ 정보 κ°€μ Έμ˜€κΈ° β†’ 2) λ²„μ¦ˆμŠ€ν¬λ¦° ν™œμ„±ν™” κ³Όμ •μœΌλ‘œ μ§„ν–‰λ©λ‹ˆλ‹€.

  1. L앱이 싀행될 λ•Œ 이 과정이 μ§„ν–‰λ˜λ©΄μ„œ λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ΄ 되고, 이후에도 Mμ•±μ˜ 정보λ₯Ό 톡해 Lμ•±μ˜ μž κΈˆν™”λ©΄μ„ ν™œμ„±ν™”μ‹œν‚€κ²Œ λ©λ‹ˆλ‹€.

  2. Lμ•±μ˜ μž κΈˆν™”λ©΄μ΄ ν™œμ„±ν™”λ˜λ©΄ μžλ™μœΌλ‘œ Mμ•±μ˜ μž κΈˆν™”λ©΄μ΄ λΉ„ν™œμ„±ν™” λ©λ‹ˆλ‹€.

λ²„μ¦ˆμŠ€ν¬λ¦° ν™œμ„±ν™” κ³Όμ •μ—μ„œλŠ” κΈ°μ‘΄ λ²„μ¦ˆμŠ€ν¬λ¦° μ—°λ™μ²˜λŸΌ BuzzScreen.getInstance().launch() 와BuzzScreen.getInstance().activate() λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€. (κΈ°λ³Έ μ„€μ • μ°Έκ³ )

Mμ•±μ˜ 정보λ₯Ό κ°€μ Έμ˜€κΈ° μœ„ν•΄ MigrationClientμ—μ„œ λ‹€μŒ ν•¨μˆ˜λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

  • checkAvailability(OnCheckAvailabilityListener listener, boolean encrypt)

    • 호좜 μœ„μΉ˜: Lμ•± μ§„μž…ν™”λ©΄μ˜ onResume μ—μ„œ ν˜ΈμΆœν•˜μ—¬ Lμ•± μ§„μž… μ‹œ 항상 μˆ˜ν–‰λ˜λ„λ‘ ν•©λ‹ˆλ‹€.

    • λΉ„λ™κΈ°λ‘œ Mμ•±μ—μ„œ λ²„μ¦ˆμŠ€ν¬λ¦° ν™œμ„±ν™”μ— ν•„μš”ν•œ 정보듀을 κ°€μ Έμ˜€κ³ , Mμ•±μ˜ μƒνƒœμ— 따라 μžλ™μœΌλ‘œ μž κΈˆν™”λ©΄μ„ ν™œμ„±ν™”ν•©λ‹ˆλ‹€.

      • μžλ™μœΌλ‘œ μž κΈˆν™”λ©΄ ν™œμ„±ν™” λ˜λŠ” 쑰건

        1. Mμ•±μ—μ„œ μž κΈˆν™”λ©΄μ„ μ‚¬μš© 쀑인 경우

        2. MigrationHost.requestActivationWithLaunch()λ₯Ό ν˜ΈμΆœν•˜μ—¬ L앱을 μ‹€ν–‰ν•œ 경우

νŒŒλΌλ―Έν„°

리슀폰슀

μ„ΈλΆ€λ‚΄μš©

νŒŒλΌλ―Έν„°

리슀폰슀

μ„ΈλΆ€λ‚΄μš©

OnCheckAvailabilityListenerstatus:ν•„μˆ˜

onAvailable(boolean autoActivated)

  • λ²„μ¦ˆμŠ€ν¬λ¦°μ„ ν™œμ„±ν™” ν•  수 μžˆλŠ” 경우 호좜됨

  • μž κΈˆν™”λ©΄μ΄ ν™œμ„±ν™”λ˜λŠ” 경우의 ν”Œλ‘œμš°: μœ„ β€˜Lμ•± μž κΈˆν™”λ©΄ ν™œμ„±ν™” 과정’ 도식 μ°Έκ³ 

onAvailable(boolean autoActivated)

autoActivated

  • μžλ™μœΌλ‘œ μž κΈˆν™”λ©΄μ΄ ν™œμ„±ν™”λ˜λ©΄ true

  • 그렇지 μ•ŠμœΌλ©΄ false

onError(AvailabilityCheckError error)

  • λ²„μ¦ˆμŠ€ν¬λ¦°μ„ μ‚¬μš©ν•  수 μ—†λŠ” 경우 호좜됨

  • ν•΄λ‹Ή 경우의 ν”Œλ‘œμš°λŠ” μ•„λž˜ 도식 μ°Έκ³  ('checkAvailability Error Flow')

MAIN_APP_NOT_INSTALLED

M앱이 μ„€μΉ˜λ˜μ§€ μ•Šμ€ 경우

β†’ Mμ•±μ˜ μ„€μΉ˜λ₯Ό μœ λ„

MAIN_APP_MIGRATION_NOT_SUPPORTED

M앱이 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜μ„ μ§€μ›ν•˜μ§€ μ•ŠλŠ” 버전

β†’ Mμ•±μ˜ μ—…λ°μ΄νŠΈλ₯Ό μœ λ„

NOT_ENOUGH_USER_INFO

λ²„μ¦ˆμŠ€ν¬λ¦°μ„ ν™œμ„±ν™”ν•˜λŠ”λ° ν•„μš”ν•œ 정보가 μΆ©λΆ„ν•˜μ§€ μ•Šμ€ 경우

β†’ Mμ•±μ˜ μž κΈˆν™”λ©΄ ν™œμ„±ν™” νŽ˜μ΄μ§€λ‘œ 이동

UNKNOWN_ERROR

잘λͺ»λœ 연동 ν˜Ήμ€ μΌμ‹œμ μΈ μ—λŸ¬λ‘œ λ°œμƒ

  • μΌμ‹œμ μΈ μ—λŸ¬μΈ κ²½μš°μ—λŠ” μž¬μ‹œλ„λ₯Ό μœ λ„

migration-client 1.0.1 이상 버전 μ‚¬μš©μ‹œμ—λŠ” UNKNOWN_ERROR λ°œμƒμ‹œ 1.0.1 미만 버전과 달리 μž κΈˆν™”λ©΄μ΄ μžλ™μœΌλ‘œ λΉ„ν™œμ„±ν™” λ˜μ§€ μ•ŠμœΌλ―€λ‘œ, μœ μ €κ°€ μ‚¬μš©ν•  수 있게 λΉ„ν™œμ„±ν™” λ²„νŠΌμ„ μΆ”κ°€ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

encrypt status:선택

-

  • μœ μ € 정보값 동기화 μ‹œ Mμ•±μœΌλ‘œλΆ€ν„° μ „λ‹¬λ°›λŠ” μœ μ € 정보λ₯Ό μ•”ν˜Έν™”ν•˜κΈ° μœ„ν•œ 인자

  • μ•”ν˜Έν™”ν•˜κ³ μž ν•˜λŠ” 경우 encrypt에 trueλ₯Ό μ „λ‹¬ν•˜μ—¬ 호좜

v1.0.2.0 μ΄μƒμ—μ„œ μ‚¬μš© κ°€λŠ₯

checkAvailability Error Flow

public class MainActivity extends AppCompatActivity { private MigrationClient migrationClient = new MigrationClient(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // κΈ°μ‘΄ λ²„μ¦ˆμŠ€ν¬λ¦° 연동 BuzzScreen.getInstance().launch(); } @Override protected void onResume() { super.onResume(); migrationClient.checkAvailability(new MigrationClient.OnCheckAvailabilityListener() { @Override public void onAvailable(boolean autoActivated) { if (autoActivated) { showAutoActivatedDialog(); } // μž κΈˆν™”λ©΄μ„ on/off ν•  수 μžˆλŠ” λ ˆμ΄μ•„μ›ƒ ꡬ성 showSwitchLayout(); } @Override public void onError(MigrationClient.AvailabilityCheckError error) { switchActivateLock.setChecked(false); switch (error) { case MAIN_APP_NOT_INSTALLED: sendToPlayStore("앱이 μ„€μΉ˜λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.\nμ„€μΉ˜ 링크둜 μ΄λ™ν•©λ‹ˆλ‹€."); break; case MAIN_APP_MIGRATION_NOT_SUPPORTED: sendToPlayStore("앱이 μ΅œμ‹  버전이 μ•„λ‹™λ‹ˆλ‹€.\nμ„€μΉ˜ 링크둜 μ΄λ™ν•©λ‹ˆλ‹€."); break; case NOT_ENOUGH_USER_INFO: // Main App 을 톡해 μœ μ € 정보 및 μ‚¬μš©μž λ™μ˜λ₯Ό 받을 수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€. sendToMain(); break; case UNKNOWN_ERROR: Toast.makeText(MainActivity.this, "μ—λŸ¬κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€. λ‹€μ‹œ μ‹œλ„ν•΄μ£Όμ„Έμš”.", Toast.LENGTH_SHORT).show(); break; } } }); } @Override public void onPause() { super.onPause(); // checkAvailability λ₯Ό μ€‘λ‹¨ν•˜κΈ°μœ„ν•΄ ν˜ΈμΆœν•©λ‹ˆλ‹€. // μ—¬κΈ°μ„œ μ€‘λ‹¨ν•˜μ§€ μ•ŠμœΌλ©΄ onAvailable or onError κ°€ ν˜ΈμΆœλ©λ‹ˆλ‹€. migrationClient.abort(); } }

Β 

Advanced Usage

Mμ•±κ³Ό Lμ•± κ°„μ˜ 톡신 μœ ν‹Έ

λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ SDKμ—μ„œ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯ 이외에도 Mμ•±κ³Ό Lμ•± κ°„μ˜ 톡신이 ν•„μš”ν•˜λ‹€λ©΄ μ—¬κΈ°μ„œ μ œκ³΅ν•˜λŠ” 톡신 λͺ¨λ“ˆμ„ μ‚¬μš©ν•˜μ—¬ κ°œλ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ 톡신 μœ ν‹Έλ¦¬ν‹°archived λ¬Έμ„œλ₯Ό μ°Έκ³ ν•΄μ£Όμ„Έμš”.

Appendix

κ°„λ‹¨ν•œ λ°©λ²•μœΌλ‘œ Lμ•± λΉŒλ“œν•˜κΈ°

sample_lock_lightμ—μ„œ 확인할 수 μžˆλŠ” μƒ˜ν”Œ μž κΈˆν™”λ©΄ 앱은 μœ„ κ°€μ΄λ“œμ˜ κ΅¬ν˜„μ„ λ‹΄μ•˜μ„ 뿐만 μ•„λ‹ˆλΌ μ΅œμ†Œν•œμ˜ κΈ°λŠ₯도 κ΅¬ν˜„λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ sample_lock_light 을 λ‹€μš΄λ°›κ³  λ‹€μŒ κ³Όμ •λ§Œ 진행해도 μž κΈˆν™”λ©΄ 앱이 μ™„μ„±λ©λ‹ˆλ‹€.

κΈ°λŠ₯ κ΅¬ν˜„

  1. build.gradle λ³€κ²½ : my_app_keyλŠ” 기쑴에 λ°œκΈ‰λ°›μ•˜λ˜ λ²„μ¦ˆμŠ€ν¬λ¦° μ•±ν‚€λ‘œ λ³€κ²½ν•˜κ³ , applicationId λŠ” μƒˆλ‘­κ²Œ λ§Œλ“œλŠ” μž κΈˆν™”λ©΄ μ•±μ˜ νŒ¨ν‚€μ§€λͺ…μœΌλ‘œ λ³€κ²½ν•©λ‹ˆλ‹€.

  2. BuzzScreen.init() μ—μ„œ μ‚¬μš©λ˜λŠ” appKey λ₯Ό μ‹ κ·œ κ°’μœΌλ‘œ λ³€κ²½ν•©λ‹ˆλ‹€.

  3. AndroidManifest.xml λ³€κ²½ : <app_license>λ₯Ό μƒˆλ‘­κ²Œ λ°œκΈ‰λ°›μ€ κ°’μœΌλ‘œ λ³€κ²½ν•©λ‹ˆλ‹€.

  4. Mμ•± μž κΈˆν™”λ©΄ ν™œμ„±ν™” νŽ˜μ΄μ§€ λ”₯링크 μ„€μ • : App.java 파일 λ‚΄μ˜ DEEP_LINK_ONBOARDING λ₯Ό Mμ•± μž κΈˆν™”λ©΄ ν™œμ„±ν™” ν™”λ©΄ λ”₯링크둜 μ„€μ •ν•©λ‹ˆλ‹€.

λ””μžμΈ λ³€κ²½

  • μ•„μ΄μ½˜ : ic_launcher.png λ³€κ²½

  • 색상 : res/colors.xml λ³€κ²½λ§ŒμœΌλ‘œ 메인 색상 적용 κ°€λŠ₯

  • 둜고 : activity_main.xmlμ—μ„œ νˆ΄λ°”μ˜ 둜고 λ³€κ²½

이 μ™Έμ˜ μž κΈˆν™”λ©΄ UI 및 κΈ°λŠ₯ μ»€μŠ€ν…€μ€ κ³ κΈ‰ μ„€μ • λ¬Έμ„œλ₯Ό μ°Έκ³ ν•΄μ£Όμ„Έμš”.

μƒ˜ν”Œμ•±μ— λŒ€ν•΄ κΆκΈˆν•œ μ‚¬ν•­μ΄λ‚˜ 지원이 ν•„μš”ν•˜λ‹€λ©΄ μ–Έμ œλ“ μ§€ λ²„μ¦ˆλΉŒμ— λ¬Έμ˜μ£Όμ„Έμš”.
λ²„μ¦ˆλΉŒ κΈ°μˆ μ§€μ›νŒ€ 메일: tech-support@buzzvil.com