본문으로 건너뛰기

유입 경로 설정(딥 링크 사용 시 유입 URL 설정)

네이버 광고를 통한 전환을 추적하려면 랜딩 URL로 딥 링크를 사용해야 합니다.

Universal Link(iOS)와 App Link(Android), Custom URL Scheme(iOS, Android)을 통해 앱으로 유입될 수 있습니다. Universal Link, App Link, Custom URL Scheme을 통해 앱으로 전환이 발생한 경우 해당 URL을 수집하여 전환 측정의 정확도를 높일 수 있습니다.

iOS는 AppDelegate나 SceneDelegate를, Android는 Android Manifest에 설정된 Activity를 이용해 유입 URL 정보를 받을 수 있습니다.

주의

  • 전환 측정 정확도를 높이려면 setInflow API를 반드시 구현해야 합니다.
  • setInflow API를 호출하면 IDE 콘솔에 다음과 같은 로그를 출력합니다(SDK 버전 0.2.0 이상). SDK 적용 후 Universal Link, App Link, Custom URL Scheme을 통해 앱으로 진입한 경우 로그를 확인하여 API가 정상적으로 적용되었는지 확인해야 합니다.
    setInflow API called successfully. (inflow uri - [https://**********])
  • 타사 트래커에서 제공하는 딥 링크 기능을 이용하는 경우 해당 트래커에서 URL 정보를 가공하여 네이버 추적 정보가 유실될 수 있습니다. 따라서 트래커에서 가공하기 전에 앱으로 유입되는 최초 정보를 그대로 setInflow API에 전달해야 합니다.
  • 오가닉 전환(비광고 전환) 외 네이버 광고를 통한 전환 정보만 전송하려면, query parameter에 'gfa_click_id' 또는 'sa_click_id'가 포함된 URL만을 setInflow API로 전송합니다.

setInflow API를 이용한 유입 URL 설정

다음은 iOS, Android의 기본적인 앱 구성 샘플 코드입니다. 서비스별로 프로젝트 구성과 코드 구현 방식이 다를 수 있으므로 샘플 코드를 참고하여 서비스 상황에 맞게 구현해야 합니다.

iOS

SceneDelegate나 AppDelegate에서 유입 경로 정보를 받아 SDK의 setInflow API를 이용해 전달합니다. SwiftUI 앱인 경우 SceneDelegate나 AppDelegate를 사용하지 않을 수도 있습니다. 앱의 개발 프로젝트 구성에 따라 적절한 방식으로 구현합니다.

SceneDelegate를 사용하는 경우

SceneDelegate를 사용하는 경우 앱의 상태에 따라 다음의 4가지 경우를 모두 다른 지점에서 구현해야 합니다. Scene Dlegate Inflow 설정

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

func scene(_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions) {
// Universal Link URL. App is not running
if let urlUniversalLink = connectionOptions.userActivities.first?.webpageURL {
NTrackerExt.setInflow(url: urlUniversalLink)
}

// Custom URL Scheme. App is not running
if let urlCustomScheme = connectionOptions.urlContexts.first?.url {
NTrackerExt.setInflow(url: urlCustomScheme)
}

// Your Codes.
}

func scene(_ scene: UIScene,
continue userActivity: NSUserActivity) {
// Universal Link URL. App is running or suspended in memory
if userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let urlUniversalLink = userActivity.webpageURL {
NTrackerExt.setInflow(url: urlUniversalLink)
}

// Your Codes.
}

func scene(_ scene: UIScene,
openURLContexts URLContexts: Set<UIOpenURLContext>) {
// Custom URL Scheme. App is running or suspended in memory
if let urlCustomScheme = URLContexts.first?.url {
NTrackerExt.setInflow(url: urlCustomScheme)
}

// Your Codes.
}

}

AppDelegate를 사용하는 경우

AppDelegate를 사용하는 경우 앱 상태에 따른 구분은 필요 없습니다. Universal Link와 Custom URL Scheme을 다음과 같이 두 곳에서 처리하도록 구현합니다.

App Dlegate Inflow 설정

class AppDelegate: UIResponder, UIApplicationDelegate {

func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
// Universal Link URL
if userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let urlUniversalLink = userActivity.webpageURL {
NTrackerExt.setInflow(url: urlUniversalLink)
}

// Your Codes.
}

func application(_ app: UIApplication,
open url: URL,
options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {
// Custom URL Scheme
NTrackerExt.setInflow(url: url)

// Your Codes.
}

}

SwiftUI 앱인 경우

SwiftUI 앱은 Universal Link와 Custom URL Scheme을 동일한 방식으로 처리합니다. 또한 앱의 상태 구분도 필요하지 않습니다.

SwiftUI Inflow 설정

@main
struct SampleApp: App {

var body: some Scene {
WindowGroup {
ContentView()
.onOpenURL { url in
NTrackerExt.setInflow(url: url)
}
}
}

}

자세한 내용은 다음의 문서를 참고하세요.

Android

Android는 App Link와 Custom URL Scheme을 동일한 방식으로 처리합니다. 또한 앱의 상태 구분도 필요하지 않습니다. 인텐트 필터를 추가하여 유입 URL 정보를 수신할 Activity를 지정할 수 있습니다.

Android Inflow 설정

class SampleActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

handleIntent(intent)

// Your Codes.
}

override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)

handleIntent(intent)

// Your Codes.
}

private fun handleIntent(intent: Intent?) {
if (intent == null) {
return
}

val appLinkAction = intent.action
val appLinkData: Uri? = intent.data

if (Intent.ACTION_VIEW == appLinkAction) {
NTrackerExt.setInflow(appLinkData)
}

// Your Codes.
}
}

자세한 내용은 Android 앱 링크 처리하기를 참고하세요.

적용 후 검증

SDK 적용을 완료한 후 딥 링크를 통해 앱으로 유입되는 경우 유입 경로가 정상적으로 수집되는지 검증한 후에 스토어에 배포해야 합니다. 검증 방법은 다음과 같습니다.

  1. 앱으로 진입하는 딥 링크 URL에 'gfa_click_id'를 query parameter로 추가합니다. 예를 들어, 딥 링크 주소가 'https://deeplink.example.com/path'이면 'https://deeplink.example.com/path?gfa_click_id=TEST_CLICK_ID'와 같이 추가합니다.
  2. Click ID를 추가한 링크를 클릭하여 앱으로 진입합니다.
  3. IDE(XCode, Android Studio 등) 콘솔에서 로그를 확인합니다. 이때, enableDebugLog가 true로 설정되어 있어야 합니다.
    • setInflow API가 정상적으로 호출되면 이후 발생하는 전환 로그에 "attribution_info":{"gfa_click_id":"TEST_CLICK_ID"} 정보가 추가됩니다.
    • 이 정보는 수집 시점부터 기기에 저장하여 사용합니다. 따라서 반복적으로 테스트하는 경우에는 앱을 삭제하거나 앱 캐시를 삭제한 후 다음 테스트를 수행해야 합니다.

iOS 로그는 다음과 같습니다. iOS Log

Android 로그는 다음과 같습니다. Android Log