일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- deferred deeplink
- 유니버셜링크
- ios개발
- universal link
- 포트폴리오
- 앱출시
- 의존성 주입
- swift-nio
- SOCKET
- mvvm
- DeepLink
- ios binary data
- RxSwift
- iOS 아키텍쳐
- 사이드프로젝트
- 딥링크
- ByteBuffer
- 클린아키텍쳐
- Dependency Injection
- SWIFT
- binary data to struct
- 2024회고
- swift 소켓 데이터
- swift 바이너리 데이터
- swift 바이트 버퍼
- swift 소켓통신
- clean architecture
- 앱개발자
- IOS앱개발
- swift bytebuffer
- Today
- Total
hyunn
[iOS] 딥링크(URI Scheme, Universal Link)와 Deferred DeepLink 본문
딥링크(Deep Link)
정의
DeepLink는 앱의 특정 화면, 기능, 또는 콘텐츠로 직접 이동할 수 있게 해주는 링크이다.
종류
1. 표준 URL Scheme
- 'myapp://' 같은 형식으로 앱 고유의 스킴을 사용
2. Universal Links (iOS), App Links (Android)
- 웹 URL을 사용하여 앱으로 연결
URL Shceme vs. Universal Links
1. 작동 방식
- URL Scheme: 커스텀 프로토콜을 사용하여 앱을 실행 (예: myapp://)
- Universal Links: 표준 HTTP/HTTPS URL을 사용 (예: https://www.myapp.com)
2. 플랫폼 지원
- URL Scheme: iOS, Android 등 대부분의 모바일 플랫폼에서 지원
- Universal Links: iOS와 macOS에서만 지원 (Android는 App Links라는 유사한 기능 사용)
3. 폴백(Fallback) 동작
- URL Scheme: 앱이 설치되지 않은 경우 오류 발생 또는 아무 동작 없음
- Universal Links: 앱이 없으면 자동으로 웹 브라우저에서 해당 URL 열림
4. 보안
- URL Scheme: 다른 앱에서 스키마를 가로채거나 악용할 수 있어 보안에 취약
- Universal Links: HTTPS를 사용하고 Apple에서 인증하므로 더 안전함
5. SEO
- URL Scheme: 검색 엔진이 인식하지 못해 SEO에 도움 안 됨
- Universal Links: 일반 웹 URL이므로 SEO에 유리
6. 사용자 경험
- URL Scheme: 앱 설치 여부에 따라 경험이 크게 달라질 수 있음
- Universal Links: 앱 설치 여부와 관계없이 일관된 경험 제공
7. 구현 복잡성
- URL Scheme: 비교적 간단하게 구현 가능
- Universal Links: 서버 설정과 앱 구성이 더 복잡함
8. 딥링킹
- URL Scheme: 앱 내 특정 화면으로 이동 가능
- Universal Links: 앱과 웹 모두에서 동일한 링크로 특정 콘텐츠에 접근 가능
9. 사용자 선택
- URL Scheme: 사용자가 선택할 수 없이 항상 앱으로 연결 시도
- Universal Links: 사용자가 웹과 앱 중 선택 가능
앱이 설치되어 있지 않은 경우, 앱스토어로 이동하게 하는 방법
URL Shceme
1. JavaScript를 이용
function openApp() {
var appUrl = "myapp://"; // URL Scheme
var storeUrl = "https://apps.apple.com/app/idXXXXXXXXXX"; // App Store URL
var clickedAt = +new Date;
setTimeout(function() {
if (+new Date - clickedAt < 2000) {
window.location = storeUrl;
}
}, 500);
window.location = appUrl;
}
- 먼저 URL Scheme을 사용해 앱을 열려고 시도
- 2초 이내에 앱이 열리지 않으면, App Store 페이지로 리다이렉트
Universal Links
1. 메타 태그를 추가하여 Smart App Banner를 구현
<meta name="apple-itunes-app" content="app-id=myAppStoreID, affiliate-data=myAffiliateData, app-argument=myURL">
- 이 배너는 iOS에서 제공하는 기능이며, 앱이 설치되지 않은 경우 사용자에게 App Store로 이동할 수 있는 옵션을 제공함
- 실제 iOS 디바이스에서 Safari 브라우저를 통해 볼 수 있는 Smart App Banner의 모습
2. 서버 측 리다이렉션
- Universal Link로 요청이 서버에 도달했을 때, 서버에서 User-Agent를 확인하여 앱이 설치되지 않은 것으로 판단되면 App Store URL로 리다이렉트
3. 웹페이지에 앱 설치 유도 버튼 추가
- Universal Link가 웹페이지로 연결되었을 때, 페이지 내에 눈에 띄는 "앱 설치" 버튼을 배치하여 사용자를 App Store로 유도
4. 커스텀 중간 페이지 사용
- Universal Link가 웹페이지로 연결되었을 때, 사용자에게 앱 설치 또는 웹 버전 사용을 선택할 수 있는 중간 페이지를 보여주기
지연된 딥링크(Deferred DeepLink)
정의
앱이 설치되지 않은 상태에서 생성되어, 앱 설치 후 첫 실행 시 특정 콘텐츠나 화면으로 사용자를 안내하는 링크
작동 방식
1. 사용자가 링크를 클릭하면 앱 스토어로 이동
2. 앱 설치 후 첫 실행 시, 원래 의도된 딥링크 대상으로 사용자를 안내
구현 고려사항
- 서버 측 저장: 딥링크 정보를 서버에 저장하고 앱 설치 후 조회해야 한다.
- 사용자 식별: 설치 전후 사용자를 식별하는 메커니즘이 필요하다.
- 시간 제한: 딥링크의 유효 기간을 설정하는 것이 좋다.
기술적 구현
- 핑거프린팅: 기기의 고유한 특성을 이용해 사용자를 식별한다.
- IDFA/GAID: 광고 식별자를 사용할 수 있지만, 개인정보 정책에 주의해야 한다.
- 서드파티 툴: Firebase Dynamic Links, Branch.io, AppsFlyer One Link 등의 서비스를 활용할 수 있다.
써드파티 툴 없이 디퍼드 딥링크 구현하는 방법
1. Universal Links 설정
1-1. Associated Domains 설정
• Signing & Capabilities 탭에서 + Capability 버튼을 클릭하고 Associated Domains를 추가
• applinks:yourdomain.com 형식으로 도메인을 추가
1-2. apple-app-site-association 파일 설정
• 서버의 루트에 .well-known 디렉토리를 생성
• 해당 디렉토리에 apple-app-site-association 파일을 추가
2. 딥링크 처리 구현
2-1. AppDelegate에서 URL 처리
• 앱이 열릴 때 Universal Link를 통해 전달된 URL을 처리한다
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {
// URL을 처리하는 코드 작성
handleDeeplink(url)
}
return true
}
func handleDeeplink(_ url: URL) {
// URL의 경로와 매개변수를 분석하여 적절한 화면을 연다.
let path = url.path
let queryItems = URLComponents(url: url, resolvingAgainstBaseURL: false)?.queryItems
// 예시: 특정 화면으로 이동
if path == "/path/to/content" {
// 화면으로 이동하는 코드 작성
}
}
3. 디퍼드 딥링크 처리
- 디퍼드 딥링크는 사용자가 앱을 설치한 후에도 딥링크를 처리할 수 있도록 해야 한다. 이를 위해 서버 측에서 정보를 저장하고 앱이 설치된 후 정보를 가져올 수 있도록 구현한다.
3-1. 서버 측에서 정보 저장
• 사용자가 특정 링크를 클릭할 때 서버에서 해당 사용자와 관련된 정보를 저장. 예) 사용자의 디바이스 ID, 광고 ID, 쿠키 등
3-2. 앱 설치 후 정보 가져오기
• 앱이 시작될 때 API 요청을 통해 서버에서 사용자의 ID에 매칭되는 딥링크 정보를 가져온다.
func fetchDeferredDeeplink() {
// 서버 API 호출을 통해 저장된 딥링크 정보를 가져옴
let url = URL(string: "https://yourserver.com/get-deferred-deeplink?user_id=example")!
let task = URLSession.shared.dataTask(with: url) { data, response, error in
guard let data = data, error == nil else { return }
do {
if let deeplinkInfo = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any],
let deeplinkURLString = deeplinkInfo["deeplink"] as? String,
let deeplinkURL = URL(string: deeplinkURLString) {
DispatchQueue.main.async {
self.handleDeeplink(deeplinkURL)
}
}
} catch {
print("Failed to parse deferred deeplink")
}
}
task.resume()
}
'iOS' 카테고리의 다른 글
[iOS] DI(의존성 주입)에 대한 고찰 (feat. Clean Architecture + MVVM) (0) | 2024.07.17 |
---|