SDK ์‚ฝ์ž…

๋ถ„์„ ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ ๊ตฌ์„ฑ์š”์†Œ์ธ SDK๋Š” ์•ฑ ์ธ์Šคํ†จ๊ณผ ์ธ์•ฑ ์ด๋ฒคํŠธ๋ฅผ ์–ดํŠธ๋ฆฌ๋ทฐํŠธํ•˜๊ณ  ์ธ์•ฑ ์• ๋„๋ฆฌํ‹ฑ์Šค์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ํฌ์ธํŠธ๋ฅผ ํ™•๋ณดํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ณธ ๋ฌธ์„œ์˜ ์•ˆ๋‚ด์— ๋”ฐ๋ผ Wisetracker SDK๋ฅผ Android App์— ์—ฐ๋™ํ•˜์—ฌ ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

1. ํ•„์ˆ˜ ์„ค์ •

ํ•„์ˆ˜ ์„ค์ •์ด๋ž€ SDK๊ฐ€ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฐ˜๋“œ์‹œ ์•ฑ์— ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ์„ค์ •์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ํ•„์ˆ˜ ์„ค์ •์„ ์ ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์ธ์Šคํ†จ, ์„ธ์…˜, ๋‹จ๋ง๊ธฐ ์ •๋ณด ๋“ฑ์„ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์•ฑ์— SDK ์ถ”๊ฐ€ (JFrog Artifactory ์ด์šฉ)

ํ”„๋กœ์ ํŠธ์˜ build.gradle ( root ํŒŒ์ผ ) ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์™€์ด์ฆˆํŠธ๋ž˜์ปค์˜ maven repository ์ฃผ์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

allprojects {
    repositories {
        google()
        mavenCentral()
        /* sdk repository url ์ถ”๊ฐ€ */ 
        maven { url 'https://wisetracker.jfrog.io/artifactory/wisetracker-gradle-release-local' }
    }
}

์•ฑ์— SDK ์ถ”๊ฐ€ (Github Package ์ด์šฉ)

ํ”„๋กœ์ ํŠธ์˜ build.gradle ( root ํŒŒ์ผ ) ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์™€์ด์ฆˆํŠธ๋ž˜์ปค์˜ Repository ์ฃผ์†Œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

allprojects {
    repositories {
        google()
        mavenCentral()
        /* wisetracker sdk repository config */
        maven {
            def endPoint = "https://analytics.wisetracker.co.kr/console/android/sdk/github/credentials.do"
            url = uri(new URL(endPoint+'?name=URI').text)
            credentials {
                username = new URL(endPoint+'?name=USER').text
                password = new URL(endPoint+'?name=TOKEN').text
            }
        }
    }
}

์•„๋ž˜์™€ ๊ฐ™์€ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ณด์—ฌ์ง€๋Š” ๊ฒฝ์šฐ, "Gradle Scripts"์˜ "settings.properties"ํŒŒ์ผ์„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

...
dependencyResolutionManagement {
  
  // =====================
  // ์œ„์™€ ๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด
  // ์•„๋ž˜ ํ•œ ์ค„์„ ์ฃผ์„์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  // =====================
  
  // repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)

  repositories {
    google()
    mavenCentral()
    ...
  }
}
*/
...

"app"๋ชจ๋“ˆ๋‹จ์œ„์˜ app/build.gradle ํŒŒ์ผ์— ์žˆ๋Š” dependencies์— ์•„๋ž˜์™€ ๊ฐ™์ด Wisetracker SDK๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    ....
    // SDK
    implementation "com.sdk.wisetracker:base_module:latest.release"
    implementation "com.sdk.wisetracker:new_dot_module:latest.release"
}

AuthorizationKey ๋“ฑ๋ก

ํ”„๋กœ์ ํŠธ์˜ app/res/values/strings.xml ํŒŒ์ผ์— ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

<string-array name="dotAuthorizationKey">
    <item name="useMode">1</item>
    <item name="serviceNumber">xxxxx</item>    /* ์„œ๋น„์Šค ๋ฒˆํ˜ธ ํ•„์ˆ˜ ๋ณ€๊ฒฝ! */
    <item name="expireDate">14</item>
    <item name="isDebug">false</item>
    <item name="isInstallRetention">true</item>
    <item name="isFingerPrint">true</item>
    <item name="accessToken"></item>
</string-array>

