# React Native WebView Guide This document walks you through the most common use cases for React Native WebView. It doesn't cover [the full API](Reference.md), but after reading it and looking at the sample code snippets you should have a good sense for how the WebView works and common patterns for using the WebView. _This guide is currently a work in progress._ ## Guide Index - [Basic Inline HTML](Guide.md#basic-inline-html) - [Basic URL Source](Guide.md#basic-url-source) ### Basic inline HTML The simplest way to use the WebView is to simply pipe in the HTML you want to display. Note that setting an `html` source requires the [originWhiteList](Reference.md#originWhiteList) property to be set to `['*']`. ```js import React, { Component } from 'react'; import { WebView } from 'react-native-webview'; class MyInlineWeb extends Component { render() { return ( This is a static HTML source!' }} /> ); } } ``` Passing a new static html source will cause the WebView to rerender. ### Basic URL Source This is the most common use-case for WebView. ```js import React, { Component } from 'react'; import { WebView } from 'react-native-webview'; class MyWeb extends Component { render() { return ( ); } } ``` ### Controlling navigation state changes Sometimes you want to intercept a user tapping on a link in your webview and do something different than navigating there in the webview. Here's some example code on how you might do that using the `onNavigationStateChange` function. ```js import React, { Component } from 'react'; import { WebView } from 'react-native-webview'; class MyWeb extends Component { webview = null; render() { return ( (this.webview = ref)} source={{uri: 'https://facebook.github.io/react-native/'}} onNavigationStateChange={this.handleWebViewNavigationStateChange} /> ); } handleWebViewNavigationStateChange = newNavState => { // newNavState looks something like this: // { // url?: string; // title?: string; // loading?: boolean; // canGoBack?: boolean; // canGoForward?: boolean; // } const { url } = newNavState; if (!url) return // handle certain doctypes if (url.includes('.pdf')) { this.webview.stopLoading(); // open a modal with the PDF viewer } // one way to handle a successful form submit is via query strings if (url.includes('?message=success')) { this.webview.stopLoading(); // maybe close this view? } // one way to handle errors is via query string if (url.includes('?errors=true')) { this.webview.stopLoading(); } // redirect somewhere else if (url.includes('google.com')) { const newURL = 'https://facebook.github.io/react-native/'; const redirectTo = 'window.location = "' + newURL + '"'; this.webview.injectJavaScript(redirectTo); } } } ``` ### Add support for File Upload ##### iOS For iOS, all you need to do is specify the permissions in your `ios/[project]/Info.plist` file: Photo capture: ``` NSCameraUsageDescription Take pictures for certain activities ``` Gallery selection: ``` NSPhotoLibraryUsageDescription Select pictures for certain activities ``` Video recording: ``` NSMicrophoneUsageDescription Need microphone access for recording videos ``` ##### Android Add permission in AndroidManifest.xml: ```xml ...... ...... ``` ##### Check for File Upload support, with `static isFileUploadSupported()` File Upload using `` is not supported for Android 4.4 KitKat (see [details](https://github.com/delight-im/Android-AdvancedWebView/issues/4#issuecomment-70372146)): ``` import { WebView } from "react-native-webview"; WebView.isFileUploadSupported().then(res => { if (res === true) { // file upload is supported } else { // not file upload support } }); ``` ### Add support for File Download ##### iOS For iOS, all you need to do is specify the permissions in your `ios/[project]/Info.plist` file: Save to gallery: ``` NSPhotoLibraryAddUsageDescription Save pictures for certain activities. ``` ##### Android Add permission in AndroidManifest.xml: ```xml ...... ...... ```