Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- IOS
- Archive
- darkmode
- Session
- Xcode
- Notification
- UIButton
- JPA
- Realm
- stack
- mac
- error
- geofencing
- 개발자
- github
- MacOS
- iOS16
- Apple
- 웹뷰
- Firebase
- Code
- rxswift
- view
- 한글
- FLUTTER
- Git
- window
- appstore
- Swift
- SwiftUI
Archives
- Today
- Total
EEYatHo 앱 깎는 이야기
Swift ) Deeplink 총정리 - EEYatHo iOS 본문
반응형
DeepLink
- 앱이 실행되거나, 앱 내 특정 페이지에 도달할 수 있도록 하는 링크
- 두가지 방식이 존재. ( URL Scheme, Universal Link )
URL Scheme
- 가장 간단하고 오래된 딥링크 방식
- 단점
- 다른 앱과 딥링크의 중복 가능 (iOS는 마지막에 설치한 앱이 열림, 안드는 어떤 앱을 실행할지 선택)
- 미설치시 앱스토어 이동이 안됨
- 링크에 앱 스킴이 노출되기 때문에, 다른 앱이 작정하고 따라할 수 있다 (보안에 취약)
Universer Link
- 두가지 단점의 보완
- 웹 주소를 이용한 딥링크 방식. ( 웹 주소는 유일. → 중복 걱정 x )
- 앱이 설치되어 있지 않을 때 앱스토어로 이동시킴
- 작동 원리
- 앱에 어떤 도메인으로 실행될 것인지 설정 ( 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 다 열림
- WKWebView
- 그렇다면.. Queried URL Schemes는.. 고작 설치여부를 파악하기 위해 사용?
- QUS에 등록하고, 미설치된 앱이라도, 사파리에서 앱스토어로 보내주지도 않음..
- 내가 직접 Swfit 코드를 (canOpenURL) 사용하지 않으면 필요없음
- 웹에서는 보통 URLScheme 열고 2초동안 반응이 없으면 미설치로 판단하고 앱스토어로 보내버림
- 쓸모가 별로 없네..
URL Types 훑어보기
- 내 앱을 열 수 있는 URL Scheme을 추가하는 것
카톡에서 우리 앱 열려면 어떻게 해야하나?
- URLScheme 사용시, 중복이 가능하고, 미설치 유저 대응이 불가하니, 경쟁 업체의 방해가 있을 수 있으니 도메인을 하나 이용하여, 웹페이지 or 유니버셜 링크를 구현
- AppsFlyer 등의 서비스를 이용한다면, 유니버셜 링크까지 무료로 가능하다
- 물론 자체 구현하는게 커스텀엔 용이
- 유료 이용시 Deferred 딥링크가 가능하고, 지표도 확인 가능
- 카톡에서 유니버셜 링크가 안된다. (참고)
- 인앱 브라우저나 사파리 등, 브라우저 주소창에서 URL을 실행하면 무조건 앱스토어로 간다 (애플 보안 정책)
- 카톡은 인앱 브라우저에서 주소창에 URL을 실행한다..
- 외부 앱을 최초 실행시, iOS에서 실행여부를 물어보는 confirm 창이 뜨고 이때 취소를 선택하면 앱을 띄울 수 없다
- 따라서,
- 브라우저에 띄운 웹페이지내 a href 와 같은 태그로 링크를 사용자가 선택해 유니버셜링크를 실행
- 혹은, 브릿지 페이지에서 앱실행 버튼 클릭을 유도 하는 형태로 사용
인앱 웹뷰(인앱 브라우저) vs 외부 브라우저
- 인앱 웹뷰 : WKWebView ( SafariVC도 인앱 웹뷰긴 하지만, 인앱 웹뷰의 장점이나 특징이 없으므로 논외 )
- 외부 브라우저 : 사파리, 크롬 등
- open이나 a태그
- WKWebView Delegate의 허가가 필요 (decidePolicyFor navigationAction)
- 사파리, 크롬, 사파리VC는 자기들 마음대로 처리
- UI
- 인앱 웹뷰는 마음대로 커스텀 가능
- 외부 브라우저는 우리 앱이 백그라운드로 들어가버림
외부 딥링크를 허용했을 때 발생할 수 있는 취약점
- 내부 딥링크: 시작점이 내부(웹, 앱, BE)인 딥링크 (Push 클릭, 웹 브릿지 등)
- 외부 딥링크: 외부에서 유저 등 타인이 만든 딥링크. (URLScheme open 등)
- 외부 딥링크를 허용하여 페이지를 랜딩할 경우,
- {AppScheme}://webview?uri={ID/PW탈취하는웹페이지} 딥링크로 앱 실행
- 홈노크타운인줄 알고 유저가 ID/PW를 입력해버릴 수 있음
- 따라서 외부 딥링크를 비허용 (단순한 앱 실행은 o. 페이지 랜딩은 x)
- 이를 막고자 웹뷰를 화이트 리스트로 관리하면, 새로운 웹뷰를 추가했을 때 업데이트가 필요해져버림
- 따라서 외부 딥링크를 허용 할 경우, 우리 도메인 웹뷰만 허용하는 등의 작업 필요
주민투표 URL 선택시 투표 화면으로 랜딩해주세요
- 앱 외부에서 링크 클릭시 구현
- 우리의 랜딩용 웹페이지로 이동 (브릿지 페이지)
- 웹에서 유니버셜 링크 open (혹은 링크 클릭 유도)
- 2초지나도 안열리면 앱스토어 open
- AppDelegate쪽 딥링킹 구현
- 인앱 웹뷰에서 링크 클릭시 구현
- WKWebView Delegate decidedAllow 에서 가로채서 딥링킹
- 혹은, 브릿지 활용하여 url 받은 후 딥링킹
- 앱 내에서 링크 클릭시 구현
- 그냥 딥링킹 하면 끝
Comments