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:// 라는 스킴 값으로 앱을 열려고 할 때 사용자에게 "이 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
- https://lxxyeon.tistory.com/74
- https://dev-dain.tistory.com/270
'iOS > Common' 카테고리의 다른 글
[Swift] 네이티브의 WKWebView와 웹의 JavaScript 간 통신 방법 (0) | 2023.04.14 |
---|---|
[Swift] 누군가 REST API를 묻거든 고개를 들어 어딜 봐야 하지..? (0) | 2023.04.12 |
[Swift] SOLID 원칙에 관하여 (0) | 2023.04.10 |
[Swift] 의존성 주입에 관하여(feat. Swinject, Dip, Typhoon) (0) | 2023.04.10 |
[Swift] 함수형 프로그래밍(feat. 순수 함수) (0) | 2023.04.10 |