딥 링크 (feat. unity)

Sharlotte ·2023년 11월 13일
0

Unity

목록 보기
4/4
post-thumbnail

⚠️ Notice!
일부 이미지는 외부 웹페이지로부터 가져온 이미지입니다. 이미지에 출처 링크가 걸려 있으므로 이미지를 클릭하면 원본 웹페이지로 이동하게 됩니다.

Deep Link

In the context of mobile appsdeep linking consists of using a uniform resource identifier (URI) that links to a specific location within a mobile app rather than simply launching the app.
모바일 앱의 경우 딥 링킹은 단순히 앱을 실행하는 것이 아니라 모바일 앱 내의 특정 위치로 연결되는 유니폼 리소스 식별자(URI)를 사용하는 것입니다.

Mobile deep linking Wikipedia

딥링크는 특정 위치로 이동하기 위한 일종의 유니폼 리소스 식별자 사용법입니다. 딥링크를 사용하면 해당 콘텐츠의 최상위 경로 (ex: https://github.com/Sharlotteshttps://github.com, 카카오톡은 직접 열기)에서 직접 콘텐츠를 찾아 들어갈 필요 없이, 콘텐츠에 곧바로 도달할 수 있습니다.

딥링크를 사용하면 콘텐츠의 접근성을 극대화할 수 있으며 UX를 크게 향상시킬 수 있습니다. 딥링크는 웹사이트, 모바일 앱, 윈도우즈 앱, 맥OS 앱 등 여러 환경에서 각자 다른 정책으로 제공되고 있습니다. 정책이 제각각인 이유는 플렛폼 자체의 파편화, 보안적 문제, 자신과 관련된 기능 부여(플레이스토어로 이동 등)에 의한 것입니다.

웹 딥링킹과 앱 딥링킹

일반적으로 유저는 위와 같이 URI를 타고 웹사이트로 이동앱 딥링크는 똑같이, 위와 같이 URI를 타고 어플리케이션으로 이동

웹 딥링크와 앱 딥링크는 그 흐름이 사뭇 다르지 않습니다. 웹 딥링크로 특정 링크를 타고 목적지로 지정된 해당 웹사이트의 콘텐츠로 도달할 수 있듯이, 앱 딥링크 역시 특정 링크를 타고 목적지로 지정된 해당 앱의 콘텐츠로 도달할 수 있습니다.

deep linking is the use of a hyperlink that links to a specific
deep linking Wikipedia

그러나 한가지 차이점은 웹 딥링크가 하이퍼링크를 사용하므로 프로토콜이 대개 HTTP나 HTTPS인 것에 비해 앱 딥링크는 임의의 스키마를 사용한다는 것입니다. 그러므로 우리는 먼저 스키마를 이해해야 합니다.

URI (Uniform Resource Identifier)

…그 전에 스키마를 포함하는 URI, 통합 자원 식별자에 대해 알아야 합니다.

A Uniform Resource Identifier (URI) is a unique sequence of characters that identifies a logical or physical resource used by web technologies.
URI(Uniform Resource Identifier)는 웹 기술에서 사용하는 논리적 또는 물리적 리소스를 식별하는 고유한 문자 시퀀스입니다.

Uniform Resource Identifier Wikipedia

URI는 뭐든지 식별하는 데 사용될 수 있습니다. 물리적이든 넷상에 있든 간에 그것을 식별하기 위한 서식입니다. 예를 들어, 깃허브 웹페이지에서 제 프로필의 위치를 가리키는 식별자는 https://github.com/Sharlottes 입니다. 또, 국제표준도서번호(ISBN) 시스템에서 로미오와 줄리엣의 특정 판본을 가리키는 식별자는 urn:isbn:0-486-27557-4입니다.

URI? URL?


종종 URI와 URL를 햇갈리는데, URI는 URL과 URN를 내포하는 상위 개념입니다. 앞선 예에서 깃허브가 URL(ocation)이고 로미오와 줄리엣이 URN(ame)입니다. 이름 그대로, 저 깃허브 링크는 고유한 위치를, 로미오와 줄리엣은 고유한 이름을 가리킵니다.

Syntax

URI로 표현될 딥링크의 구성 요소를 이해할려면 먼저 문법부터 알아야겠죠?

위 이미지는 URI의 구문 다이어그램입니다. 구문 다이어그램은 철도 다이어그램으로도 불리며, 왼쪽에서 오른쪽으로 기찻길을 따라 기차가 지나가는 것을 생각하며 이해하면 됩니다.

그러므로 아래 예시들은 모두 유효한 문법입니다.

https://john.doe@www.example.com:123/forum/questions/?tag=networking&order=newest#top
ldap://[2001:db8::7]/c=GB?objectClass?one
mailto:John.Doe@example.com
news:comp.infosystems.www.servers.unix
tel:+1-816-555-1212
telnet://192.0.2.16:80/
urn:oasis:names:specification:docbook:dtd:xml:4.1.2
unitydl://mylink?parameter
kakaotalk://me

이제 각 구성 요소들이 무엇을 의미하는지 알아보겠습니다.

스키마 또는 프로토콜(scheme)는 : 앞에 위치하는 구성요소입니다. 이 URI이 어떤 형식으로 구성되고 해석되는지, 즉 URI의 종류를 알려줍니다. data, http, ftp, javascript, mainto, tel, urn, unitydl, ws 등 다양한 프로토콜과 스키마가 있습니다.

권한(userinfo, host, port)은 // 뒤에 위치하는 구성요소입니다. 이 URI이 누구의 것인지 알려줍니다. userinfo, host, port로 구성되어 있습니다.

  • userinfo는 리소스를 보유한 유저의 정보를 알려줍니다. username와 password로 나뉘며 SQL나 mailto 에서 흔히 볼 수 있는 선택적 유저 정보입니다.
    • mysql+mysqldb://scott:tiger@localhost/test?charset=utf8&use_unicode=0
    • mailto:John.Doe@example.com
  • host는 리소스를 제공하고 있는 호스트의 정보를 알려줍니다. 주로 IP 또는 도메인이며 웹페이지 링크에서 흔히 볼 수 있습니다.
  • port는 리소스를 제공하고 있는 호스트의 포트를 알려줍니다. 환경에 따라 기본값이 있어서 port는 선택적입니다.

경로(path)는 / 뒤에 위치하는 구성요소입니다. URI가 가르키는 리소스의 위치 경로를 알려줍니다. 경로가 최상단(/) 인 경우 생략되는 경우도 있습니다. 종종 위치 경로 뿐만이 아니라 계층적인 정보(parameter)를 넘기는 용도로도 쓰입니다. (ex: https://stackoverflow.com/questions/41966092 에서 questions는 path이나 41966092는 parameter로 쓰임)

쿼리(query)는 ? 뒤에 위치하는 선택적 구성요소입니다. URI가 가르키는 리소스에 추가적인 동적 정보를 전달하고 싶을 때 주로 사용됩니다. 표준 문법은 없지만 대개 key1=value1&key2=value2 와 같이 key-value 형식으로 이용됩니다. path에서 계층적인 parameter로 쓰이는 것과 대조적으로, 비(非)계층적인 parameter를 넘기고 싶을 때 쓰입니다.

조각(fragment)는 # 뒤에 위치하는 선택적 구성요소입니다. HTML 문서에서 자주 보입니다 (ex: https://www.wikiwand.com/en/Uniform Resource Identifier#Design 에서 Design 문단을 가리키는 #Design fragment) path parameter, query처럼 선택적인 부가정보를 주지만 유일한 보조 리소스 라는 점에서 특별함이 있습니다.

딥링크는 그저 커스텀 스키마(scheme)로 이루어진 URI Scheme가 전부지 않습니다.

딥링크는 웹사이트, 모바일 앱, 윈도우즈 앱, 맥OS 앱 등 여러 환경에서 각자 다른 정책으로 제공되고 있습니다. 정책이 제각각인 이유는 플렛폼 자체의 파편화, 보안적 문제, 자신과 관련된 기능 부여(플레이스토어로 이동 등)에 의한 것입니다.

제가 앞서 정책이 제각각이라고 말씀드린 것이 바로 이것입니다. 딥링크는 URI Scheme 뿐만이 아니라 안드로이드용 App Link, iOS용 Universal Link가 있습니다. (참고로 Unity에선 App Link 대신 Intent Scheme를 사용하는데, 더 구체적인 정보를 지니는 안드로이드 딥링크입니다.)

이 딥링크들은 여러 부가적인 효과를 지닙니다.

  • 고유합니다. 앞서 설명한 URI의 스키마가 세상에서 단 하나 밖에 없을지 증명할 수단이 없습니다. 안드로이드는 같은 스키마를 가진 두 앱이 있다면 선택지를 주지만, iOS는 그렇지 않다고 합니다. 보안상으로도 악성 앱이 같은 스키마를 가진다면 잘못 클릭하여 위험해질 수도 있습니다.
    그러므로 고유함은 여러모로 유용합니다.

    세 앱들은 모두 market:// 스키마를 가지고 있어서 이런 일이 자주 발생합니다.

  • 커스텀 스키마 대신 웹페이지를 사용합니다. 고유함을 어떻게 실현할지 고민하던 안드로이드와 애플 개발자들은 도메인을 써먹자고 결정했습니다. 이제 개발자는 폴백 상태에서 이 웹페이지에서 웹페이지 콘텐츠를 보여줄 수도 있고, AndroidiOS에게 줘야 할 앱의 고유 정보를 포함한 JSON을 주어 앱 마켓으로 이동시킬 수도 있습니다.

  • 플렛폼 어드벤티지를 받을 수 있습니다. 만약 이동할려는 앱이 없으면 어떻게 해야 할까요? 이 개선된 딥링크들은 이런 폴백(fallback)상태에서 앱 마켓으로 이동하여 앱 설치를 유도하는 기능을 제공합니다.

그러나 OS마다 브라우저(심지어 카톡같은 자체 브라우저)마다 지원 유무가 갈리는 문제, 유저가 직접 링크를 눌러야만 작동하는 문제 등으로 인해 여전히 URI Scheme도 제공해주어야 합니다.

Unity

앞서 설명한 것에 따르면 딥 링크는 세가지 종류가 있고, 유니티는 네가지 플렛폼 (android, ios, windows, mac) 에서 딥 링크를 지원하고 있습니다. 플렛폼마다 딥 링크를 지원하는 방식이 다르니 일일이 설정을 해보아야 합니다.

Unity 딥 링크 공식문서에서 플렛폼마다 활성화하는 방법과 프로그래밍적으로 딥 링크를 처리하는 방법을 모두 설명해주고 있습니다. 제 컴퓨터가 윈도우인 관계로 UWP(Universal Windows Platform)만을 시도해보겠습니다.

⚠️ 유니티 버전을 잘 확인하세요!
2021.1 이전 공식문서에는 macOS 딥링크가 없지만 이후 공식문서인 2022.3 공식문서에는 있습니다.
문서 자체가 달라서 버전 선택에도 잡히지가 않으니 공식문서를 읽을 때 유의하세요.

2021.1 이전, 딥 링크 활성화 문서2021.2 이후, 딥 링크 문서

그 전에 추가적인 개발 환경을 설정해야 합니다.

먼저, Unity Hub에서 Unity Editor에 UWP 빌드 지원 모듈을 설치합니다.

모듈 설치가 끝났으면 빌드 설정을 마저 해야합니다.

우리는 UWP 빌드를 하여 UWP 딥 링크를 시도할 것이니 빌드 설정에서 UWP로 설정해야 합니다.

여기선 devcelopment build가 켜져있는데 사실 없어도 됩니다. 윈도우에서 개발자 모드도 켜야하고 여튼 복잡해져요.

위 빌드 설정창을 보면 “Selected Visual Studio is missing required components” 라 경고가 뜹니다. 현재 비주얼 스튜디오에 필요한 UWP 개발 컴포넌트가 없다는 뜻입니다.

그러므로 Visual Studio Installer로 Visual Studio에 UWP 개발 워크로드를 설치합니다.

이어서 Player Settings에 들어가 UWP 탭의 Publishing Setting - Protocol - Name에서 유니티 딥 링크에 쓸 프로토콜(스키마) 이름을 정합니다. 전 예제대로 unitydl를 쓰겠습니다.

Build And Run 을 클릭하면 Unity가 독립적으로 실행할 수 있는 앱 실행 파일을 빌드합니다.

유니터설 Windows 플랫폼(UWP) 빌드 설정

마지막으로, 공식문서에 따라 Build가 아니라 Build And Run를 해야 합니다.

Build 결과에선 원하시는 exe 파일을 찾을 수 없을겁니다.
Build만 하고 딥링크로 launch하는 것도 안됩니다. 대신 Build and Run를 한 다음 끄고 나서 launch하는건 됩니다.

제가 직접 해보지 않았기에 이 글에는 담지 않았지만 유니티 딥링크 공식문서에선 iOS, macOS, Android에 대한 세팅 방법도 알려줍니다. 제가 이를 상기시키는 이유는 유니티가 Android의 인텐트 스키마와 iOS/macOS의 유니버설 링크를 지원하기 때문입니다. 즉, 앱 마켓으로 이동시키는 폴백 기능과 고유성 및 소유권 증명을 유니티 앱으로도 할 수 있습니다.

딥 링크를 Unity에서 사용하는 방법은 두가지가 있습니다.

  • 애플리케이션이 시작할 때 Application.absoluteURL 를 확인한다.
    • 즉, 딥링크로 인해 앱이 시작할 때 absoluteURL를 확인하여 처리할 수 있습니다.
  • 애플리케이션이 실행 중일 때 Application.deepLinkActivated 이벤트를 구독한다.
    • 즉, 애플리케이션을 켜두고 다른 창에서 딥링크를 타고 들어갈 때 이 이벤트로 확인하여 처리할 수 있습니다.

아래는 딥링크 예제 코드입니다.

public class DeepLinkManager : MonoBehaviour
{
    public static DeepLinkManager Main { get; private set; }

    private void Awake()
    {
        if (Main == null)
        {
            Main = this;
            Screen.fullScreen = false;
            Application.deepLinkActivated += OnDeepLinkActivated;
            if (!string.IsNullOrEmpty(Application.absoluteURL))
            {
                // Cold start and Application.absoluteURL not null so process Deep Link.
                OnDeepLinkActivated(Application.absoluteURL);
            }
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }

    private void OnDeepLinkActivated(string url)
    {
        Debug.Log($"DEEPLINK URL: {url}");
    }
}

유니티 앱을 다른 창에 열어두고 지정된 딥링크로 유저가 이동했을 때, 유니티는 Application.deepLinkActivated이벤트를 호출합니다. 임의로 구현한 DeepLinkManager 에서 미리 Application.deepLinkActivatedOnDeepLinkActivated 메서드를 추가했으므로 이벤트가 호출된 즉시 구독한 OnDeepLinkActivated 메서드도 호출됩니다. deepLinkActivated 이벤트는 파라미터로 딥링크 URL를 가지고 있으며 이는 Application.absoluteURL 과 같습니다.

유니티 앱을 열어두지 않고 지정된 딥링크로 유저가 이동하면 앱이 시작되고 Application.absoluteURL이 null이 아님을 확인한 다음 OnDeepLinkActivated 메서드를 호출합니다.

테스트 - 딥링크로 씬 열기

아래 예제는 유니티 딥 링크 공식문서에서 제공하고 있는 예제 코드를 약간 개조한 버전입니다.

using UnityEngine;
using UnityEngine.SceneManagement;

public class DeepLinkManager : MonoBehaviour
{
    public static DeepLinkManager Instance { get; private set; }
    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
            Screen.fullScreen = false;
            Application.deepLinkActivated += onDeepLinkActivated;
            if (!string.IsNullOrEmpty(Application.absoluteURL))
            {
                // Cold start and Application.absoluteURL not null so process Deep Link.
                onDeepLinkActivated(Application.absoluteURL);
            }
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }

    private void onDeepLinkActivated(string url)
    {
        // url is unitydl://mylink or unitydl://mylink?{sceneName}
        string[] urlAndQuery = url.Split('?');
        if(urlAndQuery.Length == 1)
        {
            return;
        }

        string sceneName = urlAndQuery[1];
        if (!(sceneName == "scene1" || sceneName == "scene2"))
        {
            return;
        }

        Screen.fullScreen = false;
        SceneManager.LoadScene(sceneName);
    }
}

씬을 열기 위한 웹페이지도 필요하겠죠?

간단히 메모장에 아래 코드를 적고, index.html로 저장한 다음 브라우저로 엽니다.

<html>
    <head>
       <meta http-equiv=Content-Type content="text/html; charset=utf-8">
    </head>
    <body>
       <h1>My Deep Link Test page</h1>
       <p><a href="unitydl://mylink">Launch</a></p>
       <p><a href="unitydl://mylink?scene1">Launch to Scene1</a></p>
       <p><a href="unitydl://mylink?scene2">Launch to Scene2</a></p>
    </body>
</html>

유니티에서 Build and Run를 한 다음 웹페이지에서 세가지 링크 중 하나를 눌러 딥 링크를 타고 빌드한 앱으로 이동합니다.

좋습니다! 저흰 방금 query를 파라미터로 삼아 특정 씬으로 딥링크했습니다.

Application.absoluteURL 또는 Application.deepLinkActivated 의 파라미터는 딥링크의 절대(전체)경로를 나타내므로 이 URL 문자열을 원하는 만큼 자르고 나눠서 사용하면 됩니다.

마치며

이상으로 URI, 딥링크, 유니티에서의 적용과 예제를 통해 유니티 딥링크를 알려드렸습니다.

보다시피 유니티 딥링크의 활용도는 무궁무진합니다. 딥링크로 들어온 유저에게 혜택 선물을 줄 수도 있고, 특정 콘텐츠를 공유할 수도 있으며, 특정 페이지 또는 씬으로 바로 이동시킬 수도 있습니다. 물론, 중간에 필수 과정(플레이어 설정이라던가)이 필요하다면 이 이동을 지연시킬 수도 있겠죠!

유니티 개발 자체도 중요하지만, 개발한 작품에 유저가 접근할 수 있는 표면적을 늘리는 접근성도 중요합니다. 이 아티클로 접근성 향상에 대한 방법을 익히셨으면 좋겠습니다.

📖Reference

딥링크(Deep Link) | 토스페이먼츠 개발자센터

딥링크(Deeplink) : URI스킴, 유니버셜 링크, 앱링크 구분과 이해

[딥링크101] 마케터와 개발자를 위한 딥링크 시작하기 | 에어브릿지 블로그

웹의 리소스 식별하기 - HTTP | MDN

딥링킹이란 무엇이며 어떻게 작동하나요? | Adjust | Adjust

Wikiwand - Deep linking

Wikiwand - Mobile deep linking

Wikiwand - Syntax diagram

Wikiwand - Uniform Resource Identifier

Enable apps for websites using app URI handlers - UWP applications

Deep Links: Open links directly in Desktop and Mobile Apps

Database URI or URL?

딥 링크 - Unity 매뉴얼

유니버설 Windows 플랫폼(UWP) 빌드 설정 - Unity 매뉴얼

Add deep links to your Unity mobile apps for better user experience | Unity Blog

profile
샤르르르

0개의 댓글