딥링크 지원 추가
딥링크 는 사용자를 앱 내의 특정 콘텐츠로 안내합니다. 앱이 설치된 디바이스에서 사용자가 딥링크를 탭하면 앱이 직접 열리며, 제품 페이지나 특정 경험과 같은 의도한 콘텐츠로 이동합니다.
Singular 트래킹 링크는 표준 딥링크(설치된 앱용)와 지연된 딥링크(신규 설치용)를 모두 지원합니다. 자세한 내용은 딥링크 FAQ 와 Singular Links FAQ 를 참조하세요.
요구 사항
사전 준비
앱에서 딥링크를 활성화하려면 Singular Links 사전 준비 를 완료하세요.
필수 구성 단계:
- Associated Domains: Xcode에서 Signing & Capabilities > Associated Domains 에 Singular 커스텀 서브도메인을 추가합니다
- URL Types: Info > URL Types 에서 앱 스킴을 URL Types에 추가합니다
- Singular 플랫폼: Singular 플랫폼의 Apps 페이지에서 Apple Developer Team ID 와 Scheme 을 추가합니다
참고:
- 앱이 이미 iOS Universal Links를 사용하도록 구성되어 있다면, Universal Link 도메인 이 이미 Associated Domains에 존재하며 그대로 유지할 수 있습니다. 이 도메인은 아래 고급 섹션에서 설명한 대로 Supported Domains 구성 옵션 에 추가해야 합니다
- 또한 Singular 커스텀 링크 도메인 을 반드시 포함해야 합니다. 그래야 Singular가 마케팅 캠페인의 어트리뷰션을 추적하고 이러한 캠페인의 딥링크를 처리할 수 있습니다
Singular Links 핸들러 구현
SingularLinkHandler는 앱이 열릴 때 Singular 트래킹 링크에서 딥링크, 지연된 딥링크, 패스스루 파라미터를 가져오는 콜백 메커니즘을 제공합니다.
사용 가능한 파라미터:
- Deep Link: 링크를 클릭한 사용자를 위한 앱 내 대상 URL
- Deferred Deep Link: 링크를 클릭한 후 앱을 설치한 사용자를 위한 대상 URL
- Passthrough: 추가 컨텍스트를 위해 트래킹 링크를 통해 전달되는 사용자 정의 데이터
- URL Parameters: 트래킹 링크 URL의 모든 쿼리 파라미터
SDK 구성
SingularLinkHandler를 Config에 추가
SDK 초기화 중에 SingularLinkHandler를 구성하여 들어오는 딥링크 및 지연된 딥링크 데이터를 처리합니다.
func getConfig() -> SingularConfig? {
// Create config with API credentials
guard let config = SingularConfig(apiKey: "SDK_KEY", andSecret: "SDK_SECRET") else {
return nil
}
// Set deep link handler
config.singularLinksHandler = { params in
self.handleDeeplink(params: params)
}
return config
}
func handleDeeplink(params: SingularLinkParams?) {
// Get Deeplink data from Singular Link
let deeplink = params?.getDeepLink()
let passthrough = params?.getPassthrough()
let isDeferred = params?.isDeferred()
let urlParams = params?.getUrlParameters()
print("Deeplink: \(deeplink ?? "null")")
print("Passthrough: \(passthrough ?? "null")")
print("Is Deferred: \(isDeferred ?? false)")
// Handle deep link routing
if let url = deeplink {
handleDeepLinkRouting(url: url, isDeferred: isDeferred ?? false)
}
}
- (SingularConfig *)getConfig {
// Create config with API credentials
SingularConfig *config = [[SingularConfig alloc] initWithApiKey:@"SDK_KEY"
andSecret:@"SDK_SECRET"];
// Set deep link handler
config.singularLinksHandler = ^(SingularLinkParams *params) {
[self handleDeeplink:params];
};
return config;
}
- (void)handleDeeplink:(SingularLinkParams *)params {
// Get Deeplink data from Singular Link
NSString *deeplink = [params getDeepLink];
NSString *passthrough = [params getPassthrough];
BOOL isDeferred = [params isDeferred];
NSDictionary *urlParams = [params getUrlParameters];
NSLog(@"Deeplink: %@", deeplink ?: @"null");
NSLog(@"Passthrough: %@", passthrough ?: @"null");
NSLog(@"Is Deferred: %d", isDeferred);
// Handle deep link routing
if (deeplink) {
[self handleDeepLinkRouting:deeplink isDeferred:isDeferred];
}
}
참고: SingularLinkHandler는 앱이 Singular Link를 통해 열릴 때만 트리거됩니다. 자세한 내용은 Singular Links FAQ 를 참조하세요.
핸들러 동작
SingularLinkHandler 실행 이해하기
SingularLinkHandler는 앱이 새로 설치되었는지 또는 이미 설치되어 있는지에 따라 다르게 동작합니다.
신규 설치 (지연된 딥링크)
신규 설치 시, 앱이 실행될 때 Open URL이 존재하지 않습니다. Singular는 어트리뷰션을 완료하여 트래킹 링크에 딥링크 또는 지연된 딥링크 값이 포함되어 있는지 확인합니다.
지연된 딥링크 흐름:
- 사용자가 딥링크 값으로 구성된 Singular 트래킹 링크를 클릭합니다
- 사용자가 앱을 설치하고 처음으로 엽니다
- Singular SDK가 첫 세션을 Singular 서버로 전송합니다
- 어트리뷰션이 완료되고 트래킹 링크에서 딥링크를 식별합니다
-
딥링크 값이
isDeferred = true와 함께 SingularLinkHandler로 반환됩니다
지연된 딥링크 테스트:
- 테스트 디바이스에서 앱을 제거합니다(현재 설치되어 있는 경우)
- 디바이스에서 IDFA를 재설정합니다(Settings > Privacy > Apple Advertising > Reset Advertising Identifier)
- 디바이스에서 Singular 트래킹 링크를 클릭합니다(딥링크 값으로 구성되어 있는지 확인)
- 앱을 설치하고 엽니다
어트리뷰션이 성공적으로 완료되어야 하며, 지연된 딥링크 값이 SingularLinkHandler로 전달됩니다.
프로 팁:
다른 번들 식별자(예:
com.example.prod
대신
com.example.dev
)를 사용하는 개발 빌드로 딥링크를 테스트할 때는, 개발 앱의 번들 식별자에
맞게 트래킹 링크를 구성하세요. 테스트 링크를 클릭한 후, App Store에서
프로덕션 앱을 다운로드하는 대신 Xcode 또는 TestFlight를 통해 개발 빌드를
디바이스에 직접 설치하세요.
이미 설치된 경우 (즉시 딥링크)
앱이 이미 설치된 경우, Singular Link를 클릭하면 iOS Universal Links 기술을 사용하여 앱이 즉시 열립니다.
즉시 딥링크 흐름:
- 사용자가 Singular 트래킹 링크를 클릭합니다
- iOS가 전체 Singular 트래킹 링크를 포함하는 Open URL을 제공합니다
- SDK 초기화 중에 Singular가 NSUserActivity 또는 URL을 파싱합니다
- Singular가 딥링크와 패스스루 값을 추출합니다
-
값이
isDeferred = false와 함께 SingularLinkHandler를 통해 반환됩니다
Passthrough 파라미터
패스스루 파라미터를 사용하여 트래킹 링크 클릭에서 추가 데이터를 캡처합니다.
트래킹 링크에 패스스루 파라미터가 포함된 경우, SingularLinkHandler의
passthrough
파라미터에 해당 데이터가 포함됩니다. 이를 사용하여 캠페인 메타데이터, 사용자
세분화 데이터 또는 앱에서 필요한 모든 사용자 정의 정보를 캡처할 수 있습니다.
func handleDeeplink(params: SingularLinkParams?) {
// Extract passthrough data
if let passthroughData = params?.getPassthrough() {
// Parse JSON passthrough data
if let data = passthroughData.data(using: .utf8),
let jsonData = try? JSONSerialization.jsonObject(with: data) as? [String: Any] {
let campaignId = jsonData["campaign_id"] as? String
let userSegment = jsonData["segment"] as? String
print("Campaign ID: \(campaignId ?? "unknown")")
print("User Segment: \(userSegment ?? "unknown")")
}
}
}
- (void)handleDeeplink:(SingularLinkParams *)params {
// Extract passthrough data
NSString *passthroughData = [params getPassthrough];
if (passthroughData) {
// Parse JSON passthrough data
NSData *data = [passthroughData dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:data
options:0
error:&error];
if (!error && jsonData) {
NSString *campaignId = jsonData[@"campaign_id"];
NSString *userSegment = jsonData[@"segment"];
NSLog(@"Campaign ID: %@", campaignId ?: @"unknown");
NSLog(@"User Segment: %@", userSegment ?: @"unknown");
}
}
}
URL 파라미터
getUrlParameters()
메서드를 사용하여 트래킹 링크 URL의 모든 쿼리 파라미터를 캡처합니다.
SingularLinkHandler는 트래킹 링크의 모든 URL 파라미터에 대한 액세스를 제공하여, 사용자 정의 파라미터와 UTM 태그에 완전히 액세스할 수 있게 합니다.
func handleDeeplink(params: SingularLinkParams?) {
// Get all URL parameters
if let urlParams = params?.getUrlParameters() {
for (key, value) in urlParams {
print("Parameter: \(key) = \(value)")
}
// Access specific parameters
if let utmSource = urlParams["utm_source"] as? String {
print("UTM Source: \(utmSource)")
}
if let promoCode = urlParams["promo"] as? String {
print("Promo Code: \(promoCode)")
}
}
}
- (void)handleDeeplink:(SingularLinkParams *)params {
// Get all URL parameters
NSDictionary *urlParams = [params getUrlParameters];
if (urlParams) {
for (NSString *key in urlParams) {
NSLog(@"Parameter: %@ = %@", key, urlParams[key]);
}
// Access specific parameters
NSString *utmSource = urlParams[@"utm_source"];
if (utmSource) {
NSLog(@"UTM Source: %@", utmSource);
}
NSString *promoCode = urlParams[@"promo"];
if (promoCode) {
NSLog(@"Promo Code: %@", promoCode);
}
}
}
트래킹 링크 예시:
https://yourapp.sng.link/A1b2c/abc123?_dl=myapp://product/123&utm_source=facebook&promo=SALE2024
SingularLinkHandler는
getUrlParameters()
메서드를 통해
utm_source
및
promo
를 포함한 모든 파라미터에 대한 액세스를 제공합니다.
고급 구성
Singular 외 Universal Links 처리
어트리뷰션 추적을 위해 Google Ads, Facebook과 같은 외부 파트너의 Universal Links를 지원합니다.
Singular iOS SDK 버전 12.0.3 이상에서는 Singular 외 Universal Links가 기본적으로 지원됩니다.
더 이상 사용되지 않는 기능:
supportedDomains
속성과
startSession:...andSupportedDomains:
오버로드는 현재 SDK에서
__attribute__((deprecated))
로 표시되어 있습니다. 아래 블록은 레거시 SDK 버전(12.0.3 미만)에서만 표시되며,
새 코드에서
supportedDomains
를 계속 설정하는 대신 SDK를 업그레이드하세요.
구버전 SDK에서 외부 딥링크를 지원하려면:
- Singular SDK가 초기화될 때마다 Config 객체의 supportedDomains 구성 옵션에 모든 연결된 도메인을 추가합니다( sng.link 제외)
- 이를 통해 외부 딥링크 동작은 가능하지만 딥링크에 대한 어트리뷰션은 불가능합니다. 어트리뷰션을 위해서는 여전히 Singular 트래킹 링크를 사용해야 합니다
- supportedDomains 기능은 앱이 Universal Links용으로 구성되어 있고 현재 자체 도메인에 AASA 파일을 호스팅하고 있다고 가정합니다
func getConfig() -> SingularConfig? {
guard let config = SingularConfig(apiKey: "SDK_KEY", andSecret: "SDK_SECRET") else {
return nil
}
// Add supported domains for third-party Universal Links
config.supportedDomains = [
"subdomain.mywebsite.com",
"anothersubdomain.myotherwebsite.com"
]
return config
}
- (SingularConfig *)getConfig {
SingularConfig *config = [[SingularConfig alloc] initWithApiKey:@"SDK_KEY"
andSecret:@"SDK_SECRET"];
// Add supported domains for third-party Universal Links
config.supportedDomains = @[
@"subdomain.mywebsite.com",
@"anothersubdomain.myotherwebsite.com"
];
return config;
}
ESP 커스텀 트래킹 링크 도메인 지원
이메일 캠페인 어트리뷰션을 위해 이메일 서비스 제공자(ESP)가 제공하는 Universal Links를 활성화합니다.
ESP 도메인은 HTTPS가 활성화되어 있어야 합니다. Apple은 iOS 앱이 리디렉션 없이 HTTPS가 활성화된 엔드포인트에서 apple-app-site-association 파일을 가져오도록 요구 합니다. ESP가 앱에 대해 이 파일을 어떻게 호스팅하는지 확인하세요. 사이트의 DNS 구성이 필요할 수 있습니다.
ESP 도메인을 지원하려면 Singular SDK가 초기화될 때마다 config 객체의 espDomains 구성 옵션에 커스텀 트래킹 도메인을 추가합니다.
func getConfig() -> SingularConfig? {
guard let config = SingularConfig(apiKey: "SDK_KEY", andSecret: "SDK_SECRET") else {
return nil
}
// Add ESP domains for email campaign tracking
config.espDomains = ["links.mywebsite.com"]
return config
}
- (SingularConfig *)getConfig {
SingularConfig *config = [[SingularConfig alloc] initWithApiKey:@"SDK_KEY"
andSecret:@"SDK_SECRET"];
// Add ESP domains for email campaign tracking
config.espDomains = @[@"links.mywebsite.com"];
return config;
}