유니버셜 링크1란 iOS9 이상 버전에서 웹 링크를 눌렀을때 사파리 브라우져가 아닌 바로 설치된 앱으로 연결 해주도록 하는 기술 입니다.
만약 앱이 설치 되어 있지 않다면 사파리로 자동으로 연결이 됩니다.

예를들어 사파리에서 http://youtube.com 을 링크를 눌러서 열때, 앱이 설치 되어 있으면 유투브 앱이 실행되게 하는 기술 입니다.

즉, 하나의 URL을 가지고 앱이나 웹을 자동으로 연결 되도록 하기때문에 좀더 심플해지고2 사용하기 편해졌습니다.

그리고, Universal Links 를 사용하려면 https (SSL) 을 적용 해야 사용이 가능합니다.


apple-app-site-association

유니버셜 링크를 적용하려면 해당 JSON 데이터가 적혀있는 apple-app-site-association 파일을 웹서버의 루트 혹은 사용할 URL의 위치에 업로드 해야 합니다.

{
    "applinks": {
        "apps": [],
        "details": [
            {
                "appID": "9JA89QQLNQ.io.github.krazie99",
                "paths": [ "*", "/"]
            }
        ]
    }
}

details에는 하나 이상 입력 가능합니다.

  • AppID
    • PrefixID.앱번들아이디
  • paths
    • * : 하위 모든 항목
    • / : 루트
    • /서브/ : 서브 폴더
    • /서브/* : 서브 이하 모든 항목
    • NOT /서브2/ : 서브2를 제외

애플 개발자 사이트에서 Prefix ID 를 확인 하실 수 있습니다.


XCode Project Setting

위에 apple-app-site-association 파일을 서버에 업로드를 하였으면, 앱 프로젝트 세팅에서 앱 링크 도메인을 입력 해주셔야 합니다.
XCode Project Setting > Capabilities 에서 Associated DomainsON 해주시고, Domains 에 applinks:도메인 을 입력하시고 저장을 하게 되면 Entitlements 파일이 생성 되고 해당 파일에 저장됩니다.

위의 설정을 완료 하고 나서는 꼭 Provisioning Profile 을 갱신 하셔야 정상적으로 작동 합니다.


AppDelegate

마지막으로, 링크를 타고 실행 되는 AppDelegate 의 딜리게이트 처리를 하시면 됩니다.

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]?) -> Void) -> Bool {

  guard let _rootViewController = self.window?.rootViewController as? ViewController else {
      return false
    }

    if let strUrl = userActivity.webpageURL?.absoluteString {
      //딥링크 처리  
      //웹브라우징에서 들어왔을때 처리
      if userActivity.activityType == NSUserActivityTypeBrowsingWeb {

      }
      else {

      }
    }

    return true
}

유니버셜 링크를 적용 후에는 링크 에서 제대로 적용이 되었는지 확인이 가능합니다.
참고로, 유니버셜 링크 가 모든곳에서 동작하지 않습니다.


정리하며

만약 개발하고 있는 혹은 개발된 앱에서 유니버셜 링크 를 사용하게 된다면 사용자에게 더 좋은 경험을 줄 수 있다고 생각합니다.


  1. 유니버셜 링크 레퍼런스 문서 

  2. 기존에는 App Scheme을 따로 입력하기때문에 웹이랑 앱이랑 URL 이 달랐습니다.