Project/softsphere

[React Native] WebView 동작 흐름 이해하기

written by yunwon 2021. 10. 3. 20:57

 

 

 

React Native 코드 분석을 본격적으로 시작하면서

처음 마주한 WebView 에 대해서 조사하면서

배워간 내용들에 대해 정리해려 한다 . . 🐱‍🏍

 

우선 WebView 자체가 ReactNative 에서 제공하는 것이 아니라,

react-native-webview 패키지에서 제공된다 !

 

하나씩 차근차근 알아보자

 

 

 


 

 

WebView 란?

이미 존재하는 웹 페이지를 앱으로 옮겨 보여주는 것

 

WebView 설치하기

WebView 를 사용하기 위해서는 WebView 를 import 해주어야 한다.

기존에는 React Native core 에 있었지만,

React Natvie 가 core 에서 빼버렸기에 따로 설치를 해주어야 한다.

 

프로젝트 디렉토리 내에서 아래 두 명령어를 실행시켜주면 제대로 설치된다.

$ npm install --save react-native-webview
$ react-native link react-native-webview

 

WebView Import (사용) 하기

(1) uri 사용

import React, { Component } from 'react';
import { WebView } from 'react-native-webview';

class MyWeb extends Component {
  render() {
    return <WebView source={{ uri: 'https://reactnative.dev/' }} />;
  }
}

 

(2) inline HTML 사용

import React, { Component } from 'react';
import { WebView } from 'react-native-webview';

class MyInlineWeb extends Component {
  render() {
    return (
      <WebView
        originWhitelist={['*']}
        source={{ html: '<h1>This is a static HTML source!</h1>' }}
      />
    );
  }
}

 

 

 


 

 

 

WebView에 의해 로드된 웹페이지로 메시지를 보내고,

해당 웹페이지로부터 메시지를 수신하고자 하는 작업을 수행해보자.

 

이를 위해서, 사용할 수 있는 방법이 3가지 있다!

 

1️⃣ [ReactNaitve -> Web 1] injectedJavaScript

웹 페이지를 처음 로드했을 때 바로 실행되는 스크립트이다.

페이지를 다시 로드하거나 이동하더라도 한 번만 실행된다.

import React, { Component } from 'react';
import { View } from 'react-native';
import { WebView } from 'react-native-webview';

export default class App extends Component {
  render() {
    const runFirst = `
      document.body.style.backgroundColor = 'red';
      setTimeout(function() { window.alert('hi') }, 2000);
      true; // note: this is required, or you'll sometimes get silent failures
    `;
    return (
      <View style={{ flex: 1 }}>
        <WebView
          source={{
            uri: 'https://github.com/react-native-webview/react-native-webview',
          }}
          onMessage={(event) => {}}
          injectedJavaScript={runFirst}
        />
      </View>
    );
  }
}

 

2️⃣ [ReactNaitve -> Web 2] injectJavaScript

또한, 반환 값 없이 WebView 에서 즉시 실행되는 JavaScript 코드를 삽입할 수 있다.

import React, { Component } from 'react';
import { View } from 'react-native';
import { WebView } from 'react-native-webview';

export default class App extends Component {
  render() {
    const run = `
      document.body.style.backgroundColor = 'blue';
      true;
    `;

    setTimeout(() => {
      this.webref.injectJavaScript(run);
    }, 3000); // 3초 뒤 파란색 배경으로 변한다

    return (
      <View style={{ flex: 1 }}>
        <WebView
          ref={(r) => (this.webref = r)}
          source={{
            uri: 'https://github.com/react-native-webview/react-native-webview',
          }}
        />
      </View>
    );
  }
}

 

3️⃣ [Web -> ReactNative] postMessage/onMessage

실제적인 웹과 앱의 양방향 통신을 위한 API 이다.

ReactNative 쪽에서 onMessage 를 통해 WebView 의 postMessage 를 호출하면

데이터를 받는 형식이다.

 

onMessage 는 필수로 세팅해줘야 한다

그렇지 않으면 window.ReactNativeWebView.postMessage 메소드가 웹 페이지에 주입되지 않는다.

postMessage 는 string 인 하나의 인수만 사용할 수 있다.

import React, { Component } from 'react';
import { View } from 'react-native';
import { WebView } from 'react-native-webview';

export default class App extends Component {
  render() {
    const html = `
      <html>
      <body>
        <script>
          setTimeout(function () {
            window.ReactNativeWebView.postMessage("Hello!")
          }, 2000)
        </script>
      </body>
      </html>
    `;

    return (
      <View style={{ flex: 1 }}>
        <WebView
          source={{ html }}
          onMessage={(event) => {
            alert(event.nativeEvent.data);
          }}
        />
      </View>
    );
  }
}

 

 

프로젝트를 진행하면서 주로 3번 방식으로 WebView 를 사용한다.

더 많은 내용은 공식 문서에 자세하게 쓰여져 있으니,

참고하시길 바라요 !

 

(여담으로 React Native 는  대부분 영어 문서 뿐인다 . .

영어 공부를 병행해보자 . . )

 

 

 

 

 

© 참고

https://github.com/react-native-webview/react-native-webview (WebView Github 공식 문서)

https://url.kr/uwm9pi (WebView 기본 설명 ★)

https://bangc.tistory.com/8 (React Native 와 WebView 데이터 통신 방식)

https://smok95.tistory.com/274 (WebView 데이터 전달받는 간단한 예제)

 

GitHub - react-native-webview/react-native-webview: React Native Cross-Platform WebView

React Native Cross-Platform WebView. Contribute to react-native-webview/react-native-webview development by creating an account on GitHub.

github.com