리액트 네이티브 웹뷰를 사용하여 하이브리드 앱 서비스를 제작하고 있습니다. 처음 리액트 네이티브를 사용하여 웹뷰를 제작하고 있어 사소한 기능 하나도 찾아보면서 구현 중입니다.
웹뷰를 구현하는데 있어서 중요한 점은 아마도 'react-native와 웹뷰 사이를 어떻게 부드럽게 연결할 수 있는가' 같습니다. 그 대상이 사용자가 될 수도 있고, 개발자가 될 수도 있습니다.
분명 앱에 웹 사이트를 띄우긴 하지만 그것만으론 부족하며 앱의 기능들을 최소한으로 가져오되 앱으로서의 역할을 충분히 할 수 있을 때 하이브리드 앱이라고 할 수 있는 것 같습니다.
BackHandler : 하드웨어 뒤로 가기 버튼이나 Android 기기의 뒤로 가기 제스처에 대한 이벤트를 처리하는 컴포넌트
onNavigationStateChange : 네비게이션 상태가 변경될 때 호출되는 이벤트 핸들러
const WebViewcontainer = () => {
const webViewRef = useRef<WebView>(null);
const [navState, setNavState] = useState({
url: '',
canGoBack: false,
});
return (
<WebView
ref={webViewRef}
source={{uri: 'your url'}}
/>
);
};
interface navType {
url: string;
canGoBack: boolean;
}
const WebViewcontainer = () => {
const webViewRef = useRef<WebView>(null);
const [navState, setNavState] = useState({
url: '',
canGoBack: false,
});
return (
<WebView
ref={webViewRef}
source={{uri: 'your url'}}
onNavigationStateChange={(nav: navType) => {
setNavState({url: nav.url, canGoBack: nav.canGoBack});
}}
/>
);
};
import {Alert, BackHandler} from 'react-native';
function close() {
Alert.alert('종료하시겠어요?', '확인을 누르면 종료합니다.', [
{
text: '취소',
onPress: () => {},
style: 'cancel',
},
{text: '확인', onPress: () => BackHandler.exitApp()},
]);
}
export default close;
interface navType {
url: string;
canGoBack: boolean;
}
const WebViewcontainer = () => {
const webViewRef = useRef<WebView>(null);
const [navState, setNavState] = useState({
url: '',
canGoBack: false,
});
useEffect(() => {
const handleBackButton = () => {
if (navState.canGoBack) {
if (navState.url === 'your url') {
close();
} else {
webViewRef.current?.goBack();
}
} else {
close();
}
return true;
};
}, [navState]);
return (
<WebView
ref={webViewRef}
source={{uri: 'your url'}}
onNavigationStateChange={(nav: navType) => {
setNavState({url: nav.url, canGoBack: nav.canGoBack});
}}
/>
);
};
interface navType {
url: string;
canGoBack: boolean;
}
const WebViewcontainer = () => {
const webViewRef = useRef<WebView>(null);
const [navState, setNavState] = useState({
url: '',
canGoBack: false,
});
useEffect(() => {
const handleBackButton = () => {
if (navState.canGoBack) {
if (navState.url === 'your url') {
close();
} else {
webViewRef.current?.goBack();
}
} else {
close();
}
return true;
};
BackHandler.addEventListener('hardwareBackPress', handleBackButton);
return () => {
BackHandler.removeEventListener('hardwareBackPress', handleBackButton);
};
}, [navState]);
return (
<WebView
ref={webViewRef}
source={{uri: 'your url'}}
onNavigationStateChange={(nav: navType) => {
setNavState({url: nav.url, canGoBack: nav.canGoBack});
}}
/>
);
};
