React-native내의 영역을 웹으로 넘겨서 웹뷰로 띄워 보여주는 방식으로 변경되는 프로젝트를 진행중 작업과정을 다시 정리해보고자 한다.
뒤로가기 할때 웹뷰가 꺼지지 않고 이전 웹페이지 스택이 호출되는 이슈
그래서 사수님과 작업은 했었는데, 이제는 꽤나 사람들이 많이 이용하게 되는 부분에 적용이 되어야해서 뭐가 문제이고 정확하게 문제를 해결해야 했다.
웹뷰가 닫혀야하는 곳에서 닫히지 않는 이슈
- 웹에서 전달한 메시지를 앱에서 받기 위해서는 onMessage에 작업을 해야한다.
(참고 링크: 웹에서 전달한 메시지 앱에서 받기)
e.nativeEvent.data를 감지하여 "WINDOW_CLOSED"와 같으면 navigation.goback()을 하도록,
function messageHandler(e: WebViewMessageEvent) {
const eventStatus = e.nativeEvent;
if (eventStatus.data === 'WINDOW_CLOSED') {
return navigation.goBack();
}
if (eventStatus.data === 'POPSTATE') {
setPaging(paging - 1);
} else if (eventStatus.data === 'navigationStateChange') {
setPaging(paging + 1);
}
<WebView
ref={webviewRef}
javaScriptCanOpenWindowsAutomatically
style={flex}
onMessage={messageHandler}
...
/>
안드로이드에서 웹뷰를 연 후 다음 페이지스택으로 넘어가면 물리적 백핸들러가 작동하지 않았다.(aa라는 웹페이지에서 뒤로가기를 하면 되지만 , aa/bb로 스택이 쌓이면 안됨)
Android Developers 페이지에 보면
setUserAgentString
public abstract void setUserAgentString (String ua)
WebView의 사용자 에이전트 문자열을 설정합니다. 문자열이 비어 있거나 null비어 있으면 시스템 기본값이 사용됩니다.
사용자 에이전트가 이러한 방식으로 재정의되면 사용자 에이전트 클라이언트 힌트 헤더 값과 navigator.userAgentData이 WebView에 대한 값이 변경될 수 있습니다.
Android 버전 부터 Build.VERSION_CODES.KITKAT웹 페이지를 로드하는 동안 사용자 에이전트를 변경하면 WebView가 다시 로드를 시작하게 됩니다.
<WebView
ref={webviewRef}
incognito={true}
javaScriptCanOpenWindowsAutomatically
userAgent={googleAuthProxy}
style={flex}
originWhitelist={['*']}
onMessage={messageHandler}
onError={errorHandler}
source={{uri: params?.uri || ''}}
injectedJavaScript={params?.injectedJS}
onNavigationStateChange={params?.navigationStateChange}
javaScriptEnabled
/>
참고: https://github.com/react-native-webview/react-native-webview/pull/3106