Skip to main content

Command Palette

Search for a command to run...

React / Next.js 웹뷰에서 네이티브 앱으로 메세지 보내기/토큰받기

Published
•2 min read•View as Markdown

메세지 보내기

global.d.ts에서 Window 의 타입에 webkit과 메세지핸들러를 미리 정의해줘야 오류가 나지 않는다.

웹킷은 네이티브 앱에서 웹뷰로 페이지를 호출할 때 생기는 것이라 기본 window에는 존재하지 않는다.

// global.d.ts
export {}

declare global {
  interface Window {
    webkit: {
      messageHandlers: {
        MESSAGE_HANDLER_NAME: {
          postMessage: (param: string) => void;
        };
      };
    };
  }
}

위의 MESSAGE_HANDLER_NAME 은 앱 개발자와 상의해서 이름을 정해주면 된다. 이 때, param으로 넘겨주는 메세지도 개발자 간 상의하여 정하면 된다! 물론 그냥 던지고 파싱해서 알도록할순있지만 효율을 위해 미리 정해두도록하자..

tsconfig.json파일에서 global.d.ts를 읽도록 설정해준다.

// tsconfig.json

include:["./src/*.tsx", "./src/*.ts", "./src/**/*.tsx", "./src/**/*.ts", "next-env.d.ts", "global.d.ts",],

그 후 웹뷰에서 앱에 메세지를 보내야 하는 곳에 아래 로직을 넣어주면 된다. 안의 내용은 꼭 { message: string } 형태가 아니더라도 상황에 맞게 수정할 수 있다.

const 대충웹뷰에메세지보낼함수이름 = () => {
    if (window.webkit) {
      window.webkit.messageHandlers.MESSAGE_HANDLER_NAME.postMessage(
        JSON.stringify({ message: "success" })
      );
    }
  };

토큰 받기

현재 Next를 사용하고 있는데, App Router가 아닌 Page Router를 사용하고 있어서, getServerSideProps를 사용하여 네이티브 앱에서 웹뷰 url을 호출할 때, 헤더에 토큰을 넣어 보내주면 그것을 뽑아서 써야했다.

export const getServerSideProps = (async (context) => {
  console.log(context.req.headers);
  const token = context.req.headers.authorization;
  return {
    props: { token: String(token) },
  };
}) satisfies GetServerSideProps<{}>;

export default function Page({ token }: { token: string }) {
  return (
    <>
      <SomeComponent token={token} />
    </>
  );
}

처음에 context의 내용을 뜯어보다가, rawHeaders라는게 있길래 거기서 뽑아 써야하는 줄 알고 그렇게 처리했었는데, 어떻게 해도 그 값이 넘어오지 않길래 시간을 좀 낭비했다.

rawHeaders가 아니라 headers로 접근해서 뽑아와야 정상적으로 값을 넘겨줄 수 있다!!

More from this blog

번들링 최적화를 통한 import cost 줄이기

최근 팀에서 개발한 디자인 시스템 라이브러리를 프로젝트에 적용하고 사용하면서 흥미로운 문제를 발견했다.(사실 전부터 알고있었지만 잠깐 미뤄뒀다.) 단순히 Button 컴포넌트 하나만 필요했는데, 번들 분석 도구를 확인해보니 라이브러리 전체가 번들에 포함되어 있었던 것이다. 단 하나의 컴포넌트를 위해 수백 KB의 코드가 추가되어버린 것.. // 예상: Button 컴포넌트만 가져오기 import { Button } from '@company/de...

Mar 11, 20256 min read45

package.json 진입점 설정과 타입 접근성의 관계 이해하기

JavaScript와 TypeScript 패키지를 개발할 때 package.json의 진입점 설정은 단순히 어떤 파일이 먼저 로드될지를 결정하는 것 이상의 의미를 갖는다. 특히 TypeScript를 사용하는 프로젝트에서는 타입 접근성에 중요한 영향을 미친다. 회사 패키지를 수정하다가, “@패키지/dist/…” 와 같은 임포트 경로가 너무 프로젝트 내부의 구조등을 대놓고 보여주고 있기도 하고, 무엇보다 보기에 거슬려서 이를 해결하기 위해 type...

Mar 5, 20254 min read15

[2월 회고] 우당탕탕 반백수 2월

업무 이직 첫출근 2/26. 실업급여 퇴사 일주일 뒤에 새 회사에 출근을 하게 됐다. 사실 2주 정도 실업급여를 받고 나서 입사를 했다면 “조기취업수당”이라는 것을 통해 돈을 더 받을수 있었는데, 몇백만원 더 받자고 집에서 더 놀기에는 엉덩이가 들썩거리기도 하고 집에서 뇌가 굳어가는 것 같아 하루라도 빨리 입사를 하고싶었다. 그리고 나는 갈 회사가 있어서 사실상 받을 필요가 없으니 실업급여가 정말 필요한 사람들이 받아가는 게 더 맞지 않...

Feb 28, 20247 min read264
[2월 회고] 우당탕탕 반백수 2월

[1월 회고] 비전공자 출신 신입이었던 내가 6개월만에 칼이직러가 될수있었던 이유 …더보기

신년 맞이(?) 회사 경영악화로 인한 인원축소가 일어나, 잘 다니던 직장을 하루아침에 잃게되었다. 그 과정에서 다소 혼란스럽지만 먹고는 살아야겠기에 열심히(?) 이직준비..를 했던것 같다. 사실 처음에는 왜 내가 정리돼야하는지 현실부정 및 자괴감에 빠져서 아무것도 하기싫어병에 걸렸었는데, 요즘 채용시장이 안좋아서 이력서도 서류탈락의 연속이었던지라 절망의 늪에서 허우적대며 더더욱 깊이 빠져가던 차에 서류합격한 한 회사에 올인했다. 지나고나서야 하...

Feb 7, 20245 min read624

1nxeo's devlog

11 posts