React Native의 WebView 안팎에서 커뮤니케이션
13814 단어 React NativeReactwebviewtech
여러 가지 이유로 WebView로 구성된 컨텐트를 그리기로 결정했습니다.
WebView는 웹페이지 전면에서 간단명료하게 Ifame과 유사한 기술입니다.
WebView
구성 요소에서 정적 HTML이나 특정한 사이트의 웹 페이지가 내부에 나타난다.안드로이드 네이티브의 경우 동명WebView, iOS/macOS의 경우WkWebView가 있다.
이번에는 리액트 네이티브의 웹뷰에서 웹뷰에서 배제하거나 거꾸로 대화하는 방법을 정리했다.
React Native의 WebView
React Native의 WebView는 이전 버전으로, 지금은 별도의 패키지인 것 같습니다.
마침 문서에 Communicating between JS and Native라는 단도직입적인 내용이 있다.
injectedJavaScript
를 React Native WebView 속성으로 지정injectJavaScript
지정window.ReactNativeWebView.postMessage
와 React Native 웹뷰의 속성으로 메시지 받기onMessage
injectedJavaScript
패키지 공식https://github.com/react-native-webview/react-native-webview/blob/master/docs/Guide.md#the-injectedjavascript-prop은 클래스 구성 요소에 대한 설명입니다.함수형 구성 요소(Hooks)로 쓰면 이런 느낌이죠.
const App: React.FC = () => {
return (
<WebView
style={{ flex: 1 }}
source={{
url: 'http://localhost:3000',
}}
injectedJavaScript={`
alert('Injected!');
true; // 必須
`}
/>
)
}
injectedJavaScrpt
는 문자열을 JavaScript로 실행하는 속성입니다.console.log
어디로 가는지 모르기 때문에 사용할 수 없을 것 같아요true
note: this is required, or you'll sometimes get silent failures
기본적으로 페이지를 읽기 전에 전역에 영향을 주는 코드를 실행해야 한다.
injectJavaScript
초기화할 때 전 세계에서만 JS를 실시하면 너무 불편합니다.이에 따라 웹뷰의 리프부터 메소드 실행
injectJavaScript
도 준비했다.const App: React.FC = () => {
const ref = React.useRef<any>()
React.useEffect(() => {
setTimeout(() => {
ref.injectJavaScript(`
alert('inject!');
true;
`)
}, 3000)
}, [])
return (
<WebView
ref={ref}
style={{ flex: 1 }}
source={{
url: 'http://localhost:3000',
}}
/>
)
}
모델이 적합합니다.ref.injectJavaScript(code)
언제든지 코드를 실행할 수 있습니다.Button
후 실행 코드, 생물 측정 OK 시 실행 코드 등 처리를 할 수 있다.postMessage / onMessage
WebView 내부에서 실행되는 코드부터 React Native를 추진하려는 애플리케이션에 사용할 수 있습니다.
window.ReactNativeWebView.postMessage(message)
.그러나 message
는 문자열이어야 합니다.여러 데이터, 복잡한 데이터 구조 등을 보내려면 JSON을 사용하는 것이 좋다.postMessage
에서 보낸 문자열은 속성onMessage
에서 수신할 수 있습니다.// React Native 側
const App: React.FC = () => {
return (
<WebView
style={{ flex: 1 }}
source={{
url: 'http://localhost:3000'
}}
onMessage={(ev) => console.log(ev.nativeEvent.data)}
>
)
}
// WebView 内部のコード
if ('ReactNativeWebView' in window) {
window.ReactNativeWebView.postMessage(
JSON.stringify({ type: 'hoge', hoge: 'ほげ' }),
)
}
와 같이 사용합니다.postMessage
다만, 발송만 가능하고 답장을 받을 수 없는 등 사용이 편리하다고 할 수는 없지만, 웹뷰 내부에서 먼저 통신이 가능하다.총결산
injectedJavaScript
속성(나머지 3개 시스템)injectJavaScript
방법postMessage
함수React Native 초보자라서 잘못 알았나 봐요.만약 잘못이나 이렇게 하는 것이 비교적 좋다는 것이 있다면 반드시 평론 같은 것을 써야 한다.
Reference
이 문제에 관하여(React Native의 WebView 안팎에서 커뮤니케이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/erukiti/articles/react-native-webview-comm텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)