iOS/Common

[Swift] Deep link (Universal Links, Custom URL Scheme)

TDCIAN 2023. 4. 12. 15:48

iOS에서 Deep link를 구현하는 방식은 Universal Links와 Custom URL Scheme 두 가지로 나눌 수 있습니다.

 

1. Universal Links

Universal Links는 앱과 웹 사이트 간에 Deep link를 지원하는 Apple의 공식 기술입니다.

Universal Links를 사용하면 앱이 설치되어 있지 않은 경우에도 사용자를 앱 스토어로 이동시키지 않고 직접 앱으로 연결할 수 있습니다.

 

Universal Links를 구현하는 방법은 다음과 같습니다.

- 앱과 웹 사이트에 도메인이 등록되어 있어야 합니다.

- 앱에서 Associated Domains entitlements를 활성화하고, 앱과 연결할 도메인을 추가해야 합니다.

- 웹 사이트에서도 Associated Domains를 활성화하고, Universal Link를 사용할 도메인을 지정해야 합니다.

- 앱에서 해당 Universal Link에 대한 핸들러를 구현해야 합니다.

 

+ Universal Links 적용 방법(원문: https://lxxyeon.tistory.com/74)

 

(1) Web Server에 AASA 파일 추가하기

Universal link를 사용하기 위해서는 소유한 도메인이 있어야 합니다.

따라서 도메인 정보가 포함된 JSON 파일인 apple-app-site-association(AASA) 파일을 웹서버에 업로드해야 합니다.

사용자가 앱 설치 시, 이 파일에 등록된 도메인으로 apple-app-site-association 파일에 대한 요청을 보냅니다.

이미 사용자가 앱을 설치했다면 앱을 바로 실행시켜주는 링크의 도메인에서 호스팅 됩니다.

 

*주의할 점

- redirection이 없어야 함

- https 지원

- 128KB보다 작아야 함

 

[apple-app-site-association 파일]

파일명: apple-app-site-association (확장자 없음)

위치: .well-known 디렉토리 또는 root 디렉토리에 추가

이미지에 원본 링크 걸어놨습니다!

[apple-app-site-association 파일 내용 구성]

apps: 유니버설 링크에서는 사용하지 않지만 빈 배열로라도 반드시 명시되어 있어야 함

details: 웹사이트에서 핸들링되는 앱들의 목록입니다. 즉, 한 웹사이트에서 유니버설 링크를 사용하는 여러 앱에 대한 연동이 가능

appID: 앱의 식별 값으로 팀 아이디와 번들 id를 위해 사용, 형식: <TEAM_DEVELOPER_ID>.<BUNDLE_IDENTIFIER>

paths: 앱에서 지원하는 웹사이트 경로(*: 전 위치 가능)

이미지에 원본 링크 걸어놨습니다!

 

(2) iOS 앱에 Capability - Associated Domains 추가

유니버설 링크를 지원하려면, 먼저 앱에서 유니버설 링크를 허용할 도메인을 추가해야 합니다.

추가한 도메인 주소를 통해 앱이 연결됩니다.

 

Project > Target > Signing&Capabilities > Associated Domains에 Domains 추가

이미지에 원본 링크 걸어놨습니다!

applinks 형식 예시

이미지에 원본 링크 걸어놨습니다!

이렇게 하면, 사용자가 앱 설치 시, 여기에 등록된 도메인의 해당 url의 .well-known/apple-app-site-association 경로에 가서 AASA 포맷을 확인하라고 파일에 대한 요청을 보내게 됩니다.

 

* 등록이 잘 됐는지 entitlements로 확인하기

이미지에 원본 링크 걸어놨습니다!

여기까지 설정하면 앱과 웹이 연결되어 서로의 정보를 알고 있게 됩니다.

* 테스트 방법: 앱에서 설정한 도메인 주소를 입력 후 클릭시 연결한 앱이 실행되면 연결 성공

 

(3) 앱에서 동적링크 URL handle 하기

유니버설 링크로 들어오는 요청은 SceneDelegate의 scene: continueUserActivity 메서드에서 전달받은 NSUserActivity 객체를 사용해 처리할 수 있습니다.

func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
	guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
    	let incomingURL = userActivity.webpageURL,
        let components = NSURLComponents(url: incomingURL, resolvingAgainstBaseURL: true),
        let path = components.path else {
                return
        }
        
    //도메인 주소의 쿼리값을 받음
 	let params = components.queryItems ?? [URLQueryItem]()
	print("path = \(incomingURL)")
	print("params = \(params)")
}

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
    for urlContext in URLContexts {
        let urlToOpen = urlContext.url
        // ...
    }
}

 

 

 

 

2. Custom URL Scheme

Custom URL Scheme은 간단하게 말하면, 앱에서 특정 URL Scheme을 등록하고,

이를 통해 해당 앱으로 Deep link를 구현하는 방법입니다.

 

Custom URL Scheme을 구현하는 방법은 다음과 같습니다.

- 앱에서 URL Scheme을 등록하고, 이를 통해 해당 앱으로 Deep link를 처리할 수 있는 핸들러를 구현해야 합니다.

- 웹 사이트에서 해당 URL Scheme을 사용하여 앱으로 이동할 수 있는 링크를 만들어야 합니다.

- 사용자가 링크를 클릭하면 해당 앱으로 이동합니다.

 

위와 같이 두 가지 방법으로 iOS에서 Deep link를 구현할 수 있습니다.

하지만 Universal Links를 사용하는 것이 Custom URL Scheme에 비해 안정적이고 보안성이 높기 때문에,

최근에는 Universal Links를 더 많이 사용하는 추세입니다.

 

