EEYatHo 앱 깎는 이야기

Swift ) Deeplink 총정리 - EEYatHo iOS 본문

iOS, Swift/DeepLink

Swift ) Deeplink 총정리 - EEYatHo iOS

EEYatHo 2024. 2. 8. 09:45
반응형

DeepLink


  • 앱이 실행되거나, 앱 내 특정 페이지에 도달할 수 있도록 하는 링크
  • 두가지 방식이 존재. ( URL Scheme, Universal Link )

 

 

 

URL Scheme


  • 가장 간단하고 오래된 딥링크 방식
  • 단점
    • 다른 앱과 딥링크의 중복 가능 (iOS는 마지막에 설치한 앱이 열림, 안드는 어떤 앱을 실행할지 선택)
    • 미설치시 앱스토어 이동이 안됨
    • 링크에 앱 스킴이 노출되기 때문에, 다른 앱이 작정하고 따라할 수 있다 (보안에 취약)

 

 

 

Universer Link


  • 두가지 단점의 보완
    1. 웹 주소를 이용한 딥링크 방식. ( 웹 주소는 유일. → 중복 걱정 x )
    2. 앱이 설치되어 있지 않을 때 앱스토어로 이동시킴
  • 작동 원리
    • 앱에 어떤 도메인으로 실행될 것인지 설정 ( Capability - Associated Domains ) (참고)
    • 웹 서버에, JSON 형태로 AppID와 딥링크 경로 정보가 들어있는 apple-app-site-association 파일을 업로드. (참고)
    • 해당 앱이 설치될 때, iOS는 Info.plist를 체크, entitlements에서 Associated Domains Value를 찾고,
      해당 HTTPS WebServer 에서 apple-app-site-association 파일을 찾은 뒤,
      내부적으로 applink를 만듦.
      ( iOS 14부터는 애플의 content delivery network (CDN) 에 업로드하고 해당 파일을 참조함.) (참고)
    • 이후 해당 Web의 open명령을 받은 iOS는, 앱이 있다면 앱을 열고, 없으면 사파리를 엶.
    • 사파리가 열렸다면, 개발자는 여기서 웹 서비스를 제공할지, 앱스토어로 보낼지 구현.
  • 당연하지만, QR Code, NFC 태그 등으로 활용 가능.
  • 안드로이드는 동일한 서비스로 이름만 다른 AppLink 가 있음.
  • 여러 앱을 담을 수 있음 → 하나의 웹 서버로 여러 앱의 유니버셜 링크 구현 가능.
  • 주의사항
    • 소유한 도메인이 필요
    • iOS 9 이상에서 동작
    • apple-app-site-association ( AASA ) 파일 크기는 128KB 보다 작아야함
    • AASA 파일 확장자 없음. ( .json 아님 )
    • .well-known 디렉터리 또는 root 디렉터리에 추가
    • https 이어야함
    • redirection이 없어야함 
  •  캐싱관련
    • AASA 파일을 변경해도 바로바로 반영되지 않음.
    • 앱을 설치하거나 업데이트할 때, 가져와놓고 쓰기 때문
    • 애플은 AASA 파일을 24시간 마다 CDN에 AASA파일을 업데이트하고, 디바이스는 대략 일주일에 한번씩 CDN을 체크. (참고)

 

 

 

Firebase(Dynamic Link), AppsFlyer(One Link), AriBridge, DFinery(All Link), Adjust 등의 각종 서비스들..


  • 딥링크 서비스를 제공하는 솔루션들
  • iOS의 유니버셜 링크, AOS의 앱링크 한번에 지원.( AppStore/PlayStore 로 잘 구분해서 랜딩 )
  • 디퍼드 딥링크 (Deferred DeepLink) 서비스 제공
    • 앱이 설치되지 않은 유저가 링크 클릭 > 앱스토어 이동 > 앱 설치 > 실행 후에도,
      해당 링크를 서비스 제공업체에서 받아와, 딥링크 동작 수행(원하는 페이지 랜딩 등)에 문제 없도록하는 서비스
  • 각종 지표도 확인 가능

 

 

