Android 환경에서는 커스텀 스킴, App Link와 사용되는 또 다른 딥링크가 있어요. 바로 Intent 스킴이죠. App Link가 개발되기 전에 Android 웹뷰에서 사용됐어요. iOS에서는 Intent 스킴을 사용하면 오류가 나요.

intent:
   HOST/URI-path // Optional host
   #Intent;
      package=\\[string\\];
      action=\\[string\\];
      category=\\[string\\];
      component=\\[string\\];
      scheme=\\[string\\];
   end;

 

Intent 스킴은 위와 같이 상당히 복잡한 형태를 가지고 있어요. 앱의 스킴, 패키지 등 많은 정보를 담고 있죠. 복잡하지만 개발자 입장에서는 Intent 스킴에서 제공하는 정보를 가공해서 다양한 방식으로 앱을 열 수 있죠. 예를 들어 앱이 설치되지 않았거나 invalid한 상태인 것을 확인하고 앱 패키지 정보로 플레이 스토어를 열 수 있어요.

아래 표는 지금까지 알아본 딥링크 유형을 정리하고 있어요. 더 자세한 내용은 포스트 맨 아래에 참고하면 좋을 자료에서 확인하세요.

 

딥링크 유형 Android iOS 특징 예시
커스텀 스킴 o o 널리 사용되지만 다른 앱에서 같은 스킴을 사용할 수 있음 my-app://host/path
App Link o x Google에서 출시한 Android 전용 딥링크 https://host/path
Universal Link x o Apple에서 출시한 iOS 전용 딥링크이며
macOS, watchOS에서도 사용함
https://host/path
Intent 스킴 o x 스킴, 패키지 등 많은 정보를 담고 있음 intenet://path#intenet:
schema:package

 

 

 

참고: 

https://www.tosspayments.com/blog/articles/dev-4?utm_source=velog&utm_medium=blog&utm_campaign=dev-10

'WEB&APP' 카테고리의 다른 글

[iOS] 앱 간 이동, 외부 앱 실행 방법  (0) 2024.11.13
앱스키마로 스토어 이동  (0) 2024.11.12
[javaScript] 화면 밝기 조절  (0) 2024.11.11

iOS는 기본적으로 샌드박스 환경이기 때문에 다른 앱들 간 정보를 주고 받는 것이 간단하지 않다고 한다.

 

Deeplink?

특정 콘텐츠에 직접 도달하는 모든 링크를 뜻하는데, 형태는 스킴(scheme)과 호스트(host)로 구성된 URL(Uniform Resource Locator)이며, 웹환경에서도 쉽게 적용할 수 있다.

쉽게 말해 상세 콘텐츠로 유저를 랜딩 시키는 링크를 말한다. 대부분의 웹 링크가 딥링크에 속한다.

앱의 특정 콘텐츠를 공유하고 싶을 경우에도 딥링크를 사용할 수 있다.

모바일 딥링크는 URI Scheme, Universal Lin(iOS), 앱링크(AOS) 이렇게 3가지 방식으로 구분된다.

 

간단하게 요약하면 아래와 같다.

  • URI Scheme : 애플의 iOS9 이전까지의 표준 딥링크 형식
  • 유니버설 링크 : iOS9부터 그 이후의 표준 딥링크 형식

 

Firebase, AppsFlyer 등 마케팅 툴(SDK)을 사용하는 것을 다이나믹링크, 원링크라고 하고, 
툴을 사용하지 않는 것은 딥링크라고 총칭할 수 있다. 


URI Scheme

  • if ( 해당 앱이 설치되어 있으면 ) 앱의 고유한 scheme을 정의하고 이 scheme으로 시작하는 URL을 열면 이 scheme을 갖고 있는 다른 앱을 실행.
  • But, 애플 앱 스토어에서 해당 앱이 정의한 scheme의 고유성을 보장해주지 않기 때문에 다른 앱들이 자신이 정의한 scheme을 사용하고 있을 수 있음.
    (동일한 scheme을 가진 앱 사이에서 랜덤 실행됨. 보안상 헛점 존재 —> 그래서 등장한 것이 유니버셜 링크)

URL Scheme

URL Scheme란 무엇일까요?

