먹고 기도하고 코딩하라

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

앱/Swift

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

사과먹는사람 2022. 12. 20. 00:11
728x90
728x90

 

회사 와서 딥링크가 뭔지 첨 알았다. 모르는 게 많고 내가 업무를 통해 배워갈 게 많다는 게 좋긴 한데 잘 이해 못해서 버벅일까봐 그게 좀 걱정.. 아무튼, 코드 분석하면서 deeplink 어쩌구 되어 있는 건 보긴 봤는데 정확히 뭔지는 모르겠지만 당장의 분석에 크게 필요하지 않은 거라서 넘겼는데 공부하면 좋을 것 같다고 하셔서 주말 걸쳐서 공부했다.


우선 딥링크는 하이퍼 링크의 모바일판과도 같다. 특정 주소나 값을 입력하면 앱이 실행되거나, 앱의 특정 화면으로 이동한다. 음.. 예를 들면, 핸드폰하다가 쿠팡 물건 광고가 뜨는 경우를 생각해볼 수 있겠다. 쿠팡 앱이 설치되어 있을 때 광고를 누르면, 바로 쿠팡 앱이 켜지면서 그 상품으로 넘어가는 이런 게 딥링크의 일종이라고 할 수 있을 것 같다. 서버에서 앱에 URL을 전송하면 앱에서 그 URL을 갖고 파싱해서 특정 화면으로 전환하는 개념이다.

 

iOS에서 딥링크를 구현하는 방법은 2가지가 있다. 

  • URL Scheme
  • Universal Links

애플이 유니버셜 링크를 공개한지도 이제 시간이 꽤 지나 유니버셜 링크도 많이 사용되지 않을까 하는 생각이 드는데 Scheme 방식도 안 쓰지는 않는 것 같다. 유니버셜 링크는 같은 링크로 웹페이지와 앱을 쉽게 연결하는 방법으로서 도입된 것이다. 

 

(1) URL Scheme

URL Scheme 방식은 구현하기 쉽다. 어떤 scheme을 사용할 건지만 앱에 설정하면 되기 때문이다. 

보통 URL 컨벤션은 앱 이름으로 시작해서 path, query 부분을 웹 URL처럼 설정하는 것이다.

URL Scheme 방식으로 딥링크를 사용하려면 프로젝트 Info > URL Types에서 scheme을 먼저 등록해줘야 한다. 그런 다음 scheme://resource 식으로 URL 포맷을 맞춰야 한다. 예를 들어 비밀번호를 리셋하는 페이지로 가고 싶다면, "my_app"이라는 URL scheme을 등록한 후 딥링크 넘어가는 데에서 "my_app://reset_password" 이렇게 써주는 식이다.

사파리나 WKWebView에서 링크를 클릭하면 AppDelegate만 있을 때 application(app:url:options:), 그렇지 않으면 SceneDelegate의 scene(scene:URLContexts:)를 호출하게 된다.

 

링크를 클릭했을 때, 앱스토어가 설치되어 있는지 확인 후에 설치되어 있으면 앱으로 이동하고, 그렇지 않으면 앱스토어로 이동한다.

URL Scheme 문자열을 통해 URL 인스턴스를 생성하고, UIApplication.canOpenURL(_:)로 URL Scheme의 유효성을 확인한 뒤, open을 호출한다. 딥링크 처리를 어떻게 하는지는 프로젝트마다 살짝 다른듯하다.

UIApplication.shared.open(_:options:completionHandler:)

 

(2) Universal Links

웹사이트나 앱 콘텐츠로 부드럽게 링크를 걸어준다. 앱이 설치되어 있지 않더라도 사용자에게 통합된 모바일 경험을 줄 수 있다는~ 그런 장점이 있다고 소개하고 있다. iOS 9 이상에서 지원되어 현재 존재하는 거의 모든 앱에서 유니버셜 링크를 사용할 수 있을 것 같다. 