์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ ์ค‘ serviceNumber์˜ value๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์™€์ด์ฆˆํŠธ๋ž˜์ปค ๋Œ€์‹œ๋ณด๋“œ์— ๋กœ๊ทธ์ธํ•˜์—ฌ ์„ค์ • > ์„œ๋น„์Šค์„ค์ • ๋ฉ”๋‰ด์—์„œ '์„œ๋น„์Šค๋ฒˆํ˜ธ' ํ•ญ๋ชฉ์— ๊ธฐ์žฌ๋œ ์ˆซ์ž๋ฅผ ํ™•์ธ ํ›„ ๋ณต์‚ฌํ•˜์—ฌ serviceNumber ๊ฐ’์„ ๋ณ€๊ฒฝ ํ•ด ์ฃผ์„ธ์š”.

์„œ๋น„์Šค๋ฒˆํ˜ธ ํ™•์ธ

HTTP ํ†ต์‹  ํ—ˆ์šฉ

ํ”„๋กœ์ ํŠธ์˜ Target API๊ฐ€ API Level 28 ์ด์ƒ์ผ ๊ฒฝ์šฐ์— ์ ์šฉํ•˜๋Š” ์„ค์ •์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์ด HTTP ํ†ต์‹ ์„ ํ—ˆ์šฉํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.

AndroidManifest.xml ์„ค์ •

<!-- AndroidManifest.xml -->
<application
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:networkSecurityConfig="@xml/network_security_config"  /* ์ถ”๊ฐ€ */
    android:theme="@style/AppTheme">

app/res/xml/network_security_config.xml ์„ค์ •

  • ์ด ํŒŒ์ผ์ด ์—†์œผ๋ฉด ํ•ด๋‹น ์œ„์น˜์— ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ฃผ์„ธ์š”.

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">trk.analytics.wisetracker.co.kr</domain>
    </domain-config>
</network-security-config>

ํ”„๋กœ๊ฐ€๋“œ(Proguard) ์„ค์ •

ํ”„๋กœ์ ํŠธ์— ํ”„๋กœ๊ฐ€๋“œ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ, ์™€์ด์ฆˆํŠธ๋ž˜์ปค(Wisetracker) SDK ๊ด€๋ จ ์˜ˆ์™ธ ์„ค์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ๊ฐ€๋“œ ์„ค์ • ํŒŒ์ผ ํ•˜๋‹จ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.

# app/proguard-rules.pro

# --- wisetracker ์ด๋ฆ„/์ฝ”๋“œ ๋ชจ๋‘ ๋ณด์กด(๋‚œ๋…ํ™”/์ถ•์†Œ ์ œ์™ธ) ---
-keepattributes *Annotation*,InnerClasses,EnclosingMethod,Signature
-keep class com.google.gson.** { *; }
-keep class com.sdk.wisetracker.** { *; }

์ดˆ๊ธฐํ™”

Application์„ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค๊ฐ€ ์•„๋‹Œ Activity๋ฅผ ์ƒ์†๋ฐ›๋Š” ๊ธฐ๋ณธ ํ™”๋ฉด์˜ onCreate() ํ•จ์ˆ˜์— ์ ์šฉํ•ด ์ฃผ์„ธ์š”. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๊ธฐ๋ณธ ํ™”๋ฉด์€ AndroidManifest.xml ํŒŒ์ผ์— ์„ ์–ธ๋œ Activity ์ค‘, "android.intent.action.MAIN" ์™€ "android.intent.category.LAUNCHER" Intent-Filter ๊ฐ€ ์ ์šฉ๋œ Activity๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

import com.sdk.wisetracker.new_dot.open.DOT;
import com.sdk.wisetracker.base.tracker.data.init.InitializeManager;

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) { 
        // SDK ์ดˆ๊ธฐํ™”.
        if (!InitializeManager.initComplete) {
            DOT.initialization(this);
        }
        else if (getIntent() != null){
            DOT.setDeepLink(getApplicationContext(), getIntent());
        }
    }
}

์–ดํŠธ๋ฆฌ๋ทฐ์…˜ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ

DOT.getAttributedInfo ํ˜ธ์ถœ์„ ํ†ตํ•ด ์™€์ด์ฆˆํŠธ๋ž˜์ปค ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์ƒ์„ฑํ•œ ์–ดํŠธ๋ฆฌ๋ทฐ์…˜๋งํฌ๋ฅผ ํ†ตํ•ด ์•ฑ์„ ์„ค์น˜ํ•œ ์œ ์ €(non-organic)์˜ attribute ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ํ•„์ˆ˜ ์ฒดํฌ ์‚ฌํ•ญ

1

Android SDK ์ตœ์‹ ๋ฒ„์ „์ด ์ ์šฉ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2

Android API ๊ฐ€ 26 ์ด์ƒ ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

3

SDK ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜ DOT.initialization(this)ํ˜ธ์ถœํ•œ ์ดํ›„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (!InitializeManager.initComplete) {
           // SDK ํ˜ธ์ถœ
            DOT.initialization(this);
            
            // attribute ์ •๋ณด๋ฅผ ์ถ”์ถœ
            DOT.getAttributedInfo(new DOT.AttributedInfoCallback() {
                @Override
                public void doTask(Map<String, Object> result) {
                    WiseLog.d("current attribution data on main activity ( onCreate ) : " + result.toString());
                    // result ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ•„์š”์— ๋”ฐ๋ผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
                }
            });
        }
        else if (getIntent() != null){
            DOT.setDeepLink(getApplicationContext(), getIntent());
        }
    }
}

result ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ํ˜•ํƒœ๋Š” ์•„๋ž˜์˜ ์˜ˆ์‹œ๋ฅผ ์ฐธ๊ณ  ํ•ด์ฃผ์„ธ์š”.

(result ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด Organic ์œผ๋กœ ์‹๋ณ„๋œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.)

โ‘  ์•ฑ์„ค์น˜(์˜ˆ์‹œ)

{
  install_media="P1540365166967",      >> ๊ด‘๊ณ ์ฑ„๋„    
  install_mediaNm="WISE_TEST1",        >> ๊ด‘๊ณ ์ฑ„๋„๋ช… 
  install_campaign="C1710215861051",   >> ๊ด‘๊ณ ์บ ํŽ˜์ธ  
  install_campaignNm="WISETRACKER",    >> ๊ด‘๊ณ ์บ ํŽ˜์ธ๋ช…
  install_medium="",                   >> ๊ด‘๊ณ ํƒ€์ž…
  install_keyword=""                   >> ๊ด‘๊ณ ํ‚ค์›Œ๋“œ   
}

โ‘ก ์•ฑ์‹คํ–‰(์˜ˆ์‹œ)

{
  open_media="P1540365166967",
  open_mediaNm="WISE_TEST1",
  open_campaign="C1710215861051",
  open_campaignNm="WISETRACKER",
  open_medium="",
  open_keyword=""
}

์ด๋ฒคํŠธ ์„ค์ •

โœ…ํ™”๋ฉด์ „ํ™˜ ๋˜๋Š” ์ด๋ฒคํŠธ ๋ถ„์„์„ ์œ„ํ•œ ์ ์šฉ ๋ฐฉ๋ฒ•์€ ํ”Œ๋Ÿฌ๊ทธ์ธ ์„ค์ • ๋ฐ ์ดˆ๊ธฐํ™” ์ดํ›„์— ์•„๋ž˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๊ฑฐ๋‚˜, ์ขŒ์ธก IN-APP EVENT ๋ฉ”๋‰ด๋ฅผ ํ†ตํ•ด ๊ฐ€์ด๋“œ๋ฅผ ํ™•์ธํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘‰ํŽ˜์ด์ง€ ๋ถ„์„ ๊ฐ€์ด๋“œ๋กœ ์ด๋™ํ•˜๊ธฐ

๐Ÿ‘‰์ธ์•ฑ ์ด๋ฒคํŠธ ์„ค์ •์œผ๋กœ ์ด๋™ํ•˜๊ธฐ

Hybrid App์„ ์œ„ํ•œ ์„ค์ • ์ถ”๊ฐ€

Hybrid App์ธ ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉํ•˜๋ฉด ๋˜๋Š” ์„ค์ •์œผ๋กœ, WebView๋กœ ํ‘œ์‹œํ•œ ์›นํŽ˜์ด์ง€ ๋‚ด์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์›น๋ทฐ๋กœ ๋ถˆ๋Ÿฌ์˜จ ํŽ˜์ด์ง€๋ฅผ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์Œ๊ณผ ๊ฐ™์ด setWebView ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์ฃผ์„ธ์š”.

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    WebView webView = findViewById(R.id.web_view);
    ...
    // SDK ํ˜ธ์ถœ
    DOT.setWebView(webView);
}