우리가 인터넷에 주소를 입력하면 앞에 붙는 https:// 이 부분이 바로 웹의 스키마입니다. 스키마는 https:// 만 있는것이 아닙니다.

맨 앞에 https:// 이 아니라 chrome:// 라고 적혀있죠? 이 뜻은 '웹사이트가 아닌 chrome에 직접 요청을 보냈다.' 라는 뜻입니다. 그럼 앱으로 한번 접근해보면 대충 상상이 가시나요? 스키마 자리에 URL Scheme를 지원하는 어떤 앱이 들어가면 해당 앱으로 요청을 보내 해당 앱을 실행시키게 됩니다.

 

웹사이트로 요청 -> https://
크롬으로 요청 -> chrome://
어떤 앱으로 요청 -> myApp://

이런 형태가 되는 것입니다.

 

앱이 깔려있을 때 특정 앱의 특정 페이지로 이동할 수 있다.
앱이 안깔려 있으면 무용지물이다. 너무 한정적인 딥링크.

 

단점

  • 스킴을 제약없이 설정이 가능하기 때문에, 고유한 딥링크를 점유할 수 없다.
    • 즉, 여러 앱에서 같은 이름의 스킴을 사용할 경우, 하이재킹(hijacking)될 수도 있다.
    • 이러한 이유로 몇몇 브라우저에서는 URL schemes에 대해 경고메세지를 띄우거나 동작을 막곤한다.
  • URL schemes만으로 앱 설치 유무를 알 수 없다.
    • 앱이 설치되어있지 않을 경우에 대해 공식적인 지원이 없기 때문에
      앱 미설치 유저는 딥링크가 동작하지 않는다.

Universal Link (iOS) (웹 주소 형태)

iOS는 Universal Link
Android는 App Link
  • 통상적으로 웹 주소 형태의 딥링크라고 불린다. 
  • 앱 번들 아이디를 미리 특정 도메인의 웹 사이트에 등록하는 방식
    (당연히 해당 도메인과 서버의 소유권이 있어야 사용 가능)
  • 앱에서는 유니버셜 링크를 허용할 도메인 추가, 서버에서는 apple-app-site-association 파일 등록 필요
  • 유니버설 링크로 들어오는 요청은 UIApplicationDelegate의 application:continueUserActivity:restorationHandler:메서드에서 전달받은 NSUserActivity객체를 사용해 처리 가능

1. Direct Deep Link

  • 초창기 딥링크 형태
  • 앱이 설치된 유저의 경우 특정 페이지로 랜딩이 되는것은 가능했지만, 앱이 설치되지 않은 유저의 경우 각 플랫폼의 앱스토어로 이동되며 설치 후 앱을 열었을 때 딥링크는 유실됨.
  • 이러한 단점을 보완하고자 디퍼드 딥링크 개념이 등장

 

  • Direct Deep Link와 마찬가지로 앱 미설치자는 각 플랫폼의 앱스토어로 이동되지만, 설치 후 앱을 열엇을 때 링크가 유실되지 앟고 특정 컨텐츠로 이동됨.
  • 그러나 각각의 플랫폼별에서만 작동한다는 한계가 존재. AOS 딥링크는 AOS에서만, iOS 딥링크는 iOS에서만 작동하기 때문에 트래킹 링크를 발급받으려면 2번의 생성작업을 거쳐야 했고, 따라서 이로인해 광고를 집행할 때에도 목적이 동일한 하나의 캠페인을 AOS캠페인, iOS캠페인 이렇게 나누어져야 함.
  • 위의 문제를 해결하기 위해 원링크 개념이 등장했다.

 

  • 하나의 링크에서 각각의 플랫폼으로 자동 분기처리해주는 원링크.

예를 들어 쇼핑몰에서 뭔가 구매를 하면 카카오톡 알림톡으로 주문 내역이 오겠죠?
그 주문 내역을 확인하려고 링크를 클릭했을 때, 앱이 없다면 그 앱을 설치할 수 있는 앱 스토어로 이동하고!
앱이 있다면 바로 앱의 그 주문 내역 페이지로 이동시켜주는 것이 원링크

 

Firebase 는 Dynamic Link
AppsFlyer 는 App Link 라고 불리운다. 

 

