본문 바로가기
카테고리 없음

[React] 카카오톡/라인 인앱 브라우저에서 외부 브라우저로 열기

by Judy 2024. 12. 6.

카카오톡, 라인에서 인앱 브라우저에서 외부 브라우저로 열기할 때 사용하려고 한다.

GA utm 파라미터를 잃게되거나 혹은 다른 url로 변경될 때 전달되지 않은 값이 있을 수 있으니 이걸로 처리하는게 좋을 듯 싶다.

 

import React, { useEffect } from 'react';

const InAppBrowserRedirect = () => {
  useEffect(() => {
    const copyToClipboard = (val) => {
      const textarea = document.createElement('textarea');
      document.body.appendChild(textarea);
      textarea.value = val;
      textarea.select();
      document.execCommand('copy');
      document.body.removeChild(textarea);
    };

    const inAppBrowserOut = () => {
      copyToClipboard(window.location.href);
      alert(
        'URL주소가 복사되었습니다.\n\nSafari가 열리면 주소창을 길게 터치한 뒤, "붙여놓기 및 이동"를 누르면 정상적으로 이용하실 수 있습니다.'
      );
      window.location.href = 'x-web-search://?';
    };

    const userAgent = navigator.userAgent.toLowerCase();
    const targetUrl = window.location.href;

    if (userAgent.match(/kakaotalk/i)) {
      // 카카오톡 외부 브라우저로 호출
      window.location.href = `kakaotalk://web/openExternal?url=${encodeURIComponent(targetUrl)}`;
    } else if (userAgent.match(/line/i)) {
      // 라인 외부 브라우저로 호출
      const urlWithParam =
        targetUrl.indexOf('?') !== -1
          ? `${targetUrl}&openExternalBrowser=1`
          : `${targetUrl}?openExternalBrowser=1`;
      window.location.href = urlWithParam;
    } else if (
      userAgent.match(
        /inapp|naver|snapchat|wirtschaftswoche|thunderbird|instagram|everytimeapp|whatsApp|electron|wadiz|aliapp|zumapp|iphone(.*)whale|android(.*)whale|kakaostory|band|twitter|DaumApps|DaumDevice\/mobile|FB_IAB|FB4A|FBAN|FBIOS|FBSS|trill|SamsungBrowser\/[^1]/i
      )
    ) {
      if (userAgent.match(/iphone|ipad|ipod/i)) {
        // iOS: Safari로 이동 안내
        const mobileMeta = document.createElement('meta');
        mobileMeta.name = 'viewport';
        mobileMeta.content = 'width=device-width, initial-scale=1, shrink-to-fit=no, user-scalable=no, minimal-ui';
        document.head.appendChild(mobileMeta);

        const fontLink = document.createElement('link');
        fontLink.href = 'https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@100;300;400;500;700;900&display=swap';
        fontLink.rel = 'stylesheet';
        document.head.appendChild(fontLink);

        document.body.innerHTML = `
          <style>
            body {
              margin: 0;
              padding: 0;
              font-family: 'Noto Sans KR', sans-serif;
              overflow: hidden;
              height: 100%;
            }
          </style>
          <h2 style="padding-top: 50px; text-align: center;">인앱브라우저 호환 문제</h2>
          <article style="text-align: center; font-size: 17px; color: #999;">
            아래 버튼을 눌러 Safari를 실행해주세요.<br />
            Safari가 열리면, 주소창을 길게 터치한 뒤,<br />
            '붙여놓기 및 이동'을 누르면 정상적으로 이용할 수 있습니다.<br /><br />
            <button
              onclick="(${inAppBrowserOut.toString()})()"
              style="min-width: 180px; margin-top: 10px; height: 54px; font-weight: 700; background-color: #31408E; color: #fff; border-radius: 4px; font-size: 17px; border: 0;"
            >
              Safari로 열기
            </button>
          </article>
          <img style="width: 70%; margin: 50px 15% 0 15%;" src="https://tistory3.daumcdn.net/tistory/1893869/skin/images/inappbrowserout.jpeg" />
        `;
      } else {
        // Android: Chrome으로 이동
        window.location.href = `intent://${targetUrl.replace(/https?:\/\//i, '')}#Intent;scheme=http;package=com.android.chrome;end`;
      }
    }
  }, []);

  return null;
};

export default InAppBrowserRedirect;

 

이 분의 글을 참고하였습니다.

https://burndogfather.com/271