Info.plist 훑어보기


  • Queried URL Schemes는 무엇이고 왜 사용할까 (LSApplicationQueriesSchemes)
    • 내 앱에서 오픈할 앱들의 스킴을 넣어두는 용도
    • 넣어두지 않으면 canOpenURL에서 무조건 false라고 나옴 (앱이 설치되어 있음애도)
      • 그냥 open하면 열리긴함. (그래서 카톡에서 내 앱 URL스킴 딥링크가 가능)
    • 과거 iOS9 부터 WKWebView에서 URL Scheme 불가능이라는 말들이 있는데 (참고) 실험해보니 지금은 아님
      • WKWebView
        • 앱 내에서 WKWebview Delegate로 처리하면됨. Queried URL Schemes와 상관없음
      • SFSafariVC
        • 알아서 열리게 해줌. Queried URL Schemes와 상관없음
      • 사파리앱
        • 알아서 해줌. QUS랑 노상관.
      • iOS 15,16,17 다 열림
    • 그렇다면.. Queried URL Schemes는.. 고작 설치여부를 파악하기 위해 사용?
      • QUS에 등록하고, 미설치된 앱이라도, 사파리에서 앱스토어로 보내주지도 않음..
      • 내가 직접 Swfit 코드를 (canOpenURL) 사용하지 않으면 필요없음
      • 웹에서는 보통 URLScheme 열고 2초동안 반응이 없으면 미설치로 판단하고 앱스토어로 보내버림
      • 쓸모가 별로 없네..

 

URL Types 훑어보기


  • 내 앱을 열 수 있는 URL Scheme을 추가하는 것

 

카톡에서 우리 앱 열려면 어떻게 해야하나?


  • URLScheme 사용시, 중복이 가능하고, 미설치 유저 대응이 불가하니, 경쟁 업체의 방해가 있을 수 있으니 도메인을 하나 이용하여, 웹페이지 or 유니버셜 링크를 구현
  • AppsFlyer 등의 서비스를 이용한다면, 유니버셜 링크까지 무료로 가능하다
    • 물론 자체 구현하는게 커스텀엔 용이
    • 유료 이용시 Deferred 딥링크가 가능하고, 지표도 확인 가능
  • 카톡에서 유니버셜 링크가 안된다. (참고)
    • 인앱 브라우저나 사파리 등, 브라우저 주소창에서 URL을 실행하면 무조건 앱스토어로 간다 (애플 보안 정책)
    • 카톡은 인앱 브라우저에서 주소창에 URL을 실행한다..
    • 외부 앱을 최초 실행시, iOS에서 실행여부를 물어보는 confirm 창이 뜨고 이때 취소를 선택하면 앱을 띄울 수 없다
    • 따라서,
      1. 브라우저에 띄운 웹페이지내 a href 와 같은 태그로 링크를 사용자가 선택해 유니버셜링크를 실행
      2. 혹은, 브릿지 페이지에서 앱실행 버튼 클릭을 유도 하는 형태로 사용

 

 

인앱 웹뷰(인앱 브라우저) vs 외부 브라우저


  • 인앱 웹뷰 : WKWebView ( SafariVC도 인앱 웹뷰긴 하지만, 인앱 웹뷰의 장점이나 특징이 없으므로 논외 )
  • 외부 브라우저 : 사파리, 크롬 등
  • open이나 a태그
    • WKWebView Delegate의 허가가 필요 (decidePolicyFor navigationAction)
    • 사파리, 크롬, 사파리VC는 자기들 마음대로 처리
  • UI
    • 인앱 웹뷰는 마음대로 커스텀 가능
    • 외부 브라우저는 우리 앱이 백그라운드로 들어가버림

 

외부 딥링크를 허용했을 때 발생할 수 있는 취약점


  • 내부 딥링크: 시작점이 내부(웹, 앱, BE)인 딥링크 (Push 클릭, 웹 브릿지 등)
  • 외부 딥링크: 외부에서 유저 등 타인이 만든 딥링크. (URLScheme open 등)
  • 외부 딥링크를 허용하여 페이지를 랜딩할 경우,
    1. {AppScheme}://webview?uri={ID/PW탈취하는웹페이지} 딥링크로 앱 실행
    2. 홈노크타운인줄 알고 유저가 ID/PW를 입력해버릴 수 있음
    • 따라서 외부 딥링크를 비허용 (단순한 앱 실행은 o. 페이지 랜딩은 x)
    • 이를 막고자 웹뷰를 화이트 리스트로 관리하면, 새로운 웹뷰를 추가했을 때 업데이트가 필요해져버림
    • 따라서 외부 딥링크를 허용 할 경우, 우리 도메인 웹뷰만 허용하는 등의 작업 필요

 

주민투표 URL 선택시 투표 화면으로 랜딩해주세요


  • 앱 외부에서 링크 클릭시 구현
    1. 우리의 랜딩용 웹페이지로 이동 (브릿지 페이지)
    2. 웹에서 유니버셜 링크 open (혹은 링크 클릭 유도)
    3. 2초지나도 안열리면 앱스토어 open
    4. AppDelegate쪽 딥링킹 구현
  • 인앱 웹뷰에서 링크 클릭시 구현
    • WKWebView Delegate decidedAllow 에서 가로채서 딥링킹
    • 혹은, 브릿지 활용하여 url 받은 후 딥링킹
  • 앱 내에서 링크 클릭시 구현
    • 그냥 딥링킹 하면 끝
Comments