하나의 URL로 앱 내 특정 페이지로 이동하게 해준다. 앱이 설치 되어 있지 않아도, 스토어를 경유한 유입경로도 측정할 수 있다. 

다만, 실제로 사용을 해보니 툴에서도 단점들이 존재했다. 

 

1. Firebase Dynamic Link : Android는 잘되는데, iOS는 잘 동작이 안하기도 한다. (iOS버전별로 권한 정책 문제 등으로 FireBase 에서 대응을 빨리 못해서 그런걸지도..)

2. AppsFlyer: 가장 유명한 툴이다. Google Analytics와 상당히 비슷하다. (거의 같아 보임) 
다만, 상세한 유저 사용 패턴등을 확인하려면 커스터마이징을 해야한다.
예를들어 특정 사용자가 광고를 보고 앱을 설치해서 물품을 구입까지 했다! 라는 것을 확인하고 싶다면, 앱에서 구입완료 시점에 앱에서 key, value값을 보내야 한다. 

 

 

 

 

출처

https://feel5ny.github.io/2019/09/22/Communication_001/

 

웹에서 앱으로 이동하기 (feat.딥링크)

하나의 서비스가 웹이나 앱, 두 가지 플랫폼에서 운영 중일 경우, 서로가 서로의 플랫폼으로 고객을 이동시킬 수 있다. 앱에서는 웹링크를 사용하여 웹으로 이동시키거나, 인앱브라우저로 웹화

feel5ny.github.io

 

 

 

 

'WEB&APP' 카테고리의 다른 글

Intent 스킴  (0) 2024.11.14
앱스키마로 스토어 이동  (0) 2024.11.12
[javaScript] 화면 밝기 조절  (0) 2024.11.11

isIosWebView & isAndWebView

export const isIOSWebView = /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(
  getUA,
);
export const isAndWebView = !!window.binder;

 

bridgeOpenBrowser - 외부화면 이동

export const bridgeOpenBrowser = (url: string): void => {
  try {
    if (isIOSWebView) {
      webkit.messageHandlers.openBrowser.postMessage({
        url: url, // 이동할 경로
      });
    } else if (isAndWebView) {
      window.binder?.openBrowser(url);
    } else {
      window.open(url);
    }
  } catch (e) {
    console.log('error bridge openBrowser');
  }
};

 

 

bridgeOpenAppSchemeStore - 앱스키마로 스토어로 이동

export const bridgeOpenAppSchemeStore = () => {
  try {
    if (isIOSWebView) {
      //iOS는 스키마가 없어서 브라우저로 열기
      const update_url = 'https://itunes.apple.com/app/어쩌고';
      bridgeOpenBrowser(update_url);
    } else if (isAndWebView) {
      //스키마, 패키지명
      window.binder?.openAppScheme(
        'market://details?id=com.어쩌고.lmscp',
        'com.어쩌고.lmscp',
      );
    }
  } catch (e) {
    console.log('error bridge restart');
  }
};

'WEB&APP' 카테고리의 다른 글

Intent 스킴  (0) 2024.11.14
[iOS] 앱 간 이동, 외부 앱 실행 방법  (0) 2024.11.13
[javaScript] 화면 밝기 조절  (0) 2024.11.11

import

import {
  bridgeBarcodeClose,
  bridgeBarcodeOpen,
} from 'src/utils/bridge';

 

라우팅되면 함수 소환

useEffect(() => {
// 화면 밝기 최대
bridgeBarcodeOpen();
}, []);

 

화면 밝기 최대 함수

/**
 * @name 바코드 열기(화면 밝기 최대)
 */
export const bridgeBarcodeOpen = () => {
  try {
    if (isIOSWebView) {
      webkit.messageHandlers.barcodeOpen.postMessage({});
    } else if (isAndWebView) {
      window.binder?.barcodeOpen();
    }
  } catch (e) {
    console.log('error bridge barcodeOpen');
  }
};

'WEB&APP' 카테고리의 다른 글

Intent 스킴  (0) 2024.11.14
[iOS] 앱 간 이동, 외부 앱 실행 방법  (0) 2024.11.13
앱스키마로 스토어 이동  (0) 2024.11.12

+ Recent posts