hyunn

[iOS] 딥링크(URI Scheme, Universal Link)와 Deferred DeepLink 본문

iOS

[iOS] 딥링크(URI Scheme, Universal Link)와 Deferred DeepLink

hyunn383 2024. 9. 2. 14:57

딥링크(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()
}