맛동산이

Swift) deepLink, Universal Link 처리하기 본문

앱/Swift

Swift) deepLink, Universal Link 처리하기

진ddang 2024. 9. 17. 04:35

딥링크란, iOS에서 url을 통해서 웹에서 앱을 호출하는 기능을 의미한다.

딥링크의 방법은 크게, 3개정도로 나눌 수 있다.

  • URL 스킴 : 앱내 URL 스킴을 저장하여 딥링크 사용
  • 유니버셜 링크 : 도메인 주소를 이용하여, 앱이 설치되어있는지 아닌지에 따라 앱내부 또는 앱스토어로 이동하게 하는 링크
  • 다이나믹 링크 : 파이어베이스에서 제공하는 딥링크의 일종

iOS에서 유니버셜 링크와 딥링크의 차이점은

  • 사용 자체는, 사용자로 하여금 웹 페이지에서 앱으로 끌고 올 수 있다는 점에서 동일하다.
  • 하지만 Web fallback이 지원된다는 것 (앱이 없으면 웹으로 간다)이 가장 큰 차이.
    • Deep link 주소로는 앱이 없다면 아무것도 할수 없지만, 유니버셜 링크에서는 앱이없다면 웹으로 호출하게 된다.
  • 결과적으로 같은 주소로 웹 서비스, 앱 서비스 둘 다 지원할 수 있다는 점에서 유니버셜 링크가 딥링크보다 UX적으로 더 좋다.

URL Scheme

URL scheme은 초기형태의 딥링크를 의미한다.

URL scheme은 다음과 같은 형태이다.

{scheme}://{path}?xxxx=1234  
- scheme: 어떤 앱인지 
- path: 어떤 화면을 보여줄건지

하지만 URL 스킴의 경우에는 앱이 설치되어 있을 때만 동작한다는 단점이 존재

1. URL Scheme만드는 방법

info.plist에서 URL type에 url Scheme을 추가하면 끝.

2. URL scheme 오픈을 통해서 앱 내부의 동작 정의하기

보편적으로 enum을 만들어서 해당 url을 읽은다음 해당 타입에 맞는 동작을 실행하도록 한다.

url을 읽는방법은 openULR이라는 내부적으로 정의된 메소드를 사용하면 된다.

처리하는 내부동작 정의

  1. appDelegate에 deeplinkHandler 추가
class AppDelegate {
 lazy var deepLinkHandler: DeepLinkHandler = DeepLinkHandler()
}
  1. appDelegate에서 딥링크 로직 핸들링 추가
  • 유니버셜 링크
func application(_ application: UIApplication, continuation userActivity: NSUserActivity NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
	if let universalLinkURL = userActivity.weppageURL { let handler = DynamicLink.dynamicLinks().handleUniversalLink(universalLink) { [weak self] dynamiclink, error in
    guard let dynamicLinkURL = dynamiclink?.url else { return } 
    self?.deepLinkHandler.handleURL(dynamicLinkURL) return handled ? handled : deepLinkHandler.handleURL(universalLinkURL) } 
    return false 
  }

 

  • 다이나믹 링크
func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool { 
	let handled = DynamicLicks.dynamicLinks().handleUniversalLink(url) { [weak self] dynamiclink, error in
    	guard let dynamicLinkURL = dynamiclink?.url else { return } self?.deepLinkHandler.handleURL(dynamicLinkURL) } 
        return handled ? handled : deeplinkHandler.handleURL(url) 
      }

 

 

 

  1. 딥링크 enum 타입 생성

정확히 어떠한 동작을 할지를 먼저 정의해둠 (코드편의상)

enum Path

위에 PathEnum을 생성할때 init에 url을 받아서 case로 나눠주는 로직을 만들어둔다.

여기에서 urlString값에 따른, 타입과, 해당 타입의 쿼리에 따른 타입을 상세하게 나눠준다.

  1. deepLinkHandler 추가
func handleDeepLink(_ url: URL) {
// url 처리 로직이 있으면 여기다 추가
	handler.openURL(url) 
}
func openURL(_ url: URL) {
	guard let topViewController else { return }
	let queries = url.getQuery() // 쿼리를 따로 뽑는 로직이 있어야함
	if topViewController.navigationController == nil {
		topViewController.dismiss(animiated: true) { [weak self] in
			self?.openURL(url)
		}
	}
	let action = PathEnum(url: url) {
		switch action {
			case .root: break
			case .케이스1: break
	}

위에서 만들어뒀던, Path enum에 따라서, 뷰의 이동이나 동작을 구현해주면 끝!


유니버셜 링크를 사용하는 부분은 다음을 참고

Universal link 적용하기

반응형