• 티스토리 홈
  • 프로필사진
    루루개발자
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
루루개발자
  • 프로필사진
    루루개발자
    • 분류 전체보기 (212)
      • react & next.js (12)
      • Node.js & Javascript & Type.. (24)
        • d3.js (10)
      • 차트 만들기 (1)
      • 티스토리 스킨 개발 (7)
      • 내가 만든 패키지 (3)
      • 내가 만든 CSS (1)
      • CSS (7)
      • 도커 & 쿠버네티스 (3)
      • 개인 프로젝트 (7)
      • 리뷰 & 추천 (2)
      • 알고리즘 (1)
      • IT 기타 (18)
      • 잡동사니 (1)
      • Spring Boot (5)
      • 취미로 그리는 그림들 (120)
      • 개인적인 생각들 (0)
  • 반응형
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • 웹에서 url scheme 로 앱 호출시 앱 설치 여부 감지 방법
        2022년 06월 09일
        • 루루개발자
        • 작성자
        • 2022.06.09.:27
        반응형

         

        안녕하세요. 루루개발자입니다.

        최근 회사에서 진행중인 프로젝트 중에 웹에서 앱을 호출해야 하는 상황이 있었습니다.

         

        웹에서 앱을 호출하기 위해서는 앱의 url scheme 를 다음과 같은 예시처럼 웹에서 호출해주어야 합니다.

         

        <a href="sampleApp://action?var1=a&var2=b">앱 호출</a>

         

        <span onclick="location.href = 'sampleApp://action?var1=a&var2=b'">앱 호출</span>

         

         

        앱이 사용자의 휴대폰에 설치되어 있다면 해당하는 앱이 정상적으로 호출되겠지만, 문제는 앱이 설치되어 있지 않을 때의 이벤트를 감지해야 하는데 마땅한 방법이 떠오르지 않았습니다.

         

        그러던 도중 문득 event listener 중 focus 와 blur 를 활용해 비슷한(?) 기능을 구현할 수 있을 것 같았고 다음과 같이 코드를 작성하였습니다.

        class UrlSchemeCaller {
          windowState = 'focus';
            
          constructor() {
            this.init();
          }
            
          init() {
            window.addEventListener('focus', () => {
              this.windowState = 'focus';
            });
            
            window.addEventListener('blur', () => {
              this.windowState = 'blur';
            });
          }
          
          call(urlScheme, notInstalledCallback) {
            location.href = urlScheme;
              
            setTimeout(() => {
              if (this.windowState === 'focus') {
                // 앱이 설치되어 있지 않은 상태
                notInstalledCallback();
              } 
            }, 300);
          }
        }
        
        window.urlSchemeCaller = new UrlSchemeCaller();

         

        원리는 다음과 같습니다.

         

        만약 앱이 설치되어 있는 상태라면, url scheme 호출시 모바일 웹브라우저가 백그라운드로 이동되고 그 위에 호출한 앱이 표시가 될겁니다. 이 때 브라우저에서 window 에는 blur 이벤트가 발생하게 되고 위의 코드로 인해 urlSchemeCaller 객체의 windowState 에는 'blur' 가 저장될 겁니다.

         

        하지만 만약 앱이 설치되어 있지 않은 상태라면 url scheme 호출시 아무런 반응이 없을 것이고 window 의 blur 이벤트도 발생하지 않을 것이기 때문에 urlSchemeCaller 객체의 windowState 는 그대로 'focus' 상태일 것입니다.

         

        이점을 이용해 urlScheme 호출 후에 setTimeout 으로 일정 시간 이후에 windowState 값이 어떤 값이냐에 따라 설치가 되었는지 아니면 설치가 되지 않은 상태인지 판단을 하는 것입니다. (windowState 가 blur 이면 앱이 호출되었다 판단하여 앱이 설치되었다고 처리, 그리고 windowState 가 focus 이면 앱이 호출되지 않았다고 판단하여 앱이 설치되지 않았다고 처리)

         

        위 javascript class 코드를 파일로 첨부합니다.

         

        url-scheme-caller.js
        0.00MB

         

        위 js 파일을 script 태그로 가져오신 뒤, 아래 처럼 바로 사용하시면 됩니다.

        urlSchemeCaller.call('sampleApp://action', () => { 
          console.log('이 함수는 앱이 설치 되어 있지 않을 때 호출되는 함수입니다.');
          // other logic...
        });

         

        이상입니다.

        감사합니다.

         

        반응형

        'Node.js & Javascript & Typescript' 카테고리의 다른 글

        Node.js 16.15.1 설치시 npm 에서 "config global `--global`, `--local` are deprecated" 경고 발생 현상  (0) 2022.06.21
        클로저(Closure)에 대해 알아봅시다.  (0) 2022.06.11
        javascript 난독화 이슈 (생성자 인자의 파라미터명)  (0) 2022.05.11
        javascript 파일 난독화  (0) 2022.05.10
        TDZ(Temporal Dead Zone)  (0) 2021.11.16
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바