이 경우에는 프로젝트 Signing & Capabilities > Associated Domains에 Domain을 등록한다. applinks:my_app.app.link, applinks:my_app.page.link 이런 식으로 등록된다.

파이어베이스 다이나믹 링크를 사용할 때도 마찬가지로 Associated Domains에 등록하게 된다.

링크를 클릭했을 때 링크가 설치되어 있다면 묻지 않고 바로 앱으로 연결되고, 아니라면 앱스토어로 연결된다.

외부에서 딥링크를 탭하면 AppDelegate의 application(_:open:options:)를 통해 앱을 시작한다.

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool

iOS 13 이후 SceneDelegate가 생기면서, SceneDelegate가 있는 프로젝트에서는 SceneDelegate의 scene(scene:userActivity:), scene(scene:URLContexts:)에서 링크를 핸들링한다.

func scene(_ scene: UIScene, continue userActivity: NSUserActivity)

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>)

 

URL Scheme과 Universal Links의 비교

URL Scheme의 장점

  • 구현이 쉬움
  • 백엔드가 필요하지 않음

URL Scheme의 단점

  • 항상 허용 여부를 묻는 팝업을 띄움
  • 안드로이드 등 다른 플랫폼에는 동작하지 않음
  • 앱이 설치되어 있지 않다면 동작하지 않음

Universal Links의 장점

  • 허용 여부를 묻지 않음
  • 브라우저를 열지 않음
  • 다른 플랫폼과도 호환 가능
  • 앱이 설치되지 않은 경우 폴백 URL

Universal Links의 단점

  • SSL 있는 백엔드 필요 (+AASA(Apple App Site Association) 파일을 .well-known이나 root 디렉터리에 추가해야 함)
  • 구현이 더 복잡함

그러니까 URL Scheme의 장점이 고스란히 Universal Links의 단점이 되고 반대로 Universal Links의 장점도 고스란히 URL Scheme의 단점이 된다.

 

 

Dynamic Links

다이나믹 링크는 파이어베이스에서 제공하는 딥링크의 일종이다. 똑같은 링크에 접속했을 때, 접속 플랫폼에 따라 적절한 반응을 하도록 한다. 예를 들어 기기에 앱이 설치되어 있지 않을 때 iOS면 앱스토어로 보내주고 안드로이드면 플레이스토어로 보내주는 식이다. 

그래서 어떤 플랫폼으로 앱에 접근할지 모르는, 초대장 보내기 등에 사용하기 좋다고 한다.

다이나믹 링크를 적용하기 위해서는 FirebaseDynamicLinks 패키지가 있어야 하므로 코코아팟이나 SPM 등으로 미리 설치해야 한다. 또한 파이어베이스 앱의 Dynamic Links에서 링크도 미리 만들어둬야 한다. (무료로 만들 때는 앱이름.page.link 이런 도메인을 쓰게 된다) 내 경우 page.link/apple-app-site-association에 접근하면 이런 JSON이 나온다.

{"applinks":{"apps":[],"details":[{"appID":"앱키.com.fcm.test.di","paths":["NOT /_/*","/*"]},{"appID":"앱키.com.FCMTest","paths":["NOT /_/*","/*"]}]}}

다이나믹 링크를 받으려면 프로젝트 Info > URL Types에 번들 ID로 URL Scheme도 적어줘야 하고, Signing & Capability에서 Associated Domains도 함께 추가해야 한다. applinks:URL_Prefix 식으로 추가하면 된다.

그 다음에는 SceneDelegate(SceneDelegate가 없는 프로젝트의 경우 AppDelegate)에서 다이나믹 링크를 핸들링하는 코드를 추가하면 된다. 

func scene(_ scene: UIScene, continue userActivity: NSUserActivity)

 

흠.. 글이 조금 부실한 듯해 주중에 다시 수정하긴 해야겠다. 어쨌든 딥링크의 구현 방법 2가지와 다이나믹 링크를 어떻게 사용할 수 있는지만 간단히 살펴봤다.

 

 

 

References

 

728x90
반응형
Comments