Android SDK - 딥링크 지원

딥링크 지원 추가하기

딥링크 는 앱 내의 특정 콘텐츠로 유저를 안내합니다. 앱이 설치된 디바이스에서 유저가 딥링크를 탭하면, 앱이 제품 페이지나 특정 경험과 같은 의도된 콘텐츠로 바로 열립니다.

Singular 트래킹 링크는 표준 딥링크(설치된 앱 대상)와 지연된 딥링크(신규 설치 대상)를 모두 지원합니다. 자세한 내용은 딥링크 FAQ Singular Links FAQ 를 참조하세요.


요구 사항

사전 준비 사항

앱의 딥링크를 활성화하려면 Singular Links 사전 준비 사항 을 완료하세요.


Singular Links 핸들러 구현

SingularLinkHandler는 앱이 열릴 때 Singular 트래킹 링크에서 딥링크, 지연된 딥링크 및 패스스루 파라미터를 가져오는 콜백 메커니즘을 제공합니다.

사용 가능한 파라미터:

  • 딥링크 (_dl): 링크를 클릭한 유저를 위한 앱 내 대상 URL
  • 지연된 딥링크 (_ddl): 링크를 클릭한 후 앱을 설치하는 유저를 위한 대상 URL
  • 패스스루 (_p): 추가 컨텍스트를 위해 트래킹 링크를 통해 전달되는 커스텀 데이터

SDK 구성

AndroidManifest 구성

SDK가 딥링크를 해석하기 전에, 액티비티는 인텐트 필터를 선언하여 Android가 들어오는 ACTION_VIEW 인텐트를 라우팅하도록 해야 합니다. AndroidManifest.xml 의 런처 액티비티(또는 딥링크를 수신해야 하는 액티비티)에 필터를 추가하고 사용자만의 scheme과 host로 대체하세요.

<activity
    android:name=".MainActivity"
    android:exported="true">
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>

    <!-- Custom URI scheme deep link -->
    <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:scheme="yourapp" />
    </intent-filter>

    <!-- HTTPS Singular Link (replace with your branded subdomain) -->
    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="http" />
        <data android:scheme="https" />
        <data android:host="yourcompany.sng.link" />
        <data android:pathPrefix="/A"/>
        <data android:pathPrefix="/B"/>
        <data android:pathPrefix="/E"/>
        <data android:pathPrefix="/F"/>
    </intent-filter>
</activity>

이러한 인텐트 필터가 없으면 OS는 딥링크 인텐트를 액티비티에 전달하지 않으며, SingularLinkHandler 콜백이 실행되지 않습니다. android:autoVerify="true" 가 포함된 HTTPS scheme의 App Links도 대상 도메인에 호스팅된 /.well-known/assetlinks.json 파일이 필요합니다.


Config에 SingularLinkHandler 추가

SDK 초기화 중에 SingularLinkHandler를 구성하여 들어오는 딥링크 및 지연된 딥링크 데이터를 처리하세요.

Kotlin Java
private fun initSingularSDK() {
    val config = SingularConfig("SDK_KEY", "SDK_SECRET")
        .withSingularLink(intent) { params ->
            val deeplink = params.deeplink
            val passthrough = params.passthrough
            val isDeferred = params.isDeferred

            Log.d("SingularLink", "Deeplink: ${deeplink ?: "null"}")
            Log.d("SingularLink", "Passthrough: ${passthrough ?: "null"}")
            Log.d("SingularLink", "Is Deferred: $isDeferred")

            // Handle deep link routing
            deeplink?.let { url ->
                handleDeepLink(url, isDeferred)
            }
        }

    try {
        Singular.init(applicationContext, config)
        Log.d("Singular", "SDK initialized successfully")
    } catch (e: Exception) {
        Log.e("Singular", "SDK initialization failed: ${e.message}")
    }
}

override fun onNewIntent(intent: Intent?) {
  super.onNewIntent(intent)
  // Configure onNewIntent to handle Warm start deeplinks
  intent?.let {
    setIntent(intent)
    initSingularSDK()
  }
}

참고: SingularLinkHandler는 앱이 Singular Link를 통해 열릴 때만 트리거됩니다. 자세한 내용은 Singular Links FAQ 를 참조하세요.

withSingularLink shortlinkTimeoutSec 인자 없이 호출될 경우 단축 링크 해석 타임아웃이 기본 10초로 설정됩니다. 이를 재정의하려면 세 개의 인자를 받는 오버로드 withSingularLink(Intent intent, SingularLinkHandler handler, long shortlinkTimeoutSec) 를 사용하세요. 인텐트 액션이 ACTION_VIEW 일 때, SDK는 또한 세션을 딥링크로 열린 것으로 표시하며 이는 어트리뷰션에 영향을 미칩니다.