๊ทธ๋ฆฌ๊ณ  WebViewClient ์˜ ๊ฐ๊ฐ์˜ ์ฝœ๋ฐฑ์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ ์šฉํ•ด์ฃผ์„ธ์š”.

webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        // 1. document ์— DOT ๊ฐ์ฒด ์ฃผ์ž….
        WiseLog.d("onPageStarted" + url );
        DOT.injectSdkToHtmlDocument(view,true);
        super.onPageStarted(view,url,favicon);
    } 

    @Override
    public void onPageFinished(WebView view, String url) {
        WiseLog.d("onPageFinished" + url );
        DOT.injectJavascriptWithDomSearch(view,url,true);
        super.onPageFinished(view, url);
    }
});

2. ๊ณ ๊ธ‰ ์„ค์ •

๊ณ ๊ธ‰ ์„ค์ •์ด๋ž€ ๋ฐ˜๋“œ์‹œ ์ ์šฉํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ ์™€์ด์ฆˆํŠธ๋ž˜์ปค์˜ ํ™•์žฅ๋œ ๋ถ„์„๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ์„ค์ •์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ์„ ํƒ์ ์œผ๋กœ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ด์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์•ฑ ๋งํฌ ์„ค์ • ๊ฐ€์ด๋“œ๋Š” ๋ณ„๋„์˜ ๋ฌธ์„œ์— ์ •๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

App Link ์„ค์ •

๋”ฅ๋งํฌ๊ฐ€ ์„ค์ •๋œ url ์„ ํ†ตํ•ด์„œ ์˜คํ”ˆ๋œ ์ด๋ฒคํŠธ๋ฅผ ๋ถ„์„ํ•ฉ๋‹ˆ๋‹ค. AndroidManifest.xml ํŒŒ์ผ์—์„œ ์•ฑ์˜ ํ™˜๊ฒฝ์— ๋งž์ถฐ ๋”ฅ๋งํฌ๋กœ ์˜คํ”ˆ๋˜๋Š” Activity์˜ android:host, android:scheme ๊ฐ’์„ ์„ค์ •ํ•ด ์ฃผ์„ธ์š”.

โœ”๏ธ์™€์ด์ฆˆํŠธ๋ž˜์ปค ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์ƒ์„ฑํ•œ ์–ดํŠธ๋ฆฌ๋ทฐ์…˜๋งํฌ๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ ๋ฐ ๊ด‘๊ณ ์ง‘ํ–‰์„ ์ง„ํ–‰ํ•˜๋ฉฐ, ๋”ฅ๋งํฌ ํด๋ฆญ ์‹œ ์™€์ด์ฆˆํŠธ๋ž˜์ปค ์„œ๋ฒ„๊ฐ€ ์•ฑ์˜ ์„ค์น˜ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜์—ฌ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ "https://xxxx.page.link" ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น URL์ด ๊ฐ€๋ฅดํ‚ค๋Š” ์›น์œผ๋กœ ์ด๋™ํ•จ์œผ๋กœ์จ ์™€์ด์ฆˆํŠธ๋ž˜์ปค๊ฐ€ ์ˆ˜์ง‘ํ•˜์—ฌ์•ผ ํ•˜๋Š” ๊ด‘๊ณ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ’์ด ์œ ์‹ค๋  ์ˆ˜ ์žˆ์–ด, ์•ฑ์œผ๋กœ ๋ฐ”๋กœ ์ด๋™ ๊ฐ€๋Šฅํ•œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ Unique ํ•œ ์ปค์Šคํ…€์Šคํ‚ค๋งˆ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ ์œ ๋‹ˆ๋ฒ„์…œ๋งํฌ๊ฐ€ ์กด์žฌ ํ•œ๋‹ค๋ฉด ์™€์ด์ฆˆํŠธ๋ž˜์ปค์—์„œ ์‚ฌ์šฉํ•  ๋”ฅ๋งํฌ ์ง„์ž… ์Šคํ‚ค๋งˆ ์„ค์ •์„ '์ถ”๊ฐ€' ํ•ด ์ฃผ์„ธ์š”. (๋”ฅ๋งํฌ์Šคํ‚ค๋งˆ ์„ค์ • ์ถ”๊ฐ€์‹œ ๋‹ค๋ฅธ ๋งํฌ์— ์–ด๋– ํ•œ ์˜ํ–ฅ๋„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.)

