CLOVA 건강검진 챗봇

네이버 지도 딥링크 — visibilitychange로 fallback 중복 막기

병원 위치를 네이버 지도 앱으로 열었다가 돌아오면, 앱 이동에 성공했는데도 웹 검색 fallback이 또 실행됐다. 브라우저는 "앱으로 잘 갔다"를 알려주지 않는다 — 그 빈틈을 visibilitychange로 메웠다.

문제

병원 검색에서 위치를 누르면 네이버 지도 으로 딥링크 이동하고, 앱이 없으면 웹 검색 fallback을 열도록 했다. 그런데 앱 이동에 성공한 뒤 브라우저로 복귀하면, 불필요하게 fallback(웹 검색)까지 실행됐다. 원래는 앱 이동 실패 시에만 fallback이 열려야 했다.

원인

딥링크는 "앱이 실제로 열렸는지"를 직접 알려주지 않는다. 그래서 일정 시간 뒤 fallback을 여는 흔한 방식은, 앱이 열렸어도 타이머가 그대로 돌아 fallback이 중복 실행되기 쉽다.

해결: visibilitychange로 앱 이동 감지

앱으로 이동하면 브라우저 탭이 백그라운드(hidden)가 된다. 이를 visibilitychange로 감지해, hidden이 되면 fallback 실행을 취소했다.

const openMap = (appUrl: string, fallbackUrl: string) => {
  const timer = setTimeout(() => {
    document.removeEventListener("visibilitychange", onHidden);
    window.location.href = fallbackUrl; // 앱이 안 열렸을 때만 웹 검색
  }, 1500);
 
  const onHidden = () => {
    if (document.visibilityState === "hidden") {
      clearTimeout(timer); // 앱으로 이동 성공 → fallback 취소
    }
  };
  document.addEventListener("visibilitychange", onHidden, { once: true });
 
  window.location.href = appUrl; // 앱 딥링크 시도
};

결과

  • 앱 이동에 성공하면 fallback(웹 검색)이 열리지 않음
  • 앱이 없을 때만 fallback 동작 → 불필요한 네이버 지도 웹 검색 제거