핸들러 동작

SingularLinkHandler는 앱이 새로 설치되었는지 이미 설치되어 있는지에 따라 다르게 동작합니다.

신규 설치 (지연된 딥링크)

신규 설치에서는 앱이 실행될 때 Open URL이 존재하지 않습니다. Singular는 트래킹 링크에 딥링크 또는 지연된 딥링크 값이 포함되어 있는지 판단하기 위해 어트리뷰션을 완료합니다.

지연된 딥링크 흐름:

  1. 유저가 딥링크 값으로 구성된 Singular 트래킹 링크를 클릭합니다
  2. 유저가 앱을 설치하고 처음으로 엽니다
  3. Singular SDK가 첫 번째 세션을 Singular 서버로 전송합니다
  4. 어트리뷰션이 완료되고 트래킹 링크의 딥링크가 식별됩니다
  5. 딥링크 값이 isDeferred = true 와 함께 deeplink 파라미터로 SingularLinkHandler에 반환됩니다

지연된 딥링크 테스트:

  1. 테스트 디바이스에서 앱을 제거합니다 (현재 설치되어 있는 경우)
  2. 디바이스에서 Google Advertising ID (GAID)를 재설정합니다
  3. 디바이스에서 Singular 트래킹 링크를 클릭합니다 (딥링크 값으로 구성되어 있는지 확인하세요)
  4. 앱을 설치하고 엽니다

어트리뷰션이 성공적으로 완료되고, 지연된 딥링크 값이 SingularLinkHandler로 전달됩니다.

Pro Tip: 다른 패키지 이름(예: com.example.dev 대신 com.example.prod )을 사용하는 개발 빌드로 딥링크를 테스트할 때는, 개발 앱의 패키지 이름에 맞게 트래킹 링크를 구성하세요. 테스트 링크를 클릭한 후 앱 스토어에서 프로덕션 앱을 다운로드하는 대신 Android Studio 또는 APK를 통해 개발 빌드를 디바이스에 직접 설치하세요.


이미 설치됨 (즉시 딥링크)

앱이 이미 설치되어 있는 경우, Singular Link를 클릭하면 Android App Links 기술을 사용하여 앱이 즉시 열립니다.

즉시 딥링크 흐름:

  1. 유저가 Singular 트래킹 링크를 클릭합니다
  2. Android OS가 전체 Singular 트래킹 링크가 포함된 Open URL을 제공합니다
  3. SDK 초기화 중에 Singular가 Android Intent를 파싱합니다
  4. Singular가 deeplink passthrough 값을 추출합니다
  5. 값은 isDeferred = false 와 함께 SingularLinkHandler를 통해 반환됩니다

패스스루 파라미터

패스스루 파라미터를 사용하여 트래킹 링크 클릭에서 추가 데이터를 캡처하세요.

트래킹 링크에 passthrough (_p) 파라미터가 포함되어 있는 경우, SingularLinkHandler의 passthrough 파라미터는 해당 데이터를 포함합니다. 이를 사용하여 캠페인 메타데이터, 유저 세그멘테이션 데이터 또는 앱에서 필요한 모든 커스텀 정보를 캡처할 수 있습니다.

Kotlin Java
val config = SingularConfig("SDK_KEY", "SDK_SECRET")
    .withSingularLink(intent) { params ->
        // Extract passthrough data
        params.passthrough?.let { passthroughData ->
            try {
                // Parse and use custom data
                val jsonData = JSONObject(passthroughData)
                val campaignId = jsonData.optString("campaign_id")
                val userSegment = jsonData.optString("segment")

                Log.d("SingularLink", "Campaign ID: $campaignId")
                Log.d("SingularLink", "User Segment: $userSegment")
            } catch (e: JSONException) {
                Log.e("SingularLink", "Error parsing passthrough data", e)
            }
        }
    }

모든 쿼리 파라미터 전달

트래킹 링크 URL의 모든 쿼리 파라미터를 캡처하려면 _forward_params=2 파라미터를 추가하세요.

_forward_params=2 가 트래킹 링크에 추가되면, 모든 쿼리 파라미터가 SingularLinkHandler의 deeplink 파라미터에 포함되어 모든 파라미터가 포함된 완전한 URL에 액세스할 수 있습니다.

예시 트래킹 링크:
https://yourapp.sng.link/A1b2c/abc123?_dl=myapp://product/123&_forward_params=2&utm_source=facebook&promo=SALE2024

SingularLinkHandler는 다음을 수신합니다:
deeplink = "myapp://product/123?utm_source=facebook&promo=SALE2024"