<!-- ์˜ˆ์‹œ๋Š” wisetracker://wisetracker.co.kr ๋งํฌ๋กœ ์•ฑ ์ง„์ž… ๊ฒฝ์šฐ -->
<activity android:name="com.sample.DeepLinkActivity"
          android:launchMode="singleTop" >
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <!-- ๋”ฅ๋งํฌ๋กœ ์ง„์ž…๋  ์Šคํ‚ค๋งˆ์™€ ํ˜ธ์ŠคํŠธ ์ •๋ณด ์ˆ˜์ • -->
        <data android:host="wisetracker.co.kr"
              android:scheme="wisetracker" />
    </intent-filter>
</activity>

์œ„์˜ ์ƒ˜ํ”Œ ์ฝ”๋“œ์™€ ๊ฐ™์ด AndroidManifest.xml์— ์„ค์ •์„ ๋งˆ์น˜์‹œ๊ฒŒ ๋˜์‹œ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ์˜ ์ปค์Šคํ…€ ์Šคํ‚ค๋งˆ๊ฐ€ ์„ค์ •๋œ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

wisetracker://wisetracker.co.kr

์—ฌ๊ธฐ์„œ wisetracker:// ๋ถ€๋ถ„์ดScheme(ํ˜น์€ ํ”„๋กœํ† ์ฝœ) ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์•ฑ์— ์ด Scheme๋ฅผ ์“ธ ๊ฒƒ์ด๋ผ๊ณ  ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ, ํ•ด๋‹น Scheme๋งŒ ์„ค์ •์„ ํ•˜์…”๋„ ๋ฉ๋‹ˆ๋‹ค. ์ด์–ด์„œ wisetracker.co.kr ๋ถ€๋ถ„์€ ํŠน์ • ํŽ˜์ด์ง€์— ๋„๋‹ฌํ•˜๋„๋ก ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ host(ํ˜น์€ path or ๋„๋ฉ”์ธ) ์ž…๋‹ˆ๋‹ค.

๋”ฅ๋งํฌ ๋ถ„์„

๋”ฅ๋งํฌ๋กœ ์‹คํ–‰๋˜๋Š” Activity์˜ onCreate์™€ onNewIntent์— ์•„๋ž˜์™€ ๊ฐ™์ด setDeepLink๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

public class DeepLinkActivity extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        /* ์ค‘๋žต.. */
        if (!InitializeManager.initComplete) {
            DOT.initialization(this);
        }
        else if (getIntent() != null){
            DOT.setDeepLink(getApplicationContext(), getIntent());
        }
    }
    
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        DOT.setDeepLink(getApplicationContext(), getIntent());
    }
}

์™€์ด์ฆˆํŠธ๋ž˜์ปค 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
๋”ฅ๋งํฌ ์„ค์ • ํ›„ ํ…Œ์ŠคํŠธ์‹œ ๊ฐ€์ด๋“œ๋ถ์„ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

Deffered Deep Link (์ง€์—ฐ๋œ ๋”ฅ๋งํฌ) ์ ์šฉ

  1. ์ง€์—ฐ๋œ ๋”ฅ๋งํฌ ๊ธฐ๋Šฅ์€ Growth ๋ ˆ๋ฒจ ์ด์ƒ์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

  2. ์ง€์—ฐ๋œ ๋”ฅ๋งํฌ ๊ธฐ๋Šฅ ์ œ๊ณต SDK ๋ฒ„์ „ - Android SDK: Base Modeul - 1.0.81 ์ด์ƒ / New Dot Module - 1.0.51 ์ด์ƒ - iOS SDK: RW 1.1.52 ์ด์ƒ

๊ธฐ์กด์˜ DOT.initialization SDK ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜ ๋Œ€์‹  ์•„๋ž˜์˜ DOT.initializationForDeferredCallback ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ์ˆ˜์‹ ๋œ ์ง€์—ฐ๋œ ๋”ฅ๋งํฌ์˜ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.


// your code...

