개요
Singular 트래킹 링크에 대해 딥 링크와 디퍼드 딥 링크를 구현하여 사용자가 캠페인에서 앱 내 특정 화면으로 자연스럽게 이동할 수 있도록 하세요.
딥 링크는 앱 내부의 특정 콘텐츠를 여는 클릭 가능한 링크입니다. 지원해야 하는 두 가지 시나리오가 있습니다:
- 딥 링크 (다이렉트): 사용자가 이미 앱을 설치한 경우입니다. 사용자가 Singular Link를 탭하면 앱이 바로 해당 콘텐츠에서 열립니다.
- 디퍼드 딥 링크 (DDL): 사용자가 아직 앱을 설치하지 않은 경우입니다. 사용자가 링크를 탭하고 스토어에서 설치한 뒤, 첫 실행 시에도 앱이 의도한 콘텐츠로 라우팅합니다.
SDK 연동을 사용하면 Singular가 이 대부분을 자동으로 처리합니다. server-to-server(S2S) 연동에서는 기기에 SDK가 없으므로, 여러분의 팀이 두 가지 추가 작업을 담당해야 합니다: 앱이 수신한 딥 링크를 Singular로 전달하는 것과, Singular가 반환하는 디퍼드 딥 링크를 읽어 사용자를 라우팅하는 것입니다. 두 작업 모두 SESSION 엔드포인트를 통해 이루어집니다:
GET https://s2s.singular.net/api/v1/launch
이 문서의 위치:
이 가이드는 S2S 문서 모음의 일부입니다. 엔드포인트 기본 사항, 인증, 공통 파라미터에 대해서는
S2S Fundamentals 허브
를 참조하세요. 아래에서 사용되는 딥 링크 파라미터(
openuri
,
ddl_enabled
및 응답 필드)는
SESSION Endpoint API Reference
에 정의되어 있습니다.
리소스: Deep Linking FAQ | Singular Links FAQ
세 가지 설정 한눈에 보기
| 단계 | 역할 | 발생 위치 |
|---|---|---|
| 1. 앱 레벨 | Singular Links가 앱을 열도록 하고(iOS Universal Links / Android App Links) 딥 링크 목적지를 정의합니다. | Apple/Google 설정 + Singular 대시보드(Apps & Manage Links) |
| 2. SESSION (인바운드) |
Singular가 딥 링크 결과를 수신합니다. 앱이 열린 링크를
openuri
파라미터를 통해 전달합니다.
|
SESSION 요청 → Singular |
| 3. SESSION (아웃바운드) | 앱이 DDL 결과를 수신합니다. Singular가 응답으로 디퍼드 딥 링크를 반환하면, 여러분의 서버가 이를 앱에 전달합니다. | SESSION 응답 → 여러분의 서버 → 앱 |
1단계: 앱 레벨 설정
딥 링크가 작동하려면, 링크를 탭했을 때 브라우저 대신 앱이 열리도록 Singular Links가 OS에 의해 iOS Universal Links 및 Android App Links로 인식되어야 합니다. 기존의 URI 앱 스킴은 폴백으로 지원됩니다.
상세한 플랫폼별 단계는 표준 설정 가이드를 따른 다음, 아래 각 항목이 완료되었는지 확인하세요. 상세 단계는 Singular Links Prerequisites 및 How to Configure Deep Links 에 나와 있습니다. 여기에 있는 체크리스트는 필요한 순서와 팀에서 가장 흔히 놓치는 지점을 알려줍니다.
설정 체크리스트:
-
링크 서브도메인 추가
:
Attribution > Manage Links > Manage Link Domains
에서 추가합니다(예:
yourbrand.sng.link). 이것이 Singular Links가 사용하는 호스트입니다. -
iOS — Universal Links:
applinks:yourbrand.sng.link에 대해 Associated Domains capability를 활성화한 다음, Apple Developer Portal에서 App Prefix / Team ID를 복사하여 Settings > Apps > [iOS app] > Show Advanced Settings 에 입력합니다. 선택적으로 Xcode에서 URL Type으로 앱 스킴 폴백을 등록할 수 있습니다. -
Android — App Links:
SHA-256 서명 지문을 생성하고(프로덕션의 경우 Play Console, 디버그의 경우
keytool),AndroidManifest.xml에 Singular 도메인에 대한autoVerify인텐트 필터를 추가한 다음, 지문을 Settings > Apps > [Android app] > Show Advanced Settings > App Links SHA256 fingerprints 에 붙여넣습니다. - 딥 링크 정의 : Attribution > Manage Links > Create Link 에서 정의합니다(아래 필드 매핑 참조).
중요: iOS에서 Team ID 단계를 건너뛰면 모든 Singular Link가 App Store로 리디렉션되어 딥 링크가 작동하지 않습니다. 이는 올바르게 만들어진 링크가 앱을 열지 못하는 가장 흔한 원인입니다.
Manage Links 리디렉션 필드 매핑하기
링크를 생성할 때, 세 개의 리디렉션 필드가 이후 API에서 사용되는 세 가지 딥 링크 개념에 직접 매핑됩니다:
| Manage Links의 필드 | 의미 |
|---|---|
| 앱이 설치되지 않은 경우 이동할 곳 | 폴백 리디렉션. 일반적으로 App Store / Play Store 페이지입니다. |
| 앱이 이미 설치된 경우 이동할 곳 | 딥 링크 . 기존 사용자를 위한 앱 내 목적지입니다(2단계). |
| 설치 후 바로 이동할 곳 | 디퍼드 딥 링크 . 설치 후 신규 사용자를 위한 목적지입니다(3단계). 일반적으로 딥 링크와 동일한 값입니다. |
개발자 인계:
엔지니어링 팀은 플랫폼별 딥 링크 스킴과 목적지 URL 목록을 제공해야 합니다(예:
myapp://autumnfashion
).
2단계: SESSION (인바운드) — 딥 링크를 Singular로 전송
앱이 Singular Link를 통해 열리면, 전체 오프닝 URL을 캡처하여 SESSION 요청의
openuri
파라미터(URL 인코딩)로 Singular에 전송합니다. 이것이 Singular가 세션을 해당 링크에 어트리뷰션하고 딥 링크 결과를 보고하는 방식입니다. Singular Links를 사용할 때 필수입니다.
딥 링크 오픈 시 항상 SESSION을 전송하세요.
앱이 딥 링크, Universal Link 또는 App Link를 통해 열릴 때마다,
openuri
가 채워진 SESSION 요청을 전송하세요. 세션이 일반적으로 여전히 활성 상태로 간주되는 경우(즉, 타임아웃 윈도우와 관계없이)에도 마찬가지입니다.
URL에 실려 전달되는 Singular Link 파라미터
| 파라미터 | 의미 |
|---|---|
_dl
|
딥 링크 값(iOS와 Android에 대해 동일한 목적지). |
_ios_dl
/
_android_dl
|
플랫폼별로 다를 때 사용하는 플랫폼별 딥 링크 값. |
_p
|
패스스루 파라미터. 커스텀 라우팅을 위한 URL 인코딩된 JSON 또는 일반 문자열. |
앱에서 오프닝 URL 캡처하기
앱에는 오프닝 URL을 수신하여 SESSION 요청에 포함하도록 서버로 전달하는 핸들러 코드가 필요합니다.
iOS (Swift):
// Custom scheme / direct opens
func scene(_ scene: UIScene,
openURLContexts URLContexts: Set<UIOpenURLContext>) {
guard let url = URLContexts.first?.url else { return }
SessionReporter.report(openURL: url.absoluteString)
}
// Universal Links arrive via:
func scene(_ scene: UIScene,
continue userActivity: NSUserActivity) {
if let url = userActivity.webpageURL {
SessionReporter.report(openURL: url.absoluteString)
}
}
Android (Kotlin):
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
intent?.data?.let { uri ->
SessionReporter.report(uri.toString())
}
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
intent?.data?.let { SessionReporter.report(it.toString()) }
}
openuri를 포함하여 SESSION 요청 전송하기
서버에서 캡처한 URL(URL 인코딩)을
openuri
로 포함합니다:
curl -G https://s2s.singular.net/api/v1/launch \
--data-urlencode "a=<SDK key>" \
--data-urlencode "p=Android" \
--data-urlencode "i=com.yourcompany.app" \
--data-urlencode "aifa=<GAID>" \
--data-urlencode "n=YourAppName" \
--data-urlencode "openuri=myapp://home/page?queryparam1=value1"
숏 링크 리졸루션
사용자가 단축된 Singular Link를 연 경우,
singular_link_resolve_required=true
도 함께 전송하세요. Singular가 확장된 롱 링크를 반환하므로 딥 링크와 패스스루 값을 파싱할 수 있습니다.
응답 예시:
{
"status": "ok",
"resolved_singular_link": "https://myapp.sng.link/A59c0/nha7?_dl=myapp%3A%2F%2Fdeeplink&_ddl=myapp%3A%2F%2Fdeferred-deeplink&_p=passthroughvalue"
}
다이내믹 패스스루 파라미터
조직에서 링크에 대해 다이내믹 패스스루를 설정한 경우, 딥 링크 URL에는 콘텐츠 라우팅을 위한 URL 인코딩된 JSON 문자열 또는 비정형 문자열이 담긴
_p
파라미터가 포함됩니다.
Dynamic Passthrough Parameters
를 참조하세요.
참조: SESSION Endpoint API Reference (Deep Linking Parameters).
3단계: SESSION (아웃바운드) — 디퍼드 딥 링크를 앱에 전달
링크를 탭한 후 앱을 설치하는 사용자의 경우, 설치 후 첫 세션의 SESSION 응답에서 Singular가 디퍼드 딥 링크를 반환합니다. 여러분의 서버는 사용자를 라우팅할 수 있도록 그 값을 앱에 다시 전달해야 합니다.
첫 세션에서 DDL 요청하기
설치 후 첫 SESSION 요청에 다음 두 개의 파라미터를 추가하세요:
| 파라미터 | 용도 |
|---|---|
install=true
|
이것이 새로운 설치 후 첫 세션임을 표시합니다. |
ddl_enabled=true
|
앱이 응답에서 디퍼드 딥 링크를 기대한다는 것을 Singular에 알립니다. |
SESSION 요청 예시(install + DDL enabled):
curl -G https://s2s.singular.net/api/v1/launch \
--data-urlencode "a=<SDK key>" \
--data-urlencode "p=Android" \
--data-urlencode "i=com.yourcompany.app" \
--data-urlencode "aifa=<GAID>" \
--data-urlencode "n=YourAppName" \
--data-urlencode "install=true" \
--data-urlencode "ddl_enabled=true"
응답을 읽고 앱에 전달하기
설치가 디퍼드 딥 링크를 포함한 트래킹 링크에서 발생한 경우, Singular는 다음을 반환합니다:
| 응답 필드 | 처리 방법 |
|---|---|
deferred_deeplink
|
딥 링크 주소. 앱에 전달하고 사용자를 해당 콘텐츠로 라우팅하세요. |
deferred_passthrough
|
링크에 첨부된 패스스루 파라미터. 개인화에 사용하세요. |
SESSION 응답 예시:
{
"deferred_deeplink": "myapp://deferred-deeplink",
"status": "ok",
"deferred_passthrough": "passthroughvalue"
}
응답 처리는 필수입니다.
순수 S2S 구성에서는 Singular가 기기와 직접 통신할 수 없습니다. 여러분의 백엔드가 SESSION 응답을 파싱하여
deferred_deeplink
(및
deferred_passthrough
)를 클라이언트 앱에 다시 전달해야 하며, 그곳에서 라우팅 코드가 사용자를 올바른 화면으로 보냅니다. 응답이 전달되지 않으면 디퍼드 딥 링크는 아무런 오류 없이 조용히 실패합니다.
테스트 & 검증
- 디퍼드 딥 링크: 앱이 없는 기기에서 링크를 탭하고 스토어에 도달하는지 확인하세요. 설치 후 열면 앱이 의도한 콘텐츠를 표시해야 합니다.
- 다이렉트 딥 링크: 앱이 설치된 상태에서 링크를 탭하고 앱이 의도한 콘텐츠에서 바로 열리는지 확인하세요.
- SESSION 순서: 어떤 이벤트보다 먼저 하나의 SESSION이 수신되는지, 그리고 SESSION 응답이 파싱되어 클라이언트로 전달되는지 확인하세요(디퍼드 딥 링크에 매우 중요).
-
openuri 채움:
타임아웃 윈도우와 관계없이 딥 링크 오픈 시
openuri가 설정된 SESSION이 전송되는지 확인하세요.
테스트 가이드: Test Your Integration | Test a Tracking Link