+ URL Scheme 방식의 한계

URL Scheme 방식의 딥링크는 앱의 수가 상대적으로 적었던 시기에는 광고를 통해 앱을 바로 실행시키는 훌륭한 마케팅 수단이었습니다.

그러나 앱 수가 증가하면서 생각하지 못한 문제가 발생하기 시작했습니다. 바로 앱 스킴 값이 서로 중복되는 경우에 대한 문제입니다.

앱 개발자 입장에서는 앱에 등록된 스킴 값이 자신들의 앱만 사용하는 고유 값인지 확인할 방법이 현재는 없습니다.

 

구글플레이 앱은 자신드르이 앱을 오픈하기 위한 스킴 값으로 market://란 값을 사용하고 있습니다.

OneStore, 삼성 앱스토어 등의 오픈 마켓 또한 이 스킴 값을 사용합니다.

따라서 안드로이드 이용자들은 어떤 앱을 실행시켜야 하는지 선택하는 다음과 같은 화면을 보게 됩니다.

 

서로 동일한 market:// 스킴값을 사용할 경우 발생하는 문제

 

즉, 안드로이드 시스템이 현재 market:// 라는 스킴 값으로 앱을 열려고 할 때 사용자에게 "이 3종의 앱이 모두 'market://' 라는 스킴 값을 사용하는데 어떤 앱을 열어야 하나요?" 라고 물어보는 화면입니다. 안드로이드, iOS 모두 이와 비슷한 문제를 가지고 있습니다.

앱을 개발하는 개발자가 자신이 적용한 스팀 값이 다른 앱은 사용하지 않는 고유한 값인지 아닌지 확인할 수 있는 방법이 없고 다른 앱이 자신의 스킴 값을 사용한다 할지라도 이를 방지할 방법이 없는 상황입니다.

 

애플과 구글의 개발자들은 이를 근본적으로 막을 수 있는 방법은 없을지 고민했습니다. 그 고민 끝에 탄생한 것이 바로 유니버설 링크(iOS)와 앱링크(Android)입니다.

 

 

 

3. Universal Links vs Custom URL Scheme

  Universal Links Custom URL Scheme
장점 - 허용 여부를 묻지 않음
- 브라우저를 열지 않음
- 다른 플랫폼과도 호환 가능
- 앱이 설치되지 않은 경우 폴백 URL
- 구현이 쉬움
- 백엔드가 필요하지 않음
단점 - SSL(Secure Socket Layer) 있는 백엔드 필요
  + AASA(Apple App Site Association) 파일을 .well-known이나 root 디렉터리에 추가해야 함
- 구현이 더 복잡함
- 항상 허용 여부를 묻는 팝업을 띄움
- 안드로이드 등 다른 플랫폼에는 동작하지 않음
- 앱이 설치되어 있지 않다면 동작하지 않음
사용 방법 웹사이트의 Domain을 이용하여 등록 Scheme을 Xcode에 등록하여 사용
특징 웹사이트의 도메인을 사용하므로 중복 불가 중복 URL 가능(URL이 중복될 경우, 아이폰에서 어떤 앱을 선택할 것인지 물어봄)
동작 링크를 클릭했을 때 앱이 설치되어 있으면 앱으로, 설치되어 있지 않다면 앱스토어로 보냄 링크를 클릭했을 때 "앱스토어 설치"를 물어봄. 이후 앱이 설치되어 있으면 앱으로, 설치되어 있지 않다면 앱스토어로 보냄

 

 

4. Tutorial (Custom URL Scheme, SwiftUI)

https://www.youtube.com/watch?v=OyzFPrVIlQ8 

소스 코드: https://github.com/TDCIAN/DeepLinkSwiftUI

 

 

 

 

출처: 

- https://chat.openai.com/chat

- https://ios-development.tistory.com/207

 

[Deeplink] 딥링크 (URL Scheme, Universal Link)

딥링크란? "Deep"한 "Link", 화면속의 특정 부분으로 이동 할 수 있는 링크를 의미 사용자가 "새로운 메세지가 왔습니다"와 같은 push알림을 받고 그 부분을 탭했을 때, 메세지 화면으로 바로 이동 (딥

ios-development.tistory.com

- https://help.dfinery.io/hc/ko/articles/360039757433-%EB%94%A5%EB%A7%81%ED%81%AC-Deeplink-URI%EC%8A%A4%ED%82%B4-%EC%9C%A0%EB%8B%88%EB%B2%84%EC%85%9C-%EB%A7%81%ED%81%AC-%EC%95%B1%EB%A7%81%ED%81%AC-%EA%B5%AC%EB%B6%84%EA%B3%BC-%EC%9D%B4%ED%95%B4

- https://lxxyeon.tistory.com/74

 

[iOS/Swift] 유니버셜 링크(Universal Link) 적용하기, 동적 링크 수신하기

유니버셜 링크(Univeral Link) 란? iOS에서만 작동하는 딥링크*의 한 종류로 웹에서 앱을 호출하는 기능이 필요할 때 사용! *딥링크(Deep Link) : Application 내 특정 페이지에 도달할 수 있도록 하는 링크

lxxyeon.tistory.com

- https://dev-dain.tistory.com/270

 

[Swift] 딥링크와 다이나믹 링크

회사 와서 딥링크가 뭔지 첨 알았다. 모르는 게 많고 내가 업무를 통해 배워갈 게 많다는 게 좋긴 한데 잘 이해 못해서 버벅일까봐 그게 좀 걱정.. 아무튼, 코드 분석하면서 deeplink 어쩌구 되어 있

dev-dain.tistory.com