DOT.initializationForDeferredCallback(this, new Runnable() {
    @Override
    public void run() {
        // deferred deeplink  ์ •๋ณด๋Š” DOT.getDeferredUrl() ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ,
        // ์•ฑ์—์„œ๋Š” ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ. 
        // 1. callback ์ด ํ˜ธ์ถœ๋˜๋Š” ์‹œ์ ์— ์ฆ‰์‹œ __deferredUrl ํ™”๋ฉด์œผ๋กœ ์ด๋™ ์ฒ˜๋ฆฌ. __deferredUrl ๊ฐ’์ด nil ์ด๋ฉด ๋ฉ”์ธ ํ™”๋ฉด์œผ๋กœ ์ด๋™ ์ฒ˜๋ฆฌ. 
        // 2. __deferredUrl ๋ณ€์ˆ˜๊ฐ’์„ ์–ด๋”˜๊ฐ€์— ์ €์žฅํ•˜๊ณ , ํšŒ์›๊ฐ€์ž… ์ดํ›„, ๋กœ๊ทธ์ธ์ด ์™„๋ฃŒ๋œ ์ดํ›„๋“ฑ๊ณผ ๊ฐ™์ด ํ•„์š”ํ•œ ์‹œ์ ์— ์ €์žฅ๋œ ๊ฐ’์„ ๊บผ๋‚ด์„œ ์ด๋™ ์ฒ˜๋ฆฌ.
        // 3. ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ Deferred deeplink ์ •๋ณด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š”, __deferredUrl ๊ฐ’์ด ๋„(NULL) ์ด ๋  ์ˆ˜ ์žˆ์Œ์„ ๊ณ ๋ คํ•˜์—ฌ ์‚ฌ์šฉ.          
        String __deferredUrl = DOT.getDeferredUrl();
        WiseLog.d("current deferred url : " + __deferredUrl);
    }
});

// your code...

์œ„์™€ ๊ฐ™์ด ์ง€์—ฐ๋œ ๋”ฅ๋งํฌ์— ๋Œ€ํ•œ ๋Œ€์‘ ์ฝ”๋“œ๊ฐ€ ์ ์šฉ๋œ ์ดํ›„์— ์™€์ด์ฆˆํŠธ๋ž˜์ปค ๋Œ€์‰ฌ๋ณด๋“œ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์–ดํŠธ๋ฆฌ๋ทฐ์…˜ ๋งํฌ๋ฅผ ์ƒ์„ฑํ•˜์˜€๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ง€์—ฐ๋œ ๋”ฅ๋งํฌ(๋””ํผ๋“œ ๋”ฅ๋งํฌ)๊ฐ€ ์‚ฌ์šฉ๋œ ์–ดํŠธ๋ฆฌ๋ทฐ์…˜ ๋งํฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ์•ฑ์ด ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์•˜๋˜ ๊ฒฝ์šฐ๋ผ๋ฉด, ๋จผ์ € ์•ฑ ์„ค์น˜๋ฅผ ์œ„ํ•ด ๋งˆ์ผ“(๊ตฌ๊ธ€์Šคํ† ์–ด, ์•ฑ์Šคํ† ์–ด)์œผ๋กœ ์ด๋™๋˜๊ณ , ์•ฑ ์„ค์น˜ ์ดํ›„์— ์•ฑ์„ ์‹คํ–‰์‹œํ‚ค๊ฒŒ ๋˜๋ฉด String __deferredUrl ๋ณ€์ˆ˜์— ์„ค์ •ํ•œ ์•ฑ ์‹คํ–‰ ๋งํฌ๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์˜ˆ: wisetester://mainscreen)

๋”ฐ๋ผ์„œ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” (๋””ํผ๋“œ) ๋”ฅ๋งํฌ ๊ฐ’์— ๋”ฐ๋ผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ์ดํ›„ ์•ก์…˜์— ๋Œ€ํ•ด ๋Œ€์‘๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐœ๋ฐœํ•ด ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Facebook ๊ด‘๊ณ  ์„ฑ๊ณผ ์ธก์ •

Facebook App Ads์˜ ํผํฌ๋จผ์Šค๋ฅผ ์™€์ด์ฆˆํŠธ๋ž˜์ปค๋กœ ์ธก์ •ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์„ค์ •์œผ๋กœ, Facebook SDK๊ฐ€ ์•ฑ์— ์ถ”๊ฐ€๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์„ค์ •์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋น„์ฆˆ๋‹ˆ์Šค ์ธ์ฆ

