-
반응형
이 글은 iOS 13+ 인 경우 기준으로 작성되었습니다.
Universal link에 대한 자세한 설명은 공식 애플문서를 참고하세요 developer.apple.com/library/archive/documentation/General/Conceptual/AppSearch/UniversalLinks.html
developer.apple.com/documentation/safariservices/supporting_associated_domains
🥑 Universal link의 동작 원리
1. 앱이 설치되거나 업데이트 될 때, 미리 정의 해 놓은 web url에 접근한다.
2. https://mydomain.com/.well-known/apple-app-site-association 주소에 업로드 된 JSON 파일을 파싱해서 'component' 에 지정되어 있는 경로의 웹사이트 링크를 클릭 한 경우 웹페이지 대신 앱을 기동 하도록 기억해 놓는다.
3. 추후에 해당 url로 시작하는 링크를 클릭한 경우 사파리 대신 App을 바로 기동시킨다.
서버 작업 + 앱 작업 순서로 알아보자.
📝 Server 에 AASA 추가하기
Universal link를 사용하기 위해서는 소유한 도메인이 있어야 한다. 해당 도메인의 AASA 파일을 업로드해야 하는데 몇가지 주의할 점이 있다.
✔️redirection 이 없어야 하고
✔️https 여야 하고
✔️JSON 확장자가 있으면 안된다.
여기에 AASA파일을 저장하는 주소와 포맷이 iOS 13 을 기준으로 조금 달라진다.
https://mydomain.com/.well-known/apple-app-site-association (iOS 13 이상)
https://mydomain.com/apple-app-site-association (iOS 13 미만)
AASA 파일 예시는 다음과 같다.
AppID 는 appIdPrefix (==team id) + bundle id이다.
만약 iOS 13 이상 이면 아래와 같이 하면 되고,
{ applinks: { details: [ { appIDs: [ "1234ASDF.me.dundinstudio.remocle" ], components: [ { /: "*" } ] } ] } }
iOS 12 점 대를 지원하고 있다면 apps, appId, paths 를 따로 적어줘야 한다.
{ applinks: { apps: [], // only before iOS 13 details: [ { appId: "1234ASDF.me.dundinstudio.remocle", // only before iOS 13 paths: [ "*" ], // only before iOS 13 appIDs: [ "1234ASDF.me.dundinstudio.remocle" ], components: [ { /: "*" } ] } ] } }
server configuration에 대해서는 다음 글에 잘 나와있다.
gist.github.com/anhar/6d50c023f442fb2437e1
다른 앱들이 어떻게 쓰고 있는지 궁금하다면 몰래(?) 가서 염탐해도 된다.
kyte.travel/.well-known/apple-app-site-association
🍎 iOS 앱에서 Capability 추가하기
App > Target > Signing and Capability 에서 Associated Domain을 추가한다.
+ 버튼 누르고, applinks:{yourdomain} 추가. 요렇게 하면 해당 url 의 .well-known/apple-app-site-association 경로에 가서 aasa 포맷을 확인하라고 OS에게 알려준 것이 된다.
자이제 여기까지 했으면 Universal Link의 기본적인 틀은 갖춰진 것이다.
이제 메모장 앱에서 https://remocle.com/open 이런식으로 클릭하면 (앱이 설치되어 있다면) 앱이 열리게 되는 것이다.
여기서 주의 할 점
✔️ AASA 는 앱이 설치될 때 & 업데이트 될 때 조회되기 때문에 AASA 파일을 수정한 경우 앱을 삭제 후 재설치 해야만 변경이 반영 된다.
✔️링크 클릭을 테스트 할 때
시스템 기본 메모장 앱에서 테스트 하는 것이 제일 정확하다.실제 테스트 해보니 한글 인코딩 관련 버그가 발견되어 .. Slack에서 테스트 하길 바랍니다.🚙 iOS 앱에서 Universal link클릭해서 들어온 URL handle 하기
원래는 Univeral Link를 클릭하면 AppDelegate 의 openURL 를 통해서 앱이 기동이 되는데, Scene Delegate 을 사용할 경우 AppDelegate 의 openURL 함수가 불리지 않고 SceneDelegate 의 openURLContexts 함수만 불리니 주의.
// AppDelegate.swift func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { // TODO } //SceneDelegate.swift func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { guard let url = URLContexts.first?.url else { return } // TODO }
TODO 써있는 곳에서 알아서 navigate 를 하면 되는데, 나중에 AppRouter 구조도 한번 다뤄봐야지 .
Notification, Universal Link, Custom Scheme 모두 하나의 Router로 처리하면 편하다.
👀 Universal link가 동작 안하는 경우
✔️웹브라우저에서 직접 url 입력시 실제로 그 주소로 이동하고자 하는 의사가 있다고 생각해서 universal link가 동작하지 않는다.
✔️iOS version이 10 미만인 경우 Universal Link가 동작하지 않는다.
✔️AASA 를 변경 해도 바로 반영되지 않는다. Apple CDN 캐시가 있기때문 .. 지웠다 깔아도 바로 반영이 안된다면 조금 기다린 후 다시 확인하면 된다.
참고WWDC: developer.apple.com/videos/play/wwdc2020/10098/
validation tool: search.developer.apple.com/appsearch-validation-tool
반응형'개발' 카테고리의 다른 글
[SwiftUI] Keyboard avoidance 동작하지 않도록 하기 (0) 2021.05.17 [Fastlane] 인증서 싱크 오류 해결 (nuke) (0) 2021.05.08 Fastlane 을 사용해서 Firebase Distribution 배포하기 (0) 2021.04.17 [Firebase/Crashlytics] Bitcode 때문에 dSYM 업로드 안되는 이슈 (0) 2021.04.07 [iOS/Swift] Multiselection 되는 Photo picker Library 선택하기 (0) 2021.04.07 댓글