LODY/정리

iOS 개발 필수 기본기 / 딥링크와 앱 라우팅

딥링크와 앱 라우팅

🟣 딥링크가 하는 일

웹에서 https://shop.example.com/product/42를 누르면 상품 화면으로 간다. 딥링크는 같은 일을 앱에서 하는 링크다. 푸시·알림톡·광고를 눌렀을 때 홈이 아니라 그 화면으로 곧장 보낸다. 중간 화면을 하나 더 거치게 두면 그 사이에서 이탈이 난다.

방식은 세 갈래다. URI Scheme, Universal Link(iOS) / App Link(Android), 그리고 미설치까지 목적지를 가져가는 Deferred DeepLink.

Deep LinkURI Scheme (초기 형태)한계 보완Universal Link (iOS)App Link (Android)

🟣 URI Scheme

앱이 자기 스킴을 등록해 두면, 그 스킴으로 시작하는 URL을 OS가 앱으로 넘긴다.

{scheme}://{path}?id=42
  • scheme: 어떤 앱인지
  • path / query: 어떤 화면·파라미터인지
myapp://product?id=42schemeauthorityquery

시스템 스킴도 같은 계열이다. sms://, tel://, mailto://, market://.

🚀 한계

  • 미설치면 동작하지 않는다. myapp://를 눌러도 아무 일도 안 일어난다.
  • 스킴에 주인이 없다. 다른 앱이 같은 스킴을 등록할 수 있다. Android는 선택 팝업이 뜨고, iOS는 어느 앱이 열릴지 보장하지 않는다.

이 한계를 메운 것이 App Link / Universal Link다.


형태는 항상 HTTPS 웹 URL이다.

https://shop.example.com/product/42

도메인은 유일하다. 그 도메인을 이 앱이 소유했다는 증명이 있어야 가로채기가 허용된다.

🚀 소유자 인증

도메인에 앱 식별 파일을 올리고, OS가 확인한다.

  • Android: https://shop.example.com/.well-known/assetlinks.json
  • iOS: https://shop.example.com/.well-known/apple-app-site-association (AASA)

iOS는 앱 설치 시점에 AASA를 받아 캐시한다. 앱 쪽에서는 Associated Domains에 applinks:shop.example.com을 등록한다.

🚀 실행 동작

https://shop.example.com/... 클릭앱 설치됨?앱이 해당 화면으로 진입웹 페이지로 열림웹에서 앱스토어로 유도아니오웹 미제공 시
  • 설치됨: 앱 화면으로 연다
  • 미설치: 같은 URL의 웹이 열린다. 웹이 없으면 스토어로 유도하면 된다

문자·소셜에 뿌리는 링크가 HTTPS여야 하는 이유가 여기 있다. 프리뷰가 깨지지 않고, 미설치 사용자도 빈 화면 대신 웹을 본다.

🚀 남는 구멍

  • 브라우저 주소창에 직접 붙여 넣으면 가로채기가 안 되는 경우가 많다
  • 카카오톡·인스타그램처럼 인앱 브라우저를 쓰는 앱에서는 앱으로 열리기도, 웹으로 열리기도 한다
  • URI Scheme·Universal Link 모두, 미설치 상태에서 누른 목적지를 설치 이후까지 가져가지 못한다

그 공백이 Deferred DeepLink다.


미설치로 링크를 눌렀을 때 목적지를 미뤄 두었다가, 설치 후 첫 실행에 복원한다.

미설치 상태로링크 클릭SDK 서버에클릭 정보 저장설치 후첫 실행SDK가 딥링크정보 observe저장본과매칭?목적지로 복원홈 화면있음없음

추천 링크·캠페인 링크가 대표 사례다. 앱이 없어도 스토어로 보내고, 설치 직후 홈이 아니라 원래 콘텐츠(또는 추천 코드)로 이어 준다.

🚀 매칭은 확률적이다

웹에서 클릭한 사람과 앱을 처음 연 사람이 같은지, SDK는 IP·기기 정보·광고 ID(ADID/IDFA)·쿠키 같은 신호를 조합해 추정한다. 확정 ID가 아니라 추정이라 확률적이다.

웹에서 링크 클릭앱에서 첫 실행클릭 시점 신호IP, Device, CookieADID/IDFA 등실행 시점 신호IP, DeviceADID/IDFA 등같은 사용자?(확률적 추정)딥링크 복원실패 또는 오매칭(비슷한 신호가 겹침)일치로 판단불일치/충돌클릭 측 (웹)실행 측 (앱)

같은 IP에서 비슷한 기기가 거의 동시에 같은 링크를 누르면 한 사람으로 오인할 수 있다. ATT 이후 기기 지문 추정은 더 약해졌다. Deferred는 100% 라우팅이 아니라 확률적 attribution이라는 전제로 설계해야 한다. 값이 없을 때 온보딩·홈이 막히지 않게 fallback을 둔다.

매칭을 직접 구현하기는 부담이 커서 보통 SDK에 맡긴다.


🟣 앱 안의 라우팅

방식이 달라도 OS가 앱에 넘기는 것은 결국 URL 하나다. URI Scheme은 SceneDelegate의 URL 콜백으로, Universal Link는 NSUserActivity로 들어온다. 그 URL을 화면으로 바꾸는 일을 라우터 한곳에 모은다.

들어온 URL/product/42Router경로 파싱상품 상세주문 내역홈 (fallback)/product/:id/orders파싱 실패

바깥에서 온 값이므로 경로·파라미터가 깨질 수 있다. 실패하면 크래시가 아니라 안전한 기본 화면으로 보낸다. 상세만 덜렁 열면 뒤로 가기가 비는 경우가 있으니, 필요하면 홈부터 상세까지의 스택을 같이 복원한다.


🟣 정리

  • 딥링크는 앱 바깥 링크를 앱 안 특정 화면으로 곧장 보낸다
  • URI Scheme은 단순하지만 미설치·스킴 충돌에 약하다
  • Universal Link / App Link는 HTTPS + 도메인 소유 검증. 미설치면 웹으로 이어진다
  • Deferred는 설치 후 첫 실행에 목적지를 복원하지만, 사용자 매칭은 확률적이다
  • URL → 화면 변환은 라우터 한곳에 모으고, 파싱 실패와 뒤로 가기 스택을 같이 설계한다

다음 장은 앱이 기기에 남겨야 할 데이터를 어디에 둘지다.