Facebook Developer ์‚ฌ์ดํŠธ์˜ ์•ฑ์„ค์ •-๊ธฐ๋ณธ์„ค์ •์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ์ธ์ฆ ์—ฌ๋ถ€๋ฅผ ํ™•์ธ ํ•ด ์ฃผ์„ธ์š”. ๋น„์ฆˆ๋‹ˆ์Šค ์ธ์ฆ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ, ๋ฆฌํผ๋Ÿฌ ์ •๋ณด๊ฐ€ ์ˆ˜์‹ ๋˜์ง€ ์•Š์•„, facebook ๊ด‘๊ณ  ์„ฑ๊ณผ์— ๋Œ€ํ•œ ์ธก์ •์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์„ค์ • ์ ์šฉ

ํ”„๋กœ์ ํŠธ์˜ app/res/values/strings.xml ํŒŒ์ผ์— ์•„๋ž˜ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 <!-- facebook AppLinkData ์‚ฌ์šฉ ์—ฌ๋ถ€  -->
    <string name="useFacebookAppLinkData">Y</string>

์ตœ์ดˆ๋กœ ์‹คํ–‰๋˜๋Š” Activity์˜ onCreate์— ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์„ธ์š”.

import com.facebook.applinks.AppLinkData;

// call Facebook API
AppLinkData.fetchDeferredAppLinkData(getApplicationContext(), new AppLinkData.CompletionHandler() {
    @Override
    public void onDeferredAppLinkDataFetched(AppLinkData appLinkData) {
        if (appLinkData == null) {
            DOT.receiveFailFacebookReferrer(1);
            return ;
        }
        Bundle bundle = appLinkData.getArgumentBundle();
        if (bundle == null) {
            DOT.receiveFailFacebookReferrer(2);
            return;
        }
        DOT.setFacebookReferrer(bundle);
    }
});

๋ฐ์ดํ„ฐ ํ™•์ธ

Facebook์˜ App Ads Helper๋กœ Deferred Deep Linking ์„ ํ…Œ์ŠคํŠธ ํ•จ์œผ๋กœ์จ ์œ„ ์„ค์ •์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ ์šฉ ๋˜์—ˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ค€๋น„์‚ฌํ•ญ

  1. Android ํ…Œ์ŠคํŠธ ๋‹จ๋ง๊ธฐ ํ™˜๊ฒฝ

    • ๋‹จ๋ง๊ธฐ์— Facebook ์•ฑ์„ ์„ค์น˜ํ•˜๊ณ  Facebook ๊ฐœ๋ฐœ์ž ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•ด์ฃผ์„ธ์š”.

    • ๋‹จ๋ง๊ธฐ์— ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์•ฑ(๊ณ ๊ฐ์‚ฌ ์•ฑ)์ด ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋ฉด ์‚ญ์ œํ•ด์ฃผ์„ธ์š”.

    • ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ์™€ USB ๋””๋ฒ„๊น…์„ ํ™œ์„ฑํ™” ํ•ด์ฃผ์„ธ์š”.

  2. ๋ฐ์Šคํฌํƒ‘ ํ™˜๊ฒฝ

    • Android Studio๋ฅผ ์„ค์น˜ํ•ด์ฃผ์„ธ์š”.

    • USB๋กœ ์—ฐ๊ฒฐ๋œ ํ…Œ์ŠคํŠธ ๋‹จ๋ง๊ธฐ์˜ log๋ฅผ Android Studio์˜ logcat์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  3. Facebook ์„ค์ •

    • ํ…Œ์ŠคํŠธ ๋Œ€์ƒ ์•ฑ์ด Facebook Developer์— ๋“ฑ๋ก๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ๊ฐœ๋ฐœ์ž ๊ณ„์ •์œผ๋กœ ๋กœ๊ทธ์ธํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์•ฑ ์„ค์น˜ํ˜• ๊ด‘๊ณ  ํ…Œ์ŠคํŠธ

  1. https://developers.facebook.com -> ๋„๊ตฌ -> ์•ฑ ๊ด‘๊ณ  ์ง€์› ๋„๊ตฌ ๋ฉ”๋‰ด๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

(https://developers.facebook.com/tools/app-ads-helper/)

  1. ํ…Œ์ŠคํŠธํ•  ์•ฑ์„ ์„ ํƒํ•œ ํ›„ ํŽ˜์ด์ง€ ํ•˜๋‹จ Developer Tool์˜ ๋”ฅ๋งํฌ ํ…Œ์ŠคํŠธ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.

  1. PC์—์„œ Android Studio๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ํ…Œ์ŠคํŠธ ๋‹จ๋ง๊ธฐ๋ฅผ USB๋กœ ์—ฐ๊ฒฐํ•˜์—ฌ ๊ด€๋ จ ๋กœ๊ทธ๋ฅผ logcat์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. ์•ฑ์ด ์ˆ˜์‹ ํ•œ Deep Link Referrer๋ฅผ logcat์—์„œ ํ™•์ธํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  2. Facebook ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ์•ฑ์˜ ์ปค์Šคํ…€ ์Šคํ‚ค๋งˆ๋ฅผ Send Deep Link์— ์ž…๋ ฅํ•˜๊ณ  Send to Android ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ์ „์†ก์ง€์—ฐ์€ ๋ฐ˜๋“œ์‹œ ์ฒดํฌ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. '์ „์†ก์ง€์—ฐ'์„ ์„ ํƒํ•œ ๊ฒฝ์šฐ Facebook ์•ฑ์— ์•Œ๋ฆผ์€ ์ˆ˜์‹ ๋˜์ง€ ์•Š์ง€๋งŒ, ์•„๋ž˜์™€ ๊ฐ™์€ ํŒ์—…์ด ๋ฐœ์ƒ ํ•˜์˜€๋‹ค๋ฉด ์ธ์Šคํ†จ๋ฆฌํผ๋Ÿฌ ์ˆ˜์‹ ์„ ์œ„ํ•œ ์ค€๋น„๊ฐ€ ์™„๋ฃŒ ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ์•ˆ๋“œ๋กœ์ด๋“œ ์ŠคํŠœ๋””์˜ค๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์•ฑ์„ ์‹คํ–‰ํ•˜๊ณ  ๋กœ๊ทธ๋ฅผ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค. Facebook์— ์ž…๋ ฅํ•œ ์ปค์Šคํ…€ ์Šคํ‚ค๋งˆ๊ฐ€ ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ logcat์—์„œ ๋ณด์ธ๋‹ค๋ฉด ํŽ˜์ด์Šค๋ถ ์•ฑ ์„ค์น˜ ๊ด‘๊ณ ์— ๋Œ€ํ•œ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์•ฑ ์ฐธ์—ฌํ˜• ๊ด‘๊ณ  ํ…Œ์ŠคํŠธ

  1. ์•ฑ ์ฐธ์—ฌ ๊ด‘๊ณ ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋ฏธ ์•ฑ์„ ์„ค์น˜ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ด‘๊ณ ๋ฅผ ํด๋ฆญํ•˜์—ฌ ์•ฑ์„ ์‹คํ–‰ํ•˜๋Š” ์‹œ์ ์— ํŽ˜์ด์Šค๋ถ ๊ด‘๊ณ ์— ๋“ฑ๋กํ•œ ๋”ฅ ๋งํฌ๊ฐ’์ด ๋™์ž‘ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

  2. ์•ฑ ์ฐธ์—ฌ ๊ด‘๊ณ  ๋“ฑ๋ก ์‹œ ์‚ฌ์šฉํ•œ ๋”ฅ ๋งํฌ๋ฅผ Send Deep Link ์˜์—ญ์— ์ž…๋ ฅ ํ›„ Send to Android ๋ฒ„ํŠผ์„ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ ์ „์†ก ์ง€์—ฐ๋Š” ๋ฐ˜๋“œ์‹œ ์ฒดํฌ ํ•ด์ œ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  3. ํ…Œ์ŠคํŠธ ๋‹จ๋ง๊ธฐ์˜ Facebook ์•ฑ์— ์•Œ๋ฆผ์ด ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋งํฌ๋ฅผ ํด๋ฆญํ•˜์—ฌ ์•ฑ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  4. Facebook์— ์ž…๋ ฅํ•œ ์ปค์Šคํ…€ ์Šคํ‚ค๋งˆ๊ฐ€ ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ logcat์—์„œ ๋ณด์ธ๋‹ค๋ฉด ํŽ˜์ด์Šค๋ถ ์•ฑ ๊ด‘๊ณ ์— ๋Œ€ํ•œ ๋ถ„์„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Last updated